问答

vue watch问题

作者:admin 2021-06-07 我要评论

请问一下,如下代码中当 changeData 执行后,未触发watch,是为什么?ps:使用注释的那段代码是能够监听到的。 export default { name: 'App', setup() { const ...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

请问一下,如下代码中当changeData执行后,未触发watch,是为什么?ps:使用注释的那段代码是能够监听到的。

export default {
  name: 'App',
  setup() {
    const stateRef = reactive<any>({
      data: {},
    });
    
    // const stateRef = reactive<any>({
    // data: {a:0},
    // });

    const changeData = () => {
      stateRef.data.a = Math.random();
    };

    watch(
      () => stateRef,
      () => {
        console.log(stateRef.data.a);
      },
      {
        deep: true,
      },
    );

    return {
      changeData,
    };
  },
}

下面方法也不行,是为什么呢?

export default {
  name: 'App',
  setup() {
    const stateRef = reactive<any>({
      data: {},
    });
    stateRef.data.a = 0; // 新增此行
    
    const changeData = () => {
      stateRef.data.a = Math.random();
    };

    watch(
      () => stateRef,
      () => {
        console.log(stateRef.data.a);
      },
      {
        deep: true,
      },
    );

    return {
      changeData,
    };
  },
}
###

经过一番搜索找到了答案,官方文档

1、实例化的时候,不存在的属性不是响应式的:
image.png

2、参考setup文档

从生命周期钩子的视角来看,setup 会在 beforeCreate 钩子之前被调用。

再查看beforeCreate文档

实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

因此,setup执行时,响应式属性已经确定,所以之后添加的属性不是响应式的。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • vue watch问题

    vue watch问题

  • node降级时从registry下载失败如何解决

    node降级时从registry下载失败如何解决

  • php meekro lib 的DB:query返回都会是

    php meekro lib 的DB:query返回都会是

  • setAttribute(name,value)语法中, val

    setAttribute(name,value)语法中, val

腾讯云代理商
海外云服务器