美文网首页
v-for无法在获取数据后更新dom

v-for无法在获取数据后更新dom

作者: E1FANG | 来源:发表于2019-12-31 15:28 被阅读0次

在axios获取数据后,数据成功修改,但是dom依然没有刷新,代码如下:

<el-select v-model="value" value-key="id" placeholder="请选择" size="samll">
          <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
</el-select>

...
 data() {
    return {
      options: [],
      opReady: false
    }
  },
getStore(checkPhrases) {
      getMysql133(checkPhrases).then(res => {
        const result = res.data.rows
        result.forEach((e, i) => {
            this.options[i] = {
            value: e[0],
            label: e[1]
          }
        })
        this.options = newArr
        this.opReady = true
      })
    }

选择列表仍未空,显示no-data

之后在el-select上绑定v-if='opReady'后 dom成功更新,但是意识到这不是长久的办法,因为后续要根据选中的数据进行数据操作,所以继续深究

找到原理

官方文档
官方文档上有说明这个问题

由于JavaScript的限制,Vue不能检测以下变动的数组:
  • 当你通过索引直接设置一个数组项时,例如上面代码中的
result.forEach((e, i) => {
            this.options[i] = {
            value: e[0],
            label: e[1]
          }
        })
  • 当你修改数组长度时 例如:vm.items.length = newLength

然后我修改代码之后,dom就实时更新了

getMysql133(checkPhrases).then(res => {
        const result = res.data.rows
        var newArr = []
        result.forEach((e, i) => {
          newArr[i] = {
            value: e[0],
            label: e[1]
          }
        })
        this.options = newArr
        this.opReady = true
      })

用一个新数组去存储,然后再复制给回options,这样就可以避免通过索引设置数组项。

当然官方文档时推荐通过vm.$set来修改的

以下是官方文档原文

为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将在响应式系统内触发状态更新:

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)

你也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名:

vm.$set(vm.items, indexOfItem, newValue)

为了解决第二类问题,你可以使用 splice

vm.items.splice(newLength)

相关文章

  • v-for无法在获取数据后更新dom

    在axios获取数据后,数据成功修改,但是dom依然没有刷新,代码如下: 选择列表仍未空,显示no-data 之后...

  • dom更新后获取dom节点

    v-for渲染数据时 想要获取数据渲染后的dom,需要这样

  • vue.nextTick()方法的使用

    含义:在下次DOM更新循环结束之后执行延迟回调,在修改数据之后立即使用这个方法,获取更新后的DOM.(获取更新后的...

  • vue

    v-for 循环遍历(点击DOM获取数据) VueJS实践:怎么给v-for之后的每个节点都添加不同的样式 1> ...

  • $nextTick

    在vue中修改数据不会导致DOM立即更新,因此修改数据后无法拿到最新的DOM,从而无法进行相应的DOM操作。这时就...

  • Vue - vue.nextTick()

    在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 一. 意义:...

  • nextTick()

    定义: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。(说明...

  • Vue中使用nextTick 在DOM 更新循环结束之后执行延迟

    在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 注意 upd...

  • 对 vue 中 $nextTick的一次认识

    官方解释:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 解...

  • vue-$nextTick浅析

    官方介绍 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 原...

网友评论

      本文标题:v-for无法在获取数据后更新dom

      本文链接:https://www.haomeiwen.com/subject/ysgboctx.html