React 性能调优总结
React 性能调优总结首先要说一个库:? 因为多数情况下我们在React组件当中是不会去写 下面讲一下基本的一些手段 shouldComponentUpdate在React当中,每一次的 PureComponent当然我们在实际开发过程当中,由于数据的复杂程度来说,基本是不会去写
根据React源码,如果组件是纯组件(Pure Component),那么一下比较是很容易理解的: if (this._compositeType === CompositeTypes.PureClass) { shouldUpdate = !shallowEqual(prevProps,nextProps) || ! shallowEqual(inst.state,nextState); }
为什么说是浅比较呢?这个很好理解,js的引用数据类型就很好的说明了这一点: {} === {} //false [] === [] //false
当然,你也可以在 shouldComponentUpdate(nextProps,nextState) {
return nextProps.user.id === props.user.id; }
如果是在PureComponent当中写了这个钩子,那么它就会被优先执行。 当然,在数据结构和嵌套比较深的情况下,这个方案也就不太管用了,所以,我们在前期定义数据结构时也是一个很重要的环节,可以去避免不必要的渲染。 Immutable or ImmerFacebook在2014年就推出了这个库:?Immutable.js,用来使数据持久化。在数据创建后,就不得去改变,任何的增删改操作都是true一个新的 import { Map } from "immutable"; const map1 = Map({ a: { aa: 1 },b: 2,c: 3 }); const map2 = map1.set(‘b‘,50); map1 !== map2; // true map1.get(‘b‘); // 2 map2.get(‘b‘); // 50 map1.get(‘a‘) === map2.get(‘a‘); // true
import produce from "immer" /** * Classic React.setState with a deep merge */ onBirthDayClick1 = () => { this.setState(prevState => ({ user: { ...prevState.user,age: prevState.user.age + 1 } })) } /** * ...But,since setState accepts functions,* we can just create a curried producer and further simplify! */ onBirthDayClick2 = () => { this.setState( produce(draft => { draft.user.age += 1 }) ) }
代码上的优化少用bind每次bind都会返回一个新函数,重复创建静态函数会浪费性能。最好直接使用箭头函数绑定或者利用闭包直接把处理函数传入子组件 setState优化在我们去setState时,最好用新值去覆盖旧值,而不是修改原值。 对于数组,我们采用es6的spread语法: this.setState(prevState => ({ words: [...prevState.words,‘marklar‘],}));
对于对象,我们采用Object.assign或spread: this.setState({ a: Object.assign({},this.state.a,{b: ‘2222‘}) }) //或者 this.setState({ a: {...this.state.a,{b: ‘222‘}} })
不要在PureComponent组件的props使用直接赋值的方式style={ { width: ‘100px‘ } } 这样的做法传入组件会造成重复渲染 这样的方式会使 正确的方式: const YourStyle = { width: ‘100px‘ } return ( <YourComponent style={YourStyle}></YourComponent> )
或者我们直接就用上面说到的Immutable.js 或者 Immer.js 来处理 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |