Vue响应式添加、修改数组和对象的值


Posted in Javascript onMarch 20, 2017

有些时候,不得不想添加、修改数组和对象的值,但是直接添加、修改后又失去了getter、setter。

由于 JavaScript 的限制, Vue 不能检测以下变动的数组:

1. 利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue

2. 修改数组的长度时,例如: vm.items.length = newLength

为了避免第一种情况,以下两种方式将达到像 vm.items[indexOfItem] = newValue 的效果, 同时也将触发状态更新:

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

避免第二种情况,使用 splice:

example1.items.splice(newLength)

 Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。然而它可以使用Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上:

Vue.set(vm.someObject, 'b', 2)

您还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:

this.$set(this.someObject,'b',2)

有时你想向已有对象上添加一些属性,例如使用 Object.assign() 或 _.extend() 方法来添加属性。但是,添加到对象上的新属性不会触发更新。在这种情况下可以创建一个新的对象,让它包含原对象的属性和新的属性:

// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })
this.someObject = _.extend({ a: 1, b: 2 }, this.someObject)

示例代码:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
 <meta charset="utf-8">
 <title></title>
</head>
<body>
 
 <div id="app">
 <ol>
 <li v-for="data in list">{{data.id}} - {{data.name}}</li>
 </ol>
 </div>


 <script type="text/javascript" src="../underscore/underscore-min.js"></script>
 <script type="text/javascript" src="./vue.2.1.8.min.js"></script>
 <script type="text/javascript">
 var oVue = new Vue({
 el : '#app',
 data : {
 list : [
  {id : 5},
  {id : 6}
 ]
 }
 });
 </script>
</body>
</html>

Vue响应式添加、修改数组和对象的值

以上就是VueI添加修改数组与对象值时同时将触发状态更新的方法,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
关于IE BUG与字符串截取substr的解决办法
Apr 10 Javascript
用js将内容复制到剪贴板兼容浏览器
Mar 18 Javascript
原生js实现移动开发轮播图、相册滑动特效
Apr 17 Javascript
js实现不提交表单获取单选按钮值的方法
Aug 21 Javascript
利用css+原生js制作简单的钟表
Apr 07 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
Aug 31 Javascript
BootStrap Datetimepicker 汉化的实现代码
Feb 10 Javascript
js 获取今天以及过去日期
Apr 11 Javascript
easyui-datagrid特殊字符不能显示的处理方法
Apr 12 Javascript
Vue.js框架路由使用方法实例详解
Aug 25 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
Mar 01 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
zTree实现节点修改的实时刷新功能
Mar 20 #Javascript
Vue指令的钩子函数使用方法
Mar 20 #Javascript
非常实用的vue导航钩子
Mar 20 #Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
Mar 20 #Javascript
如何解决vue与传统jquery插件冲突
Mar 20 #Javascript
Vue.js路由vue-router使用方法详解
Mar 20 #Javascript
Vue插件写、用详解(附demo)
Mar 20 #Javascript
You might like
世界上第一台立体声收音机
2021/03/01 无线电
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
jQuery参数列表集合
2011/04/06 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
JavaScript实现数值自动增加动画
2017/12/28 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
node.js博客项目开发手记
2018/03/16 Javascript
vue中el-upload上传图片到七牛的示例代码
2018/10/19 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python实现的几个常用排序算法实例
2014/06/16 Python
python数据处理实战(必看篇)
2017/06/11 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
你对IPv6了解程度
2016/02/09 面试题
勤俭节约演讲稿
2014/05/08 职场文书
大雁塔导游词
2015/02/04 职场文书
公司与个人合作协议书
2016/03/19 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python