“愚蠢”的useEffect
2023-02-18 16:43:13 时间
我有一个需求,需要监听一个window.xxx的变动,并在它变动的时候更新view。
useEffect
因为我使用的是react,所以我用 useEffect 监听
function Element() {
const [state, setState] = useState(window.xxx)
useEffect(() => {
console.log('set time:' + window.xxx)
setState(window.xxx)
}, [window.xxx])
return <div className="container">
useEffect {state}
</div>
}
此时,我发现我太年轻了,useEffect 无法区分是否变化。因为根据官网说,react只会在state更新时候,重新判断 useEffect 是否执行。如果没有state变化,useEffect 连执行的机会都没有。
defineProperty
如何完成,我的需求呢?我想到了 defineProperty。
事实证明,我是对的,只要用 defineProperty 拦截 变量 的赋值操作,就可以轻松监听变量。代码如下:
function Element() {
const [state, setState] = useState(window.xxx)
Object.defineProperty(window, 'xxx', {
configurable: true,
set: function (newVal) {
this._time = newVal
console.log('set time:' + this._time)
setState(this._time)
// 设置state
},
get: function () {
console.log('get time:' + this._time)
return this._time
}
})
return <div className="container">
useEffect {state}
</div>
}
相关文章
- 在SourceTree取消被忽略的文件
- 树莓派samba的配置和自动挂载USB储存设备
- 一个很无力的403错误
- 梅林固件迅雷远程开机自启设置
- 跑在raspberry上的docker
- 迅雷远程下载的服务脚本
- 智能图像水位识别监测系统
- Nexus6刷机教程
- docker的tag实验
- docker 批量删除名字为none的镜像
- 使用VirtualBox在后台运行镜像
- 6元RMB入手Surge的小弟Shadowrocket
- Docker打包优化
- docker使用笔记III -- docker的快速安装
- DAG任务调度系统 Taier 演进之道,探究DataSourceX 模块
- 小游戏赛道是如何变现的?
- 【技术分享】如何实现功能完备性能优异的RTMP、RTSP播放器?
- Science & Nature 双开花:改善过继性免疫细胞疗法的新手段 - MedChemExpress
- Eudic欧路词典 for Mac v4.2.9增强激活版
- Laravel 非常规教程之1 生命周期