11. 函数式组件 与 hook
This commit is contained in:
parent
a00d0611de
commit
ca7699cd5d
@ -1,5 +1,6 @@
|
|||||||
import React, {useEffect, useState} from "react";
|
import React, {useCallback, useContext, useEffect, useMemo, useRef, useState} from "react";
|
||||||
|
|
||||||
|
export let ContextParent = React.createContext({})
|
||||||
|
|
||||||
// 函数式组件
|
// 函数式组件
|
||||||
// 1. 没有生命周期
|
// 1. 没有生命周期
|
||||||
@ -28,7 +29,17 @@ export default function SonComponent2(props= {
|
|||||||
count: 0,
|
count: 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 类似 vue computed, 缓存运算结果
|
||||||
|
// 如果依赖项更新, 则重新计算
|
||||||
|
// 组件初始化时 不会 执行
|
||||||
|
let countMemo = useMemo(() => {
|
||||||
|
console.log("state.count", state.count)
|
||||||
|
return state.count
|
||||||
|
}, [state.count]);
|
||||||
|
|
||||||
// 模拟 componentDidUpdate
|
// 模拟 componentDidUpdate
|
||||||
|
// 类似 vue 的 watch
|
||||||
|
// 组件初始化时 就会 执行
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// 当count更新时执行的操作
|
// 当count更新时执行的操作
|
||||||
console.log('SonComponent2 组件后更新,执行的操作:', state);
|
console.log('SonComponent2 组件后更新,执行的操作:', state);
|
||||||
@ -42,16 +53,23 @@ export default function SonComponent2(props= {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function revokeChangeMsg(){
|
// 缓存函数
|
||||||
|
// 用于优化, 避免更新时重复创建
|
||||||
|
const revokeChangeMsg = useCallback(() => {
|
||||||
let count = state.count
|
let count = state.count
|
||||||
setState({
|
setState({
|
||||||
...state,
|
...state,
|
||||||
count: count > 0 ? --count : 0,
|
count: count > 0 ? --count : 0,
|
||||||
tmp: props.changeMsg(state.tmp)
|
tmp: props.changeMsg(state.tmp)
|
||||||
})
|
})
|
||||||
}
|
}, [props, state]);
|
||||||
|
|
||||||
|
|
||||||
|
let ref = useRef()
|
||||||
|
useEffect(() => {
|
||||||
|
console.log("SonComponent2 ref", ref, ref.current)
|
||||||
|
}, []);
|
||||||
|
|
||||||
return <div style={{border: '1px solid', width: '80%', overflow: 'auto'}}>
|
return <div style={{border: '1px solid', width: '80%', overflow: 'auto'}}>
|
||||||
子组件2
|
子组件2
|
||||||
|
|
||||||
@ -62,15 +80,25 @@ export default function SonComponent2(props= {
|
|||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
|
<ContextParent.Provider value={{changeText: "修改msg", revokeText: "修改msg"}}>
|
||||||
<div>
|
<div>
|
||||||
{props.msg}
|
{props.msg}
|
||||||
|
<div>count: {countMemo}</div>
|
||||||
<div>
|
<Consumer ref={ref} changeMsg={changeMsg} revokeChangeMsg={revokeChangeMsg}/>
|
||||||
<button onClick={changeMsg}>修改msg</button>
|
|
||||||
<button onClick={revokeChangeMsg}>撤销操作</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</ContextParent.Provider>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function Consumer(props){
|
||||||
|
let contextValue = useContext(ContextParent)
|
||||||
|
console.log("SonComponent2 Consumer contextValue", contextValue)
|
||||||
|
|
||||||
|
return <div>
|
||||||
|
<button ref={props.ref} onClick={props.changeMsg}>{contextValue.changeText}</button>
|
||||||
|
<button onClick={props.revokeChangeMsg}>{contextValue.revokeText}</button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user