浅谈JS监听非自定义属性

简介: 浅谈JS监听非自定义属性

如何监听

在我们开发项目中,如果有遇到需要监听某一个值变化后,做出一些特殊操作,正常的双向绑定数据都可以直接有API能够监听到变化,像Vue的watch , Angular的ngDoCheck 、ngOnChanges 、React的useEffect 等,但是如果我们项目中需要监听某个框架内部的值变化后,调用一些方法,如果上面方法都无法满足该怎么处理?

使用Vue2原理监听

 //记得在监听的时候,在上面再赋值一遍,防止set的时候为null
Object.defineProperty(dataParent, key, {
      get() {
        return value;
      },
      set(newVal) {
        const oldVal = value;
        value = newVal;
  //当监听值改变后执行操作
        watcher$.next({ newVal, oldVal });
      }
    });
//分割线
//下面使用了rxjs来通知值变化后执行操作,并停止监听后进行销毁
this.setOptions(this.props.options)
this.watchData(this.props, 'options', this.destroy$).subscribe(x => {
      this.setOptions(x.newVal);
});
watchData(dataParent: any, key: string, destroy$: Subject<void>) {
    const watcher$ = new Subject<{ newVal: any; oldVal: any }>();
    let value = dataParent[key];
    Object.defineProperty(dataParent, key, {
      get() {
        return value;
      },
      set(newVal) {
        const oldVal = value;
        value = newVal;
  //当监听值改变后执行操作
        watcher$.next({ newVal, oldVal });
      }
    });
    return watcher$.pipe(takeUntil(destroy$));
  }
相关文章
|
2月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
2月前
|
监控 JavaScript 前端开发
确定使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript
【10月更文挑战第24天】选择使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript 是一个需要综合考虑多个因素的决策。需要根据脚本之间的依赖关系、页面加载性能要求、脚本的功能和重要性等因素来进行权衡。在实际应用中,需要通过测试和验证来确定最适合的加载方式,以提供更好的用户体验和页面性能。
|
4月前
|
JavaScript
在 Vue.js 中使用 watch 来监听对象属性的变化
在 Vue.js 中使用 watch 来监听对象属性的变化
|
2月前
|
监控 JavaScript 前端开发
使用 `defer` 属性异步加载 JavaScript
【10月更文挑战第24天】使用 `defer` 属性异步加载 JavaScript 是一种有效的提高页面性能和用户体验的方法。通过合理设置 `defer` 属性,可以在不影响页面渲染的情况下异步加载脚本,并确保脚本的执行顺序。在实际应用中,需要根据具体情况选择合适的加载方式,并注意处理可能出现的问题,以确保页面能够正常加载和执行。
|
3月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
103 4
|
3月前
|
缓存 JavaScript 前端开发
探索Vue.js中的计算属性与侦听器
【10月更文挑战第5天】探索Vue.js中的计算属性与侦听器
38 1
|
3月前
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
214 0
|
3月前
|
存储 JavaScript 前端开发
js中map属性
js中map属性
30 0
|
3月前
|
缓存 JavaScript 前端开发
深入理解Vue.js中的计算属性与侦听属性
【10月更文挑战第5天】深入理解Vue.js中的计算属性与侦听属性
47 0
|
3月前
|
缓存 JavaScript 前端开发
探索Vue.js中的计算属性与侦听器:深入理解与实践
【10月更文挑战第5天】探索Vue.js中的计算属性与侦听器:深入理解与实践
35 0