React 中 , 要想修改 「状态」 => 必须要Proxy => 去改造 useState,那么 「摸鱼的时间」又增加啦 ?
proxy ,可以监听到;setState => 修改 setStateproxy ,让下一次 proxy 正常监听到;下面我们实例去看 👇
export default function Reactive(obj) {
const [value, setValue] = useState(setProxy(obj))
function setProxy(value) {
return new Proxy( value ,{
get:Reflect.get,
set(proxy,key,value,reciver){
setValue(proxy)
return Reflect.set(proxy,key,value,reciver)
}
})
}
return value
}
import useReactive from './proxyState'
export default function Index() {
const obj = useReactive({ num: 0 })
return (
<div>
<button onClick={()=>{ obj.num-- }} >减少</button>
<span> { obj.num } </span>
<button onClick={()=>{ obj.num++ }} >增加</button>
</div>
)
}
proxy 监听自动 setState ;import useReactive from './proxyState'
export default function Index() {
const [state, setState] = useState({ num:0 })
const state2 = useReactive({ num: 0 })
function add(){
setState(
{ num: state.num + 1 },
(res) => { console.log('当前最新的值为', res.num)
})
state2.num++
console.log('当前最新的值为', state2.num2)
}
// ...
}
useState 必须在 callback 回调函数里才能获取最新状态;setState 后面拿去 state 则还是之前的值;proxy 的 get 总是为最新,setState 的 callback 回调函数嵌套问题;proxy ,可能对资源消耗过大;