资讯专栏INFORMATION COLUMN

和其他库(jquery,backbone)一起使用react

ckllj / 3348人阅读

摘要:也就是说,只要一发生事件。和其他的库共用由于方法的灵活性使得可以被嵌入到其他的应用中。事实上,这就是在被使用的方式。在应用中使用的层在组件中消费中和最简单的方法是监听各种事件并手动进行强制更新。并且使用组件来渲染各个项。

注:由于译者水平有限,难免会出现错误,希望大家能指出,谢谢。

react 可以被用在任何的web 应用中。它可以被嵌入到其他的应用中,要是你小心一点,其他的应用也能被嵌入到react中。这篇文章将会从一些常用的使用场景入手,重点会关注与jQuery 和backbone 的交互。但是里面的思想在我们和其他库交互时都是可以被参考的。

和操纵DOM的插件的交互

react 感知不到它管理之外的dom 的变化。react的更新是取决于其内部的表现,如果同样的DOM节点被其他可操作dom节点的插件更改了,react内部状态就会变的很混乱并且无法恢复了。

这并不意味着react 无法和那些操纵DOM 的插件一起共用,你只需要更加清楚每个插件做了什么。

最简单的避免这种冲突发生的方式是阻止react 组件的更新。你可以通过渲染一个react 没有必要去更新的元素,比如一个空的

如何处理这种问题

为了更好的阐述这个问题,让我们来对一个一般的jquery 插件添加一个wrapper。

首先,我们在这个节点上添加一个ref属性。在componentDidMount 方法里,我们通过获取这个节点的引用,将它传给jquery 插件。

为了避免react 在渲染期间对这个节点进行改变, 我们在render() 方法里面返回了一个空的

.这个空的节点没有任何的属性或子节点,所以React 不会对该节点进行更新,这个节点的控制权完全在jQuery插件上。这样就不会出现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} />; } }

需要注意的是,我们定义了componentDidMount() 和componentWillUnmount() 两个生命周期的钩子函数。这是因为大多数的jQuery插件都将事件监听绑定在DOM上,所以在componentWillUnmount 中一定要移除事件监听。如果这个插件没有提供移除的方法,那你就要自己写了。一定要记得移除插件所注册的事件,否则可能会出现内存泄露。

和jQuery 的选择器插件共用

为了对这些概念有更深入的了解,我们为Chosen 插件写了一个小型的wrapper。Chosen 插件的参数是一个 节点应用了该组件。它会读取原始DOM节点的属性,使用内联样式隐藏它。并且使用自己的展示方式在

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

需要注意的是,我们在标签后面添加一个传入的节点。然而,就React而言,

标签通常只有一个孩子节点。这就是我们如何确保React 的更新不会和通过Chosen 插入的额外的DOM节点冲突的原因。很重要的一点是,如果你在React 流之外修改了DOM节点,你必须确保React 不会因为任何原因再对这些DOM节点进行操作。

接下来,我们继续实现生命周期的钩子函数。我们需要在componentDidMount里使用 this.el = el}>

以上对于在render 里面获取你的组件就足够了,但是我们还希望值变化时能给实现通知。因为,我们通过Chosen 在中的属性this.props.children 的更新。但是我们同时也在componentDidUpdate 的生命周期函数里添加通知Chosen 他的children 列表变化的函数。

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

通过这种方式,当通过React 管理的 this.el = el}> {this.props.children}

); } } 和其他的View 库共用

由于ReactDOM.render()方法的灵活性使得React可以被嵌入到其他的应用中。

由于React 通常被用来将一个React 节点渲染到某个DOM元素中,而且ReactDOM.render()可以被UI的各个独立的部分多次调用,小到一个按钮,大到一个app。

事实上,这就是React 在Facebook 被使用的方式。这使得我们可以在React 中一块一块的开发一个应用,并且可以把它整合在现有的服务器渲染的模版中或者其他的客户端代码中。

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

在一些老的web 应用,一种常见的方式是写一大段DOM结构作为字符串,然后使用$el.html(htmlString) 的方式插入到DOM节点中。如果你的代码库中有类似的场景,那么推荐你使用react。你只需要将使用字符串渲染的部分改成react 组件就可以了。
下面是一个jQuery 的实现

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

改成react 的实现

function Button() {
  return ;
}

ReactDOM.render(
  

接下来,你可以将更多的业务逻辑移到react组件中去并且采用更多react 实践方式。例如,组件最好不要依赖id,因为同样的组件可能会被渲染多次。而且,我们推荐使用react 的事件系统,直接在组件; } function HelloButton() { function handleClick() { alert("Hello!"); } return

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88570.html

相关文章

  • 2017年前端流行的数百个javascript,你会几个?

    摘要:有数百个免费的库出来,为应用程序选择正确的框架变得非常困难。是流行的驱动技术之一,由于年创建。在这三个块中,有几个暴露低层接口的绑定。反应由,和许多开发人员和个人的社区维护。诞生于年,是一个轻量级的框架。 有数百个免费的JS库出来,为应用程序选择正确的JavaScript框架变得非常困难。一些开发商最终会抛弃,而其他开发者则迅速发展,并得到广泛采用。许多开发人员只知道像jQuery和R...

    CoXie 评论0 收藏0
  • 《高性能JavaScript》(读书笔记)

    摘要:加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。异步加载,和,浏览器不会失去响应它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。插件,可以让回调函数在页面结构加载完成后再运行。 这次主要是对《高性能JavaScript》一书的读书笔记,记录下自己之前没有注意到或者需要引起重视的地方 第一章 加载和执行 js代码在执行过程中会阻塞浏览...

    moven_j 评论0 收藏0
  • 前端MVC手脚架

    摘要:前端手脚架项目地址构建工具基础库这个项目类似,主要是用于记录,以及考察现在比较流行的前端库在实际开发当中的开发体验。其中,构建都是基于,支持语法但在中,只用到的模块管理与析构语法。 前端MVC手脚架 项目地址 https://github.com/lizzz0523/mvc-mode-seed 1.构建工具 [x] webpack [x] babel-loader [x] babel...

    pekonchan 评论0 收藏0
  • 基于 Backbone + node 的个人简历生成器(个人学习总结)

    摘要:应用的功能这个应用是一个个人简历生成器。比较好的教程有这一个。这样的命名污染问题自然显而易见。而且发出多次请求也会影响性能。明显不利于维护。然而我希望能够不发生变化,因为是在文件的前提下的标签页,不能换一个标签就重建一个。 为什么学习backbone?这是个好问题。在这个前端框架爆炸的年代,比起backbone,对开发来说有更多更好的选择,react,vue,angular等等。但这些...

    lansheng228 评论0 收藏0
  • 2017年前端框架、类、工具大比拼

    摘要:相比于开发人员的数量,目前框架类库和工具的数量似乎更多一些。本文将会讨论目前最为流行的客户端框架类库和工具以及它们之间的基本差异。典型的类库包括字符串处理日期元素事件动画网络请求等功能。所以不需要明确的区分类库框架和工具。 相比于JavaScript开发人员的数量,目前JavaScript框架、类库和工具的数量似乎更多一些。截至2017年5月,GitHub上的快速搜索显示,有超过110...

    Alliot 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<