vue--渲染后修改数据不刷新

摘要:
因此,Vue无法检测到以下已更改的数组:当您使用索引(例如vm)直接设置项时。items[indexOfItem]=newValue修改数组长度时,例如vm。项目。length=newLength,例如,使用this。array[0]以更新数组的内容,以及Vue。set(this.array,0,!)不用于刷新视图。由于现代JavaScript的限制,Vue无法检测对象属性的添加或删除。

问题: 在使用 vue 进行开发的过程中,可能会遇到一种情况:当生成vue实例后,再次给数据赋值时,有时候并不会自动更新到视图上去。也就是如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。

vue遍历数组对象进行渲染

<div class="hisItem"
         v-for="(item,index) in historyNowList"
         :key="item+index">
      <div class="word">
        <i style="color:red;">*</i>
        <span>{{item.option_name}}:</span>
      </div>
      <div class="hisCheck">
        <el-radio v-model="item.option_value"
                  @change="handleTestClick(item,index,item.option_value)"
                  label="1">有</el-radio>
        <el-radio v-model="item.option_value"
                  @change="handleTestClick(item,index,item.option_value)"
                  label="0">无</el-radio>
      </div>
    </div>

使用Vue.set对数据进行一个强制更改

 handleTestClick(item, key, val) {
      Vue.set(this.historyNowList, key, this.historyNowList[key])
    }

原因: 受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。

 所以Vue 不能检测以下变动的数组:
当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如:vm.items.length = newLength
例如:使用 this.arr[0] 去更新 array 的内容,视图没有刷新
使用 Vue.set(this.arr, 0, !this.arr[0]) 去更新 array 的内容,视图被刷新
使用 this.arr[0] = !this.arr[0] 和 this.obj.a = !this.obj.a 同时更新,视图被刷新
结论:
如果方法里面单纯的更新数组 Array 的话,要使用 Vue.set();
如果方法里面同时有数组和对象的更新,直接操作 data 即可;

原理

每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。

受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。

通过 Vue.set() 改写

Vue.set( target, propertyName/index, value )

参数: {Object | Array} target {string | number} propertyName/index {any} value

返回值:设置的值。

用法: 向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新。 它必须用于向响应式对象上添加新 property,因为 Vue 无法探测普通的新增 property (比如 this.myObject.newProperty = 'hi') 注意: 对象不能是 Vue 实例,或者 Vue 实例的根数据对象。

通过 $set() 改写

vm.$set( target, propertyName/index, value )

参数: {Object | Array} target {string | number} propertyName/index {any} value

返回值:设置的值。

用法: 这是全局 Vue.set 的别名。

可以发现 Vue.set() 和 this.$set() 这两个 api 的实现原理基本一模一样,都是使用了set函数。 set 函数是从 …/observer/index 文件中导出的。 区别在于 Vue.set( ) 是将 set 函数绑定在 Vue 构造函数上,this.$set() 是将 set 函数绑定在 Vue原型上

免责声明:文章转载自《vue--渲染后修改数据不刷新》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TCMallocdelphi 操作xml示例(DelphiBBS)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue组件如何引入外部.js/.css/.scss文件

可在相应的单vue组件引入相应文件。 1、引入外部.js文件。   2、引入外部.css文件。     使用@import引入外部css,作用域是全局的,也可在相应的单vue组件引入,import并不是引入代码到<style></style>里面,而是发起新的请求获得样式资源,并且没有加scoped。     注:如果有样式时,应该...

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

VUE+Element 前端应用,比较不错的一点就是界面组件化,我们可以根据重用的指导方针,把界面内容拆分为各个不同的组合,每一个模块可以是一个组件,也可以是多个组件的综合体,而且这一个过程非常方便。组件封装的目的就是为了能够更加便捷、快速的进行业务功能的开发。组件(component)是vue的最强大功能之一,组件可以实现一些类似功能的复用及与其它业务逻...

Vue 技能进阶:使用设计模式写出优雅的前端代码

为什么提出这个复杂的问题? 在我们的应用程序中有一个顶栏,其中包含各种按钮、一个搜索栏和其他一些控件。 它显示的内容根据你所在的页面略有差异,因此我们需要一种按页配置它的方法。 为此,我们希望每个页面都能配置顶栏。 看起来很简单,但这里有一个问题:这个顶栏(我们称之为 ActionBar)实际上是主布局骨架的一部分,它长成这样: <templat...

vue对vue-giant-tree进行节点操作

vue 项目中使用到了vue-giant-tree这个使用ztree封装的树形插件,在对其节点进行操作时遇到了无法向传统的jquery那样获取到ztreeObj;而导致了无法控制节点dom;浪费了许多时间,so特此记录一哈 Vue-Giant-Tree Vue-Giant-Tree是最ztree的一个封装;用于vue 项目中,该ztree的好处就是不需要...

vue3+ts +vant 从0搭建移动端架子

1. 前期准备 安装node,vue3,vscode 1.1 安装更新脚手架npm install -g @vue/clinpm update -g @vue/cli 1.2 vscode 插件Volar ,Vue 3 Snippets 开发vue3时需要关闭vetur插件 2. vue3官网 https://v3.cn.vuejs.org/ vant 官...

Vuex 的项目实例1 项目初始化

1、通过 vue ui 命令打开可视化面板,创建新项目:vuex-demo 2、安装 vuex 依赖包 npm install vuex axios ant-design-vue -S 当然也可以使用可视化面板的依赖安装。 ant-design-vue 是UI组件库。 3、实现 Todos 基本布局(基于已有样式模板) main.js 文件: import...