【问题标题】:vue + checkbox + change event - different results on page and in consolevue + checkbox + change event - 页面和控制台上的不同结果
【发布时间】:2020-08-15 20:33:03
【问题描述】:

我有一个我无法理解和解决的问题。 我在 vue 中有一个简单的页面 - 一组通过 v-model 绑定到数组的复选框。 看起来是这样的:

<template>
  <div id="app">
    <b-form-checkbox-group
      switches
      stacked
      v-model="selectedFruits"
      :options="options"
      @change="selectionChanged"
    >
    </b-form-checkbox-group>
    {{ selectedFruits }}
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      selectedFruits: [],
      options: [
        {
          text: 'Apple',
          value: {id: 1, val: 'apple'},
        },
        {
          text: 'Banana',
          value: {id: 2, val: 'banana'},
        },
        {
          text: 'Pear',
          value: {id: 3, val: 'pear'},
        },
        {
          text: 'Plum',
          value: {id: 4, val: 'plum'},
        }
      ]
    }
  },
  methods: {
    selectionChanged() {
      console.log(this.selectedFruits);
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

如您所见,没什么难的。

它在屏幕上效果很好 - {{ selectedFruits }} 显示正确。 但是,当我在控制台中检查 selectedFuits 的值时,我看到的结果与显示的不同 - 控制台显示“一键延迟”结果。 请您解释一下问题并指导我,如何解决?

【问题讨论】:

    标签: javascript vue.js checkbox onchange


    【解决方案1】:

    我认为您在 Vue 更新它之前就丢弃了该值。如果你想与 Vue 同步,你应该watch 变量而不是实现你自己的@change

    <b-form-checkbox-group
      switches
      stacked
      v-model="selectedFruits"
      :options="options"
    >
    
    ...
    
    watch: {
      selectedFruits(val) {
        console.log(val); // or this.selectedFruits
      }
    }
    

    您也可以在当前代码中使用Vue.nextTick(() =&gt; console.log(this.selectedFruits)),但是,当您使用 v-model 时,我认为您不应该为同一件事实现自己的事件。

    (旁白:v-model 只监听@input - 有可能b-form-checkbox-group 只是在发出@change 之前发出它。使用watch,你不必关心这种细节,因为它与 Vue 的更新周期同步)

    【讨论】:

    • 谢谢。两个答案都解决了这个问题。现在的问题是,我应该使用哪一个?在我的解决方案中,我有一个带有组件的模态,并且我有复选框,并且在每个复选框更改时都会发出“更改”事件。我想我可以从我的方法和手表发出事件 - 现在,我应该使用一个规则吗?或者只要我的解决方案有效就没有关系? :)
    • @Mikk 在消费事件方面,如果你设置了一个 v-model,你不应该有其他监听器,因为watch 是正确的(它涵盖了 any更改该变量)。现在,如果您想通知您上面的父母有关更改,您可以从您的watch 回调中$emit('change')。如果您发现自己经常重新发送事件(超过树的 1 级以上),您可能需要查看像 Vuex 这样的集中式存储
    • 再次感谢您。你是对的 - 当已经有一个与我的自定义事件相同的事件时,不需要新事件。
    猜你喜欢
    • 2023-02-08
    • 2021-07-26
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多