Vue 观察者在 data() 更改中触发
P粉144705065
P粉144705065 2024-03-26 09:06:45
0
1
441

<script>
export default {
  name: "DriversStandings",

  data() {
    return {
      standingsData: [],
    };
  },

  props: ["drivers", "isUpdated"],

  watch: {
    drivers: {
      deep: true,
      handler: function () {
        this.test();
      },
    },
  },

  methods:{
    test(){
      console.log("chamou o teste")
      this.standingsData = this.drivers
    }
  }
};
</script>

我有点疯狂了。观察者不应该只观察“司机”道具吗?当我编辑“standsData”时,它也会以某种方式触发,使我无法对其进行排序。我错过了什么吗?

P粉144705065
P粉144705065

全部回复(1)
P粉662802882

这可能取决于您对数组的排序方式,但由于您分配了 this.standsData = this.drivers ,因此对 this.standsData 的任何变异更改也会变异 this.drivers 下的数据,因为它们引用同一个数组。您可能想要复制驱动程序数组以放入组件状态,如下所示:

  methods: {
    test() {
      console.log("chamou o teste")
      this.standingsData = [...this.drivers];
    }
  }

请记住,在 this.standsData 中深度修改其他数据也会出现类似的问题,因为您在观察器上指定 deep: true ;如果您必须这样做,则在将 this.drivers 移动到 this.standsData 时,您需要深度复制数据。这可以使用自定义代码或 lodash.cloneDeep 等工具来完成。

这里的另一个怪癖是,默认情况下,Vue 观察者不会在组件初始化时触发。如果您希望在 drivers 属性在组件初始化期间初始设置时发生变化时触发它,则需要将 immediate: true 添加到观察程序(文档 此处)。

  watch: {
    drivers: {
      deep: true,
      immediate: true,
      handler: function () {
        this.test();
      },
    },
  },
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板