Virtual DOM更新时与上一个Virtual DOM比较。过程叫调和
This.forceUpdate 强制重新绘制。
父组件重新绘制时都会调用子组件的
componentWillReceiveProps
reducer中不能直接修改state再返回,因为纯函数不能有副作用。
This.props.children
context提供一个全局访问对象
React-redux
connect:连接容器组件和傻瓜组件
Provider:包含store的context
Connect:把store的state转换为内层傻瓜组件的prop
把傻瓜组件中的动作转化为派送给store的动作
存储重复。
父组件要和子组件数据保持一致。
prop多级传递问题。
Redux 原则“单向数据流”:
1、唯一数据源 。
2、保持状态只读。
3、谁改变只通过纯函数完成。
文件组织结构:
1、角色组织 比如mvc 按model、view、controller 来建立文件目录。 不利于拓展。每次添加新功能都要在多个目录下跳转,查找、修改。
2、功能组织 如登陆功能、查找功能 来创建文件目录。每个功能对应一个模块,只要关注一个模块就行。
模块接口能把一个目录看作一个模块,所以推介功能组织。
状态树设计:
1、一个模块控制一个状态节点。(一个reducer负责修改一个模块的数据)
2、避免冗余数据。 Reselector (可以使用过滤器过滤掉冗余数据)
3、树形结构扁平。树形节点太多的话都要先判断上个节点有没有。(-0----------------)
Ref直接操作DOM容易失控。
性能优化:
对实力数量是动态的组件,一点点的浪费时间会因为实例的增多而成很长时间。
react-redux的shouldComponentUpdate 会自动对数据进行浅层比较比对然后判断是否要渲染。
选择什么样的方式定义组件的接口,如何,如何定义state 到prop的转变,使用说明样的算法来对比Virtual DOM,这些决定对性能和架构的影响时巨大的。
跟节点不同会重新渲染。
Key的用法
Key可以知道新加入的节点,只渲染新的节点。然后调用原来的props来启动更新过程。可以避免无谓的更新。
Key的取值不能直接把数组中的下标直接拿来用。因为数组是会变的。也容易与其它数组重复。
提高数据获取性能(用过滤器过滤不要的数据)
范式化状态树。
高阶组件:
高阶组件就是一个接受一个组件输入的函数。然后返回以新的组件作为结果,而且返回的新组件具有输入组件所不具有的功能。
以函数为子组件
import React from ‘react’;
function removeUserProp(WrappedComponent ) {
return class WrappedComponent extends React.Component{
render(){
const {user , …otherProps}=this.props;
return <WrappedComponent {…otherProps} />
}
}
}
export default removeUserProp;
高阶组件是为了重用代码。
中间件是为了解决redux的异步问题。因为redux是同步的。
Fetch 不存在中断概念
多次请求事件(1、只使用获取的最新的数据,2、判断在发送请求)
异步操作的action :进行中、操作完成、操作失败。
动画的实现:
css3
ReactCSSTransitionroup. 用npm安装 react-addons-css-transiton-group
React-Motion
嵌套路由
分片打包:
不直接import
用到时再用require插入
中间件:
Dispatch 派发新的action对象
调用getState获取当前的Redux Store上的对象
调用next告诉Redux当前中间件工作完毕,让Redux调用下个中间件
访问action对象action上的所有数据。