原文:How to Sprinkle ReactJS into an Existing Web Applicationreact
译者:nzbinweb
当咱们学习一项新技术,多是一个 JavaScript 框架,也多是一个 CSS 方法,咱们将面对这样的挑战 如何在旧网站上运用这项新技术?
。不少教程讲述了如何从头开始,但却很难运用到实际工做中。app
在这篇教程中,我会经过一些很基本的例子讲解如何灵活运用 ReactJS,以及替换使用 jQuery 写的代码。框架
我最近的任务是用 React 重构一个使用 jQuery 写的功能。这个过程困难重重,由于大量的 jQuery 分散在代码段中。使用 jQuery 构建全部的 UI 是可能的(咱们已经这样作了不少年),可是在规模变大以后,将变得混乱且难以维护。dom
不管你使用 Angular, Ember, Vue, React, 或者只是 jQuery,你所作的事情和开发者多年来所作的事情是同样的:函数
渲染 HTML > 接收用户事件 > 从新渲染 HTML工具
由于 jQuery 很是依赖选择器好比 .classes
和 #IDs
去控制 DOM,因此大量的属性会使 HTML 变得容易混淆,而这些属性的目的只是方便 jQuery 查找。若是代码量比较小,这是没有问题的, 可是若是代码量庞大,就会很难知道哪些类用于 CSS,哪些类用于 JavaScript。若是你以前为了改变一个功能而在 HTML 模板或 JavaScript 中查找 find
一个 .class
或者 #ID
选择器,你应该明白我说的。布局
过渡依赖
.classes
和#IDs
的选择来操纵 HTML 并不轻松。学习
因此,若是你的代码是用 jQuery 或者其它框架所写,那么应该如何使用 React 去替换这些 UI 片断?网站
不管使用 jQuery 仍是下一个流行框架开发应用,大多数状况都是用一个根元素包裹 UI 片断。若是代码库使用 jQuery,一般会有一个元素充当 wrapper 选择器。使用 jQuery 选择 wrapper 元素,它被用于动态更新 DOM。
<!-- .MyAwesomeFeature acts as a container to select and manipulate child components with jQuery. --> <div class="MyAwesomeFeature"> <div class="MyAwesomeFeature__title"></div> <div class="MyAwesomeFeature__image"></div> </div> <script> var container = $(".MyAwesomeFeature"); $(".MyAwesomeFeature__title", container).text("Hello World!"); // Other DOM changes, event handlers, etc... </script>
能够看一下你的应用中的功能状态是独立 isolated
于 container 元素仍是在多个元素中共享 shared
。
独立状态 - 这种状态独立存在于 container 元素中。全部按钮、输入框等的交互状态都由这个 wrapper / container 元素分享。
我将用 jQuery 和 ReactJS 作的 4 个例子解释共享/独立状态的概念。
假设咱们有一个 web 应用,它展现了一个 emoji,当点击按钮,会随机展现一个新的 emoji。下面的代码是一个典型的 jQuery 应用,咱们选择父级元素 .mood-container
,而后动态改变内容。
如下是例子 的 HTML:
<!-- Demonstrates how jQuery can be used to use a container as a selector and update the content within. --> <div id="mood-container"> <div class="Mood"> <div class="Mood__emoji"></div> <div class="Mood__name">[ Emoji Placeholder ]</div> <button class="Mood__button">Random Mood</button> </div> </div>
See the Pen Isolated state with jQuery by Andrew Del Prete (@andrewdelprete) on CodePen.
这并非使用 jQuery 更改 DOM 的惟一策略,但很常见。
使用如 React 的库的好处之一就是能够将上面的 JavaScript 和 HTML 封装成一个组件 component
。它是一个更可靠、可维护、可重用的功能部件。
这在处理大型应用时很是有用,由于组件 component
的渲染和更新是同步的。我并非指将关注点与逻辑和视图层混合在一块儿,而是如何将 JavaScript 和 HTML 以组件 component
的形式组织代码。这是全部 JavaScript 框架的共同理念,所以被称为 Framework
。
全部框架一般都是:
App
中名为 #ID
的 div
)。如下是使用 React 整合后的新的 HTML:
<!-- Demonstrates how ReactJS mounts itself to a container and takes it from there. --> <div id="mood-container" />
See the Pen Isolated state with ReactJS by Andrew Del Prete (@andrewdelprete) on CodePen.
使用 jQuery 能够很容易实现,可是,若是一个区域动态影响另外一个单独使用选择器的区域时,可能会变得混乱。另外,当你使用 .classes
以及 #IDs
做为选择器手动控制 DOM 的时候,你要负责跟踪全部事情的开销。
See the Pen Shared state with jQuery by Andrew Del Prete (@andrewdelprete) on CodePen.
在这个例子中,咱们经过 .Mood__name
和 .Mood__button-name
选择器分享 mood name ,而且经过一个容器中的按钮去更新另外一个容器中的 emoji 。这还能够写的更简单一些,可是无论怎样,当尝试用 jQuery 选择器单独管理全部这些事情时,就会变得很糟糕。
在 ReactJS 中,一般有两个分享组件状态的方法:
这是使用 React 渲染比较常见的方式,尤为 SPA 应用或者 UI 片断。由于咱们但愿组件之间通讯,因此咱们将它们放置在父级组件中,而后向下传递属性来更新每一个子组件。这是 ReactJS 最基本的工做方式。
这种方式适用于多个 UI 组件被一个父组件包裹的状况。不少以前建立的应用可能不适合,可是能够根据 UI 布局状况选择使用。
See the Pen Shared state with ReactJS - Container by Andrew Del Prete (@andrewdelprete) on CodePen.
相似 Redux(flux 的另外一种实现)的库能够很容易的实现应用中不一样组件之间的通讯。能够将 actions 和状态属性挂载到组件,经过更新全局对象 Redux 来分享状态。
See the Pen Shared state with ReactJS - Redux by Andrew Del Prete (@andrewdelprete) on CodePen.
我但愿这篇文章可让你更好地了解须要关注的内容以及如何将 ReactJS 运用到现有的应用中。主要的解决方法就是,若是你使用 jQuery 处理 UI 片断,那么你能够将容器元素替换成一个 React 组件。若是你须要在多个组件中分享状态,那么你可使用容器方法或者相似 Redux 的库。
感谢阅读!
-Andrew Del Prete