Appearance
memo
本节目标:理解“memo”的核心思路,并能把它用于实际开发或面试表达。
React.memo()是一个高阶函数,它与React.PureComponent类似,但是一个函数组件而非一个类;
memoization(memorization)方案
memoization(memorization)方案是一种将函数执行结果用变量缓存起来的方法- 当函数进行计算之前,先看缓存对象中是否有次计算结果,如果有,就直接从缓存对象中获取结果;如果没有,就进行计算,并将结果保存到缓存对象中;
优化
importReact,{ Component } from
"react";
importReactDOM from
"react-dom";
import{
Map,is } from
"immutable";
classPureComponent extends Component {isPureReactComponent =
true;shouldComponentUpdate(newProps,newState){return (
!shallowEqual(this.props,newProps) `);`
}
}
classApp extends Component {state = { title: '计数器
',counter:
Map({number: 0 }) };add = () =\> {
this.state.counter=
this.state.counter.set('number',this.state.counter.get('number')+
parseInt(this.amount.value) `);`
this.setState(this.state);};
render(){
console.log("Apprender"); `return` `(`
<div><Titletitle={this.props.title}/\>
<Countercounter={this.state.counter}/\>
<inputref={inst=\>
(this.amount=
inst)}/\>
<buttononClick={this.add}>+</button></div> `);`
}
}
functionmemo(Func){class Proxy extends PureComponent {
render(){return
<Func{...this.props}/\>}}return
Proxy;
}
constTitle =
memo(props=\> {
console.log('Titlerender');return
<p>{props.title}</p>;
});
classCounter extends PureComponent {
render(){
console.log("Counterrender"); `return`
<p>{this.props.counter.get('number')}</p>;}
}
ReactDOM.render(<App/>,document.getElementById("root"));
functionshallowEqual(obj1,obj2){if
(obj1===
obj2){return
true;}if (typeof obj1 != "object" ||obj1 === null || typeof obj2 != "object" ||obj2 ===
null){return
false;}let keys1 =
Object.keys(obj1);let keys2 =
Object.keys(obj2);if
(keys1.length!=
keys2.length){return
false;}for
(letkey of
keys1){if
(!obj2.hasOwnProperty(key)||
!is(obj1[key],obj2[key])){return
false; `}`
}return
true;
}