Vue中Vue.set()和this.$forceUpdate()的使用

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的实例重新渲染;
注意它仅仅影响实例本身以及插入插槽内的子组件;并不是所有的子组件
上一篇:如何给表添加新的字段


下一篇:golang 通过指针修改结构体,达到类似引用类型的目的