Vue.js:如何在组件初始化时触发观察器函数

Posted

技术标签:

【中文标题】Vue.js:如何在组件初始化时触发观察器函数【英文标题】:Vue.js: How to fire a watcher function when a component initializes 【发布时间】:2018-01-03 08:59:06 【问题描述】:

有时我需要调用一些函数来响应数据属性的变化。但是,我还需要该函数来触发 data 属性的初始值。

当组件初始化时,观察者不会触发,因为被观察的属性在技术上还没有改变。所以,我最终将函数放在methods 对象中,然后在观察者和mounted 钩子中调用该方法。

这是一个例子:

new Vue( 
  el: '#app',
  data() 
    return 
      selectedIndex: 0,
    
  ,
  methods: 
    focusSelected() 
      this.$refs.input[this.selectedIndex].focus();
    
  ,
  watch: 
    selectedIndex() 
      this.focusSelected();
    
  ,
  mounted() 
    this.focusSelected();
  
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
<div id="app">
  <div v-for="i in 4">
    <input ref="input"/>
    <button @click="selectedIndex = (i - 1)">Select</button>
  </div>
</div>

有没有办法让我在组件初始化时触发观察者?

【问题讨论】:

【参考方案1】:

Watchers in Vue 可以选择提供immediate 值:

在选项中传入immediate: true会立即用表达式的当前值触发回调

在这种情况下,您可以在 mounted 挂钩中设置一个观察者:

new Vue( 
  el: '#app',
  data() 
    return 
      selectedIndex: 0,
    
  ,
  mounted() 
    this.$watch('selectedIndex', (i) => 
      this.$refs.input[i].focus();
    ,  immediate: true );
  
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
<div id="app">
  <div v-for="i in 4">
    <input ref="input"/>
    <button @click="selectedIndex = (i - 1)">Select</button>
  </div>
</div>

您还可以为 watch 对象中的观察者指定 immediate 选项,如下所示:

watch: 
  foo: 
    immediate: true,
    handler(value) 
      this.bar = value;
    
  

【讨论】:

请注意,第二个解决方案将在创建组件时触发,但在挂载之前

以上是关于Vue.js:如何在组件初始化时触发观察器函数的主要内容,如果未能解决你的问题,请参考以下文章

VUE JS 使用组件实现双向绑定

如何将初始表单值传递给 Vue.js 中的子组件?

如何在使用 Vue.js 触发任何事件时创建新组件?

剖析 Vue.js 内部运行机制

Vue js - 多个组件,每个组件都有不同的初始选定值

如何在 vue.js 组件属性中禁用数据观察