React 相关
在 react 中借助 proxy 实现 Vue3 的 reactive
import React,{ useState } from 'react'
//proxy是代理一个对象,做对象的属性劫持
function UseReactive(initialState){
const [ state,setState ] = useState(initialState)
//借助副作用
useEffect(() => {
//proxy handler
const handler = {
get(target,property){
return target[property]
},
set(target,property,value){
setState({...target})
return true
}
}
initialState = new Proxy(initialState,handler)
},[])
}
function App(){
const state = UseReactive({count:1})
state.count += 1
}
- 拓展:模拟 Vue3 中组件的状态
<html>
<div id="app">{{count}}</div>
<button id="btn">click</button>
</html>
<body><script>
const data = { count:0 }
//将这个状态变成响应式,Vue2中是通过 Object.defineProperty,Vue3是Proxy
const reactiveData = new Proxy(data,{
set(target,property,value){
target[property] = value
updateView()
//updateView等价于 Vue 的 new Vue({data:{count:0}}).$mount('#app')
//这是比较笨的方法,因为在属性中操作,Vue源码用收集依赖代替了这一步🚩
return true
},
get(target,property){
return target[property]
}
})
//更新视图
const updateView = () => {
document.querySelector("#app").innerHTML = reactiveData.count
}
//使用
const btnDom = document.querySelector("#btn")
btnDom.addEventListener("click",()=>{
reactiveData.count ++
})
</script></body>
useSyncExternaStore 将 react 和 redux 状态联系
useSyncExternaStore 是一个让你订阅外部 store 的 React Hook.
除了 proxy, useSyncExternaStore也可以实现上述问题。