深入理解vue中的$set


Posted in Javascript onJune 01, 2017

在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去;

当我们去看vue文档的时候,会发现有这么一句话:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。如下代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>vue $set</title>
<script src="https://static.3water.com/assets/vue/1.0.11/vue.min.js"></script>
</head>
<body>
<div id="app">
 姓名:{{ name }}<br>
 年龄:{{age}}<br>
 性别:{{sex}}<br>
 说明:{{info.content}}
</div>
<!-- JavaScript 代码需要放在尾部(指定的HTML元素之后) -->
<script>
var data = {
 name: "三水点靠木",
 age: '3',
 info: {
  content: 'my name is test'
 }
} 
var key = 'content';
var vm = new Vue({
 el:'#app',
 data: data,
 ready: function(){
  //Vue.set(data,'sex', '男')
  //this.$set('info.'+key, 'what is this?');
 }
});
data.sex = '男';
</script>
</body>
</html>

运行结果:

姓名:三水点靠木
年龄:3
性别:
说明:my name is test

为什么会这样呢?当去查对应文档时,你会发现响应系统 ,把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter,如上示例,将data在控制台打印出来会发现:

深入理解vue中的$set

在age及name都有get和set方法,但是在sex里面并没有这两个方法,因此,设置了sex值后vue并不会自动更新视图;

解决方法:

<script>
var data = {
 name: "三水点靠木",
 age: '3',
 info: {
  content: 'my name is test'
 }
} 
var key = 'content';
new Vue({
 el:'#app',
 data: data,
 ready: function(){
  Vue.set(data,'sex', '男');
  this.$set('info.'+key, 'what is this?');
 }
});
</script>

1、通过Vue.set方法设置data属性,如上:

Vue.set(data,'sex', '男')

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

var key = 'content'; //这种主要用于当对象中某个属性值动态生成时处理方式
this.$set('info.'+key, 'what is this?');
//或
this.$set('info.content', 'what is this?');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript表单验证 - Parsley.js使用和配置
Jan 25 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
confirm确认对话框的实现方法总结
Jun 17 Javascript
json与jsonp知识小结(推荐)
Aug 16 Javascript
利用D3.js实现最简单的柱状图示例代码
Dec 09 Javascript
JQueryMiniUI按照时间进行查询的实现方法
Jun 07 jQuery
JQuery扩展对象方法操作示例
Aug 21 jQuery
详解babel升级到7.X采坑总结
May 12 Javascript
JS实现选项卡效果的代码实例
May 20 Javascript
微信小程序实现点击页面出现文字
Sep 21 Javascript
js实现筛选功能
Nov 24 Javascript
JS setTimeout与setInterval的区别
Apr 20 Javascript
详解angular中的作用域及继承
May 31 #Javascript
Node学习记录之cluster模块
May 31 #Javascript
Express框架之connect-flash详解
May 31 #Javascript
node.js中express-session配置项详解
May 31 #Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 #Javascript
详解angularjs中的隔离作用域理解以及绑定策略
May 31 #Javascript
JS简单实现自定义右键菜单实例
May 31 #Javascript
You might like
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
React Component存在的几种形式详解
2018/11/06 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
PyQt5实现下载进度条效果
2018/04/19 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
AUC计算方法与Python实现代码
2020/02/28 Python
企业军训感想
2014/02/07 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
大学军训决心书
2015/02/05 职场文书
2016党校学习心得体会
2016/01/07 职场文书
创业计划书之面包店
2019/09/12 职场文书
Opencv中cv2.floodFill算法的使用
2021/06/18 Python
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android