udpate #2:这不是虫子,是我自己的错.我用extend()方法扩展了BaseComponent,并在选项中加入了extends: BaseComponent.我以为两者都需要,但extends: BaseComponent个选项似乎就足够了

update:我发现了这个问题的原因:观察者似乎是重复的,因为它在BaseComponent中,由我的例子中使用的Component扩展.


使用vue-cli和单文件组件

<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>

然后我用一个观察者观察另一个组件中的props ——但是每次执行该方法时,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

…每次调用该方法时.

我已经try 过所有不同的观察者——例如deep: true+handler.但这一切并没有改变观察者被呼叫两次的情况.

推荐答案

我的观察者被复制了,因为我用两种方式扩展了我的BaseComponent:

  • 通过组件本身的extend()方法
  • 在"外部"组件的选项中输入extends: BaseComponent

我认为您需要使用这两段代码来扩展另一个组件,但显然这是错误的,可能会导致不良的副作用.

Vue.js相关问答推荐

我如何使用vuejs访问彼此嵌套的json对象

写入计算值时出错,但我没有写入任何值

无法在cPanel/SSH上构建 | Laravel + Vue优化

是否可以将 nuxt3 与类星体框架一起使用

拖入 vue2-google-map 后如何获取标记位置?

混合使用 React 和 Vue 是个好主意吗?

将props传递给设置时的VueJS 3组合API和TypeScript类型问题:类型上不存在属性 user用户

aspnet core如何在deploy上构建webpack

在组件上的 Vue 3 中获取 URL 查询参数

如何将 ASP.NET Core 2.1 与 Vue CLI 3 集成?

如何获取 Vue 路由历史记录?

为什么当我 Select 第二个输入框时音译transliteration不起作用?

如何判断 Vue 组件是否处于活动状态

v-model 不会检测到 jQuery 触发事件所做的更改

我可以避免使用 Vue.js 组件的重复样式吗?

Vuetify 2 个工具栏和 1 个导航抽屉,navigation drawer导航抽屉上方有 1 个工具栏

Select 下拉列表中的复选框后如何清除 v-autocomplete(多个)搜索输入?

axios 拦截器响应未定义

使用 Vue.js 获取所有选中复选框的列表

Vue.JS 2.0 修改不相关数据时速度慢