记录一下React基础相关的知识点。
ES6
Promise
1 | test = async () => { |
async
1 | async fetch() { |
React生命周期
初始化(无子组件):
1 | constructor->componentWillMount->render->componentDidMount |
初始化(有子组件):
1 | 父组件:constructor->componentWillMount->render |
state改变时(无子组件):
1 | shouldComponentUpdate->componentWillUpdate->render->componentDidUpdate |
state改变时(有子组件):
1 | 父组件:shouldComponentUpdate->componentWillUpdate->render |
离开页面时:
1 | componentWillUnmount |
如果父组件的state改变时,所有子组件或者子组件在render()中的prop值都会改变:
1 | 子组件render()方法:<MyTextArea defaultValue={this.props.test} /> |
如果将子组件的props值定义为state的话,则需要在componentWillReceiveProps设置state:
1 | constructor(props) { |
如何避免这些不必要的render:
使用shouldComponentUpdate()以让React知道当前状态或属性的改变是否不影响组件的输出,默认返回ture,返回false时不会重写render,而且该方法并不会在初始化渲染或当使用forceUpdate()时被调用,我们要做的只是这样:
1 | shouldComponentUpdate(nextProps, nextState) { |
react路由
Switch
1 | <Switch> |
Switch表示有多少Route时,只加载找到的第一条Route。 exact表示精确匹配。没有加exact模糊匹配。
子组件配置路由
1 | pages/home/index.js(第一次会加载这个页面): |
注意:
1 | /demo/index.js: |
react-route必须要在系统第一次加载路由。通过点击进来的页面如果配置的路由在第一次没有加载,就报错。/demo在第一次就载了,所以子组件配置/demo开头的路由可以。但如果子组的路由不是以/demo的就有问题。估计是react router的限制。
/demo必须要先定义在router.js中,各个组件中可以定义自己的路由,不过前提必须要是/demo开头才行。
所以home下的Index.js中的这行不能加exact,否则路由就加载不了。
/demo/list模糊匹配到了/demo,然后/demo中配置了子组件的路由,就能够成功加载。