反应,异步加载具有不同组件的多个部分/视图
React, async loading for multiple sections/views with different components
我在考虑构建具有多个页面/视图(仍然是SAP(的React应用程序的最佳方法时遇到了问题。
假设我们有一个简单的应用程序,其中包含 4 个主要部分(页面(:仪表板、用户、统计信息、评论。每个部分都有不同的组件(想想反应组件(。例如,注释部分将具有如下所示的层次结构:
CommentsSection
- CommentsQueue
-- Comment
--- Text
--- Buttons
- CommentsApproved
--Comment
--- Text
--- Buttons
例如,在像 angular 这样的框架中,4 个主要部分将被分成多个部分,并根据要求加载到 ng 视图中,并在里面有各自的组件。登陆主页时,应用程序将仅加载仪表板视图,当用户单击导航项时,所选路线(即.app/users或app/users/:id(将触发,并且应用程序将加载所需的"模板视图部分"(无需刷新浏览器(。
现在就 React 而言,这将如何发生? 似乎所有视图及其所有组件都需要在浏览器化的 JS 文件中可用,然后应用程序可以更新 DOM。
这似乎非常错误,因为我们会在第一次加载中加载所有部分,即使用户不需要访问该部分。当然,我们可以将其与服务器上的路由分开,并且仅根据路由为页面提供组件,但这需要浏览器刷新,例如在 Angular 中,由于视图是异步加载的,因此无需浏览器刷新即可发生。
问题是,这种异步加载如何在基于 React 的应用程序中发生?
几种不同的方法可以解决这个问题,我将解释我目前用于我的工作和副项目的方法。
我们没有使用浏览器化,而是使用一个名为webpack
(https://github.com/webpack/webpack(的模块捆绑器。webpack的优点在于它类似于Browserify,但可以将您的应用程序拆分为多个"捆绑包"。这很棒,因为如果我们有多个组件/视图,用户只需下载该特定视图所需的功能,而无需最初下载所有内容。它允许按需下载反应组件及其依赖项。
Pete Hunt 写了一篇文章,深入探讨了 webpack 在与 React 一起使用时的好处(包括如何异步加载 react 组件(,以及它与 Browserify 和现代构建工具(如 Grunt/Gulp: https://github.com/petehunt/webpack-howto(的相似之处/不同
我在这里描述了一个使用 webpack 的解决方案: http://blog.netgusto.com/asynchronous-reactjs-component-loading-with-webpack/
基本上:
- 使用
require.ensure([], cbk)
定义代码块;在 CBK 中,使用require()
同步加载包
在主机组件中- ,在
componentWillMount()
中加载异步组件,并在主机组件状态下进行设置。
在 - 主机组件渲染中使用它,当在状态上定义时
- 谷歌地图没有显示在带有angularjs的第二个部分视图上
- 将多个事件动态添加到多个 Web 视图
- 创建从单个模板继承的多个动态视图
- 在多个网格视图/表上使用相同的函数
- 设计客户端以使用ajax更新多个局部视图
- AngularJs 使用一个指令提供多个模板视图
- AngularJS在第一个页面视图上没有加载
- 角度 UI 路由器为所有状态提供多个命名视图
- 通过单击相关选项卡渲染多个部分视图
- 反应,异步加载具有不同组件的多个部分/视图
- 添加多个分部视图,第一个缺少表单
- 在 Android 中使用多个 Web 视图来模拟 Javascript 线程
- 如何在同一场景中连接两个 Web 视图
- 两个不同视图上的两个按钮调用相同的函数 AngularJS
- 对控制器的两个不同视图中的任何元素使用相同的id
- 呈现多个EmberJS视图时断言失败
- AngularJS/UI路由器:如何使用一个具有多个命名视图的控制器
- 如何将Javascript代码的单独实例附加到N个角度视图
- 使用Jquery、MVC和Json更新多个部分视图不起作用
- 如何将多个网格视图行发送到另一个页面,并在中继器中填充这些行