1.给对象添加一个key值 成功的
<template> <div> <p>{{userInfo.name}}</p> <p>{{userInfo.sex ? userInfo.sex : ''}}</p> <button @click="updateName">修改userInfo</button> </div> </template> <script> export default { data(){ return{ userInfo:{name:'小明'} } }, methods:{ updateName(){ this.userInfo.name='小红'; this.userInfo['sex']='男';//ok } } } </script>
2.给对象添加一个key值 失败的
<template> <div> <p>{{userInfo.name}}</p> <p>{{userInfo.sex ? userInfo.sex : ''}}</p> <button @click="updateName">修改userInfo</button> </div> </template> <script> export default { data(){ return{ userInfo:{name:'小明'} } }, methods:{ updateName(){ this.userInfo['sex']='男';//失败的 } } } </script>
3.好奇怪,为啥一个成功一个失败?
在什么情况下,直接给对象添加一个key值会失败?????
是在你直接给原来的对象上新增一个key值而且没有修改原来对象上的值如下
this.userInfo['sex']='男';
这样的修改肯定会失败的哈
你新增key值的时候;并且改变了原来已经有的key的内容;这样你新增的key值就可以更改成功
this.userInfo.name=this.userInfo.name+"213";
this.userInfo['sex']='男';//ok
为啥会这样是因为:
因为受现代JS的限制,vue不能检测到对象属性的添加或删除。(重要!!!)
vue不允许在已经创建的实例上动态添加新的根级响应式属性,(注意!!!)
不过可以使用Vue.set()方法将响应式属性添加到嵌套的对象上。
3.给对象添加key值的两种方式
<template> <div> <p>{{userInfo.name}}</p> <p>{{userInfo.sex ? userInfo.sex : ''}}</p> <button @click="updateName">修改userInfo</button> </div> </template> <script> import Vue from "vue" //Vue.set()的时候需要使用 export default { data(){ return{ userInfo:{name:'小明'} } }, methods:{ updateName(){ // this.userInfo['sex']='男'; //失败的 // 解决方法一:注意要引入Vue // Vue.set(this.userInfo, 'sex' ,'男') //解决办法二;不推荐因为消耗性能 this.userInfo['sex']='男'; this.$forceUpdate() } } } </script>
4.forceUpdate的讲解
this.$forceUpdate()
它可以迫使Vue的实例重新渲染;
注意它仅仅影响实例本身以及插入插槽内的子组件;并不是所有的子组件