udpate #2: 这不是错误,这是我自己的错。我通过 BaseComponent 方法扩展了 extend() 并将 extends: BaseComponent 放入选项中。我以为我需要两者,但选项中的 extends: BaseComponent 似乎就足够了。
因此,双重“扩展”显然重复了观察者,这导致了我在问题中记录的奇怪行为。

更新: 我发现了导致此问题的原因:观察者似乎是重复的,因为它位于 BaseComponent 中,该代码由我的示例中使用的 Component 扩展。
所以 export default BaseComponent.extend({ name: 'Component', ...}) 似乎复制了 watch 对象,而不是“合并”它 - 现在在 BaseComponent (它最初实现的地方)中有一个,在 Component 中有一个 - 当然两者都对 Prop 更新使用react。
恕我直言,这似乎是一个错误。

vue-cli 与单个文件组件一起使用。
我通过一种方法在一个组件中设置了一个 Prop :

<template>
  <div>
    <other-component :my-object="myObject" />
  </div>
</template>

<script>
  export default (Vue as VueConstructor).extend({
    data() {
      return {
        myObject: null
      }
    },

    methods: {
      actionButtonClicked(action, ID) {
        console.log('actionButtonClicked');

        this.myObject = {
          action: action,
          ID: ID
        }
      }
    }
  });
</script>

然后我正在使用观察者观察另一个组件中的 Prop - 但是每次执行该方法时 watch 都会被调用两次。
<script>

  export default (Vue as VueConstructor<Vue>).extend({
    /* ... */
    props: {
      myObject: {
      type: Object,
      default: null
    },

    watch: {
      'myObject.ID'(value, oldValue) {
        console.log('watcher executed');
      }
    }

    /* ... */
  });

</script>

所以在控制台中我得到输出:
actionButtonClicked
watcher executed
watcher executed

.. 每次调用该方法时。

我已经尝试了所有不同的观察者变体 - 例如使用 deep: true + handler 。但这一切都没有改变观察者被调用两次的任何事情。

最佳答案

就我而言,我在组件中有“ watch ”并在页面上使用该组件两次,因此“ watch ”被注册了两次。

希望它会帮助有同样问题的人。

关于javascript - Vue watch 意外调用两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56260785/

10-13 06:36