从 vue watcher 访问组件实例

Posted

技术标签:

【中文标题】从 vue watcher 访问组件实例【英文标题】:Access component instance from vue watcher 【发布时间】:2018-09-08 19:45:32 【问题描述】:

我正在做一个项目,类似于账单经理,所以我希望每次数量或单位值发生变化时都重新计算小计,我尝试并搜索使用观察器或计算属性来完成此操作,但我找不到正确的方法,因为当另一个更改时,我需要访问元素的整个范围,像这样。

模型结构:

详情 数量 单位价值 小计(应该是计算的或更新的)

所以我认为我应该能够做这样的事情:

    Vue.component('item', 
    template: '#item',
    props: 
      item: Object,
    ,
    computed:
        total: function() 
            return this.quantity*this.unit_value;
         
    ,
    watch:
      'item.quantity':()=>
        this.subtotal = this.quantity*this.unit_value;
      
    
  );

我从一个列表中读取了几个组件

我使用 watcher 合并了该方法,并在相同的代码中计算以使其更短。

问题是我还没有找到从内部访问孔元素的方法,任何人都可以解释正确的方法吗?谢谢

【问题讨论】:

"我还没有找到从内部访问孔元素的方法," .. 你这是什么意思?你想访问什么以及在哪里 【参考方案1】:

你不应该在那里使用箭头函数,使用方法声明。

如果您想监视 item 对象的属性,则必须监视 item 对象本身,并另外使用监视程序的 deep: true 标志。

最后的细节,你正在使用几个没有在你的data 中声明的属性。声明它们,否则它们不会是响应式的,即当它们发生变化时计算不会重新计算。

见代码:

Vue.component('item', 
  template: '#item',
  props: 
    item: Object,
  ,
  data() 
    return 
      subtotal: null,         // added data properties
      quantity: null,
      unit_value: null
    
  ,
  computed: 
    total: function() 
      return this.quantity * this.unit_value;
    
  ,
  watch: 
    item:                           // watching for item now
      deep: true,                    // using deep: true
      handler()                     // and NOT using arrow functions
        this.subtotal = this.quantity * this.unit_value;
      
    
  
);

【讨论】:

感谢您的回复。我将其修改为这种方式,当我更改某些属性时,观察者甚至不会触发:/

以上是关于从 vue watcher 访问组件实例的主要内容,如果未能解决你的问题,请参考以下文章

vue之watch实现原理

vue组件生命周期

Vue的生命周期

开玩笑测试正在从 Vue watcher 调用函数

vue watcher

前端技能树,面试复习第 46 天—— Vue 生命周期 | 父子组件钩子的执行顺序 | 组件间通信有哪些方式