文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JS监听变量改变如何实现

2023-07-06 04:18

关注

这篇文章主要介绍“JS监听变量改变如何实现”,在日常操作中,相信很多人在JS监听变量改变如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS监听变量改变如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

需求和背景

在业务中,由于项目采用微前端架构,需要通过A应用的某个值的变化对B应用中的DOM进行改变(如弹出一个Modal),第一个想到的可能是发布订阅模式,其实不如将问题缩小化,采用原生的能力去解决。

下面给出两种解决方案,同时也是尤大写Vue时的思路

Object.defineProperty

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象

——MDN

用法如下:

Object.defineProperty(obj, prop, option)

入参用法:

例子:

var obj = {   name: 'sorryhc' }var rocordName = 'sorryhc';Object.defineProperty(obj, 'name', {  enumerable: true,  configurable:true,  set: function(newVal) {      rocordName = newVal       console.log('set: ' + rocordName)  },  get: function() {      console.log('get: ' + rocordName)      return rocordName  }})obj.name = 'sorrycc' // set: sorryccconsole.log(obj.name) // get: sorrycc

对一个对象进行整体响应式监听:

// 监视对象function observe(obj) {  // 遍历对象,使用 get/set 重新定义对象的每个属性值   Object.keys(obj).forEach(key => {       defineReactive(obj, key, obj[key])   })}function defineReactive(obj, k, v) {   // 递归子属性   if (typeof(v) === 'object') observe(v)      // 重定义 get/set   Object.defineProperty(obj, k, {       enumerable: true,       configurable: true,       get: function reactiveGetter() {           console.log('get: ' + v)           return v       },       // 重新设置值时,触发收集器的通知机制       set: function reactiveSetter(newV) {           console.log('set: ' + newV)           v = newV       },   })}let data = {a: 1}// 监视对象observe(data)data.a // get: 1data.a = 2 // set: 2

整体思路就是遇到子对象就递归,和深拷贝一样的读参顺序。

缺陷

如果学习过Vue2源码的同学可能比较熟,基于下面的缺陷,也是出现了$set$get的用法。

Proxy

Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)

— MDN

const obj = new Proxy(target, handler)

其中:

例子

const handler = {  get: function(target, name){      return name in target ? target[name] : 'no prop!'  },  set: function(target, prop, value, receiver) {      target[prop] = value;      console.log('property set: ' + prop + ' = ' + value);      return true;  }};var user = new Proxy({}, handler)user.name = 'sorryhc' // property set: name = sorryhcconsole.log(user.name) // sorryhcconsole.log(user.age) // no prop!

并且Proxy提供了更丰富的代理能力:

感兴趣的可以查看 MDN ,一一尝试一下,这里不再赘述

在React中的实践

这里展示两段伪代码,大概业务流程是,当点击页面某个按钮(打开/关闭弹窗),触发window.obj.showModal的切换,从而被监听到全局变量的变化,从而改变React中的state状态,最终触发Modal的弹窗。

Object.defineProperty

window.obj = {  showModal: false}const [visible, setVisible] = useState(false);useEffect(() => {  visible && Modal.show({    // ...  })}, [visible])Object.defineProperty(window.obj, 'showModal', {  enumerable: true,  configurable:true,  set: function(newVal) {    setVisible(newVal);      console.log('set: ' + newVal)  },  get: function() {      console.log('get: ' + visible)      return visible  }})window.obj.showModal = !window.obj.showModal // set: trueconsole.log(window.obj.showModal) // get: true

Proxy

const [visible, setVisible] = useState(false);useEffect(() => {  visible && Modal.show({    // ...  })}, [visible])const handler = {  get: function(target, name){      return name in target ? target[name] : 'no prop!'  },  set: function(target, prop, value, receiver) {      target[prop] = value;      setVisible(value);      console.log('property set: ' + prop + ' = ' + value);      return true;  }};window.obj = new Proxy({showModal: false}, handler)window.obj.showModal = !window.obj.showModal // property set: showModal = trueconsole.log(window.obj.showModal) // true

到此,关于“JS监听变量改变如何实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯