【问题标题】:vue.js data not updated after clear清除后vue.js数据未更新
【发布时间】:2018-08-08 17:58:54
【问题描述】:

我的页面中有一个 vue.js 项目,用于跟踪对表单所做的更改。它看起来像这样:

var changes_applied = [];

var changes_applied_block = new Vue({
    name: "ChangesApplied",
    el: '#changes-applied',
    data: {
        items: changes_applied
    },
    methods: {
        remove: function(index) {
            changes_applied.splice(index, 1);
        }
    }
});

当检测到更改时,更改被推送到changes_applied 数组,并按预期显示在“已应用的更改”div 中。删除也起作用,它只是调用 vue 对象上的 remove 方法。

我还有一个“清除”按钮,它没有连接到 vue 实例,当它被点击时,它使用changes_applied = [];将数据源设置回一个空数组

问题是使用按钮清除后,更改数组的更改/添加不再显示在 vue 元素中——就像 vue 元素不再附加到 changes_applied 数组一样。

我是否缺少绑定或此处需要发生的事情,或者是否有“vue 方式”来清除 vue 数据而不接触实际源数组?

【问题讨论】:

    标签: javascript vue.js vuejs2


    【解决方案1】:

    您不应该更改changes_applied 数组; Vue 并没有真正响应该数组上的更改。只有当this.items 指向同一个数组引用时,它才某种 起作用。当您通过重新分配changes_applied 更改该引用时,它会中断,因为您正在操作changes_applied,但它不再是与this.items 相同的数组。

    您应该直接操作this.items

    methods: {
        remove: function(index) {
            this.items.splice(index, 1);
        }
    

    要清除它,您可以设置:

     this.items = []
    

    它会按预期工作。

    【讨论】:

      【解决方案2】:

      您的 items 数组已使用 changes_applied 进行初始化,但不强制绑定,它只是创建实例时项目的默认值。所以如果你改变了 changes_applied 这不会影响 vue 实例上的 items 数组。

      例子

      new Vue({
        el: '#app',
        data: function () {
          return {
            items: myArr,
            newItem: ''
          }
        },
        methods: {
          addItem () {
            this.items.push(this.newItem)
            this.newItem = ''
          },
          remove (index) {
            this.items.splice(index, 1)
          },
          clear () {
            this.items = []
          }
        }
      })
      <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
      <div id="app">
        <input type="text" v-model="newItem" /> 
        <button @click="addItem">Add</button> 
        <button @click="clear">Clear</button>
        <p v-for="(item, index) in items" @click="remove(index)">{{item}}</p>
      </div>
      <!-- from outside vue instance-->
      <button onClick="clearFromOutside()">clear from outside</button>
      <script>
      var myArr = ['hola', 'mundo'];
        function clearFromOutside() {
          console.log(myArr)
          myArr = [];
          console.log(myArr)
        }
      </script>

      【讨论】:

        【解决方案3】:

        Mark_M 已经提供了很好的解释,我将添加一个演示,因为我认为它更容易理解它的工作原理。

        你可以将数组的值复制到数据中,但是所有的操作都必须直接对数据进行:

        const changes_applied = [
          {id: 1},
          {id: 2},
          {id: 3}
        ];
        
        const vm = new Vue({
          el: '#app',
          data: {items: changes_applied},
          methods: {
            add() {
              const id = this.items.length + 1
              this.items.push({id})
            },
            remove() {
              this.items.pop()
            },
            clear() {
              this.items = []
            }
          }
        })
        <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
        
        <div id="app">
          <div>
            <button type="button" @click="add">Add</button>
            <button type="button" @click="remove">Remove</button>
            <button type="button" @click="clear">Clear</button>
          </div>
          <ul name="list">
            <li v-for="item in items" :key="item.id">
              Item {{ item.id }}
            </li>
          </ul>
        </div>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-12
          • 1970-01-01
          • 2017-11-11
          • 2019-09-01
          • 1970-01-01
          • 2022-01-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多