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

简介: 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的实例重新渲染;


注意它仅仅影响实例本身以及插入插槽内的子组件;并不是所有的子组件

相关文章
|
8月前
|
JavaScript API
【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined
【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined
137 0
|
1月前
|
JavaScript 索引
在使用`Vue.$set`方法时,需要注意哪些事项?
在使用`Vue.$set`方法时,需要注意哪些事项?
18 0
|
1月前
|
JavaScript
vue的filters筛选器获取this使用
vue的filters筛选器获取this使用
62 0
|
11月前
|
JavaScript
vue:.js 文件获取到 .vue 文件中的 this
vue:.js 文件获取到 .vue 文件中的 this
123 0
|
7月前
|
JavaScript 前端开发
Vue中this指向问题
Vue中this指向问题
32 1
|
1月前
|
编解码 JavaScript 编译器
【Vue warn】If this is a native custom element, make sure to exclude it from component resolution ……
【Vue warn】If this is a native custom element, make sure to exclude it from component resolution ……
|
7月前
|
JavaScript
vue踩坑-This dependency was not found
vue踩坑-This dependency was not found
38 0
|
10月前
|
JavaScript
Vue 更新数据 Vue.set 的属性和方法
Vue 更新数据 Vue.set 的属性和方法
|
10月前
|
JavaScript
Vue学习之参数传递与事件分发使用this.$emit(‘自定义事件名‘, 参数)自定义事件删除待办事项
数据项在 Vue 的实例中,但删除操作要在组件中完成,那么组件如何才能删除 Vue 实例中的数据呢? 此时就涉及到参数传递与事件分发了,Vue 为我们提供了自定义事件的功能很好的帮助我们解决了这个问题;使用this.$emit(‘自定义事件名’, 参数),操作过程如下
152 0
|
10月前
|
JavaScript
Vue 中普通 js 文件中获取 this (vue 对象)
Vue 中普通 js 文件中获取 this (vue 对象)
284 0