不使用context通信,传递setState通过props,memo包括进行浅比较前后props相同,两个子组件不会点击引起对方刷新:
const Count=memo((props)=>{
console.log('count')
const {count,setState}=props
//const {setState}=useContext(MyContext)
const fn=()=>{
setState(v=>{return {...v,count:count+1}})
}
return <p onClick={fn}>{count}</p>
})
const Num=memo((props)=>{
console.log('num')
const {num,setState}=props
//const {setState}=useContext(MyContext)
const fn=()=>{
setState(v=>{return {...v,num:num+1}})
}
return <p onClick={fn}>{num}</p>
})
const App=()=>{
const [state,setState]=useState({count:0,num:1})
return <div>
<Count count={state.count} setState={setState}/>
<Num num={state.num} setState={setState}/>
</div>
}
const app = document.getElementById("app");
ReactDOM.render(<App/>, app)
使用context通信,传递setState,点击fn都会引起对方刷新,这样该怎样传递才能避免不必要刷新,子组件是什么前后改变了造成刷新:
const MyContext=createContext()
const MyProvider=MyContext.Provider
const Count=memo((props)=>{
console.log('count')
const {count}=props
const {setState}=useContext(MyContext)
const fn=()=>{
setState(v=>{return {...v,count:count+1}})
}
return <p onClick={fn}>{count}</p>
})
const Num=memo((props)=>{
console.log('num')
const {num}=props
const {setState}=useContext(MyContext)
const fn=()=>{
setState(v=>{return {...v,num:num+1}})
}
return <p onClick={fn}>{num}</p>
})
const App=()=>{
const [state,setState]=useState({count:0,num:1})
return <MyProvider value={{setState}}>
<Count count={state.count}/>
<Num num={state.num}/>
</MyProvider>
}
const app = document.getElementById("app");
ReactDOM.render(<App/>, app)
是要用observerbits来进行比较,参考https://medium.com/@koba04/a-...