react 组件架构
容器型组件(container component)
- 含有抽象数据而没有业务逻辑的组件
- 负责管理数据和业务逻辑,不负责 UI 的呈现
- 带有内部状态
展示型组件(presentational component)
- 只负责 UI 的呈现
- 没有状态(即不使用
this.state这个变量),一般可以写成无状态组件,但也可以不是,展示型组件也可以拥有自己的生命周期 - 所有数据都由参数(
this.props)提供
把网络请求 + 列表展示的组件拆分成以上的容器型组件 + 展示型组件:
在容器组件中访问网络,有结果之后执行setState,在render中使用展示型组件,网络请求来的列表通过propos传递给展示型组件。
展示型组件中仅仅获取propos来展示数据,而没有state(无状态组件,所以展示型组件可以用function来创建)
以上完成了组件的初步拆分。但是可能有多个组件中都有异步请求,所以必须把异步请求从组件中独立抽取出来,在容器组件上多抽出来一层专门处理异步请求的网络组件。
这个网络组件或称为高阶组件,用于增强组件。实现过程:采用属性劫持。一个函数接收一个组件A,返回另一个组件B。B的props接收一个promise,didMount中对这个promise进行回调注册(ps:这里可能需要看一下下面的promise解释),有结果后进行setState,render中调用A,props传入网络数据,到了A中直接获取数据展示即可。
总结以上过程:
第一次抽取:把组件中的网络请求与展示逻辑拆分,分为container和list组件
第二次和第一次类似,继续对container进行网络请求和容器的拆分,分为netWrapper和container组件。到这一步container可以从propos中获取网络数据,也可以拥有自己的state,而list和container的关系可以认识,list把自己的状态都交给了container来管理,list仅仅用于展示,这里有点类似于controller view 模式。
补充以上的promise解释:
对于一个状态已经变化完毕的promise,后续任何时候对这个promise进行函数注册,都会马上被执行,而且可以多次执行,下面代码输出两个ok
var p = new Promise(function(resolve,reject){
resolve("ok")
});
setTimeout(function(){
p.then(function (data) {
console.log(data)
});
},100);
setTimeout(function(){
p.then(function (data) {
console.log(data)
});
},1000);
react 组件架构的更多相关文章
- React 组件开发初探
react.js 在线地址:http://slides.com/yueyao/deck/#/ COMPONENT JSX 预编译语言, 一个基于ECMAscript 的xml-link 的语法扩展,最 ...
- React组件开发入门
React 组件开发入门 Introduction 本文组成: Ryan Clark文章Getting started with React的翻译. 博主的实践心得. React由Facebook的程 ...
- React 组件间通讯
React 组件间通讯 说 React 组件间通讯之前,我们先来讨论一下 React 组件究竟有多少种层级间的关系.假设我们开发的项目是一个纯 React 的项目,那我们项目应该有如下类似的关系: 父 ...
- React组件设计
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- React组件设计(转)
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- 设计 react 组件
重新设计 React 组件库 诚身 7 个月前 在 react + redux 已经成为大部分前端项目底层架构的今天, 让我们再次回到软件工程界一个永恒问题的探讨上来, 那就是如何提升一个开发团队 ...
- React组件设计技巧
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- React 组件性能优化探索实践
转自:http://www.tuicool.com/articles/Ar6Zruq React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效. ...
- webpack 打包一个简单react组件
安装Webpack,并加载一个简单的React组件 全局的npm模块安装: npm install -g webpack 安装jsx-loader npm install --save-dev jsx ...
随机推荐
- MVC3+jquery Uploadify 上传文件
最近做项目用到了上传图片的功能,以前也写过这类代码,不过都是用传统的file标签,今天整理一个好用的插件Uploadify..都做了一些注释,一看便知. 可以去官网下载最新的:Uploadify下载地 ...
- 转 java ClassLoader
http://blog.csdn.net/xyang81/article/details/7292380 http://www.ibm.com/developerworks/cn/java/j-lo- ...
- 在Ubuntu14.04 64位上安装Clion
1.下载Clion 1.1 下载Linux版Clion的.tar.gz的压缩包 Clion 2017.3.1 下载安装:https://www.jetbrains.com/clion/download ...
- O(nlogn)求逆序数对的个数
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- pycharm 虚拟环境virtualenv迁移到别的机器 无法读取包的问题
将virtualenv迁移到别的机器时,发现pycharm 总是无法读取目录下所在的包,后来经过实验终于找到了问题所在: 将自己所建的虚拟环境目录下的orig-prefix.txt中保存的路径,改成新 ...
- slf4j介绍以及与Log4j、Log4j2、LogBack整合方法
翻了一下百度和官网.这么介绍slf4j. slf4j 全称 Simple Logging Facade for Java,是日志框架的一种抽象,那么也就是说 slf4j 是不能单独使用的必须要有其他实 ...
- git 设置了ssh key 还是需要输入账户和密码
参考这篇文章https://blog.csdn.net/shahuhu000/article/details/86625987 git remote remove origingit remote a ...
- Linux远程连接及常用指令
一.远程连接 一般,服务器都是特别庞大的,会把它们用一个独立的小屋进行存放,如果有时候需要对服务器进行一些操作,离得近还好,离的远就会破费一些周折了,所以,这个时候我们就需要用到远程连接软件了.推荐使 ...
- HDU 1561 The more, The Better (树形DP,常规)
题意:给一个森林,n个节点,每个点有点权,问若从中刚好选择m个点(选择某点之前必须先选择了其父亲),使得这m个点权之和最大为多少? 思路: 比较常规.就是DFS一次,枚举在子树中可能选择的k个点(注意 ...
- codevs 1742 爬楼梯(水题日常)
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小明家外面有一个长长的楼梯,共N阶.小明的腿很长,一次能跨过一或两阶.有一天,他 ...