vue3中的options方式 和 composition方式,效果不一样?!

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png" />
    {{ asd }}
    {{ zxc }}
    <button @click="test">test</button>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from "vue";

export default defineComponent({
  // setup() {
  //   let asd = ref(1);
  //   let zxc = "x";
  //   function test() {
  //     asd.value = 2;
  //     zxc = "y";
  //   }
  //   return {
  //     asd,
  //     zxc,
  //     test,
  //   };
  // },
  data() {
    return {
      asd: 1,
    };
  },
  methods: {
    test() {
      this.asd = 2;
      this.zxc = "y";
    },
  },
  created() {
    this.zxc = "x";
  },
});
</script>

这段代码里,setup的方案,在页面点击test,zxc的变量不会更新,但是用下面的代码,options的方式就可以更新掉,有没有大神给解释一下为什么呢这是?

问题补充:当options模式test方法中那个响应式的asd如果只是掉的话,这个zxc是不会更新的,感觉像是这个zxc之所以更新,是在响应式的变量触发dom diff更新的时候发现zxc变量有变化顺带更新了,只是猜测,,,,,但是setup就不会,是为什么呢?

阅读 1.9k
2 个回答

zxc 不是响应式的,实际上值变化了,但不会触发页面更新,加个 ref 即可

补充,可能是页面数据刷新机制导致的

  methods: {
    test() {
      // this.asd = 2 + Math.random();
      this.zxc = "y" + Math.random();
      console.log(this.zxc);
    },
  },

尝试注释对响应式变量的赋值,zxc 的值不会改变

data 函数返回的对象 会被 Vue 转换成响应式对象 而setup 里面 zxc 并不会被自动转换

二改:
setup 返回的对象会被 代理到this 上面去 , zxc 因为是一个 基础类型 被直接赋值给 this了。 后续在setup外面操作的zxc跟setup里面的zxc已经没关系了。 如果是个对象因为引用的问题还能改到

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题