• 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的实例重新渲染;
    注意它仅仅影响实例本身以及插入插槽内的子组件;并不是所有的子组件
    
    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    1+X云计算(中级) 单节点部署应用商城系统(gpmall)
    1+X云计算 应用商城系统(gpmall)-遇到的问题以及解决办法
    1+X云计算平台运维与开发(中级)eNSP A~E卷 试题+答案
    vi&vim 基本使用方法
    yum针对软件包操作的常用命令
    本地yum源配置
    SpringCloud微服务初体验
    SpringBoot自定义注解拦截器,实现登录token验证
    MySQL建立SSL连接问题,设置useSSL=false显式禁用SSL,或者设置useSSL=true
    TPL事务
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/14680505.html
Copyright © 2020-2023  润新知