React高级指引:与第三方库协同

上一节:高阶组件
下一节:深入JSX

React高级指引:与第三方库协同

  • 引言
    • 集成带有DOM操作的插件
    • 如何解决这个问题
    • 集成jQuery Chosen插件
  • 与其他视图库整合
    • 使用React替换基于字符串的渲染
    • 把React嵌入到Backbone视图
  • 和Model层集成
    • 在React组件中使用Backbone的Model
    • 从Backbone的Model中提取数据

引言

React可以在任何web应用中使用。它可以与其他应用相互嵌套。本章将会介绍一些常用的嵌套的例子,主要侧重于jQuery和Backbone。但是使用这些的思想同样可以应用到其他整合案例中。

集成带有DOM操作的插件

React无法感知到在React之外DOM改变。它根据内部虚拟DOM的改变来更新,但是如果DOM节点被第三方库更改了,那么React就会感到困惑并且没有办法恢复。

但这并不意味着将React和其他可以改变DOM节点的方式结合很难或者不可能,你只需要注意他们各自做了什么就可以了。

避免冲突最简单的方法就是阻止React组件更新。你可以渲染一个无需渲染的元素,比如空的

如何解决这个问题

为了展示这个,我们来编写一个用于常用jQuery插件的wrapper。

我们将会将一个ref绑定在根DOM元素。在componentDidMount方法中,我们将会获取到它的引用,这样我们就可以把它传递给jQuery插件了。

为了防止React在DOM挂载之后触碰它,我们将会在render方法中返回一个空

。这个
元素没有任何属性或者子元素,所以React无法更新它,这样jQuery插件就可以自由地管理这个DOM元素了:

class SomePlugin extends React.Component {
  componentDidMount() {
    this.$el = $(this.el);
    this.$el.somePlugin();
  }

  componentWillUnmount() {
    this.$el.somePlugin('destroy');
  }

  render() {
    return 
this.el = el} />; } }

应该注意到了我们在这里声明了componentDidMountcomponentWillUnmount两个生命周期函数。许多jQuery插件都在DOM元素上绑定了事件监听器,所以在componentWillUnmount函数中为其解绑是很重要的。如果插件没有提供解绑的方法,那么你据需要自行编写一个方法来清除所有的监听器了。请记得移除所有插件注册的事件监听器以免内存泄漏。

集成jQuery Chosen插件

为了给这些概念一个更具体的例子,我们来为Chosen插件编写一个简略的wrapper,它能需要输入一个DOM节点上调用了它,那么它会获取原始DOM节点上的属性并且用一个内联样式隐藏它。之后在元素的

class Chosen extends React.Component {
  render() {
    return (
      
); } }

注意在这里我们将元素后面添加其他DOM元素。然而,就React而言,

只有一个子元素。这也是我们为什么能确定React的更新机制不会与Chosen添加的额外DOM节点冲突的原因。如果你在React数据流之外修改DOM节点,那么你必须确保React不会去更新这些DOM节点。

接下来,我们将会实现生命周期方法。我们需要在componentDidMount方法中初始化赋予 this.el = el}>

现在我们所作的已经能够让我们的组件被渲染了,但是我们还需要实时感知到值的修改。为了实现这个,我们需要订阅由Chosen管理的在中的this.props.children的更新,同时我们也会在componentDidUpdate() 生命周期方法中通知Chosen关于子元素列表的改变:

componentDidUpdate(prevProps) {
  if (prevProps.children !== this.props.children) {
    this.$el.trigger("chosen:updated");
  }
}

这样,当React管理的 this.el = el}> {this.props.children}

); } }

与其他视图库整合

由于React.render()的自由性,React可以在其他应用中嵌套使用。

尽管React通常被用作在启动时在DOM中加载单一的根组件,但是React.render()也可以在各自独立的UI中多次调用,比如一个按钮或者一整个应用。

事实上,这也是Facebook中使用React的方式。这让我们在应用中一小块一小块地使用React,并和已有的服务端生成的模板和其他客户端代码结合。

使用React替换基于字符串的渲染

在老的web应用中一个常用的模式是将DOM语块作为字符串处理并将它插入到DOM节点中,例如$el.html(htmlString)。代码库中的这些例子非常适合引入React。只需要将基于字符串的渲染重写成React组件即可。

让我们来看下面通过jQuery实现的代码:

$('#container').html('');
$('#btn').click(function() {
  alert('Hello!');
});

它可以被转化成React组件:

function Button() {
  return ;
}

ReactDOM.render(
  

从这里开始,你可以把更多的逻辑代码编写到组件中并且开始应用更多的React实践。比如,在组件中最好不要使用ID,因为同一个组件可能会被渲染多次。对应地,我们将会使用React事件处理系统并且直接在React元素; } function HelloButton() { function handleClick() { alert('Hello!'); } return

你可能感兴趣的:(JavaScript,前端,react)