一个疏忽导致Vuex失去响应式

文章讲述了在Vue2开发中,当在组件中从Vuex存储中获取并初始化用户类型(userType)时,直接赋值给组件data中的属性会导致失去响应式。正确的方法是通过计算属性或mapState来保持响应性。在创建组件时直接赋值会破坏Vue的响应式系统。
摘要由CSDN通过智能技术生成

开发当中有这么一个场景,就是登录成功之后就把userInfo存到了Vuex当中,layout页面中的Home组件使用userInfo里的userType,使用方式是在data中定义一个变量userType,然后在created当中获取this.$store.state.userInfo.userType并赋值给data中的userType,但是出现了个问题,当我在兄弟组件(About)当中使用了仓库中的userType并修改了它时,我Home组件的userType并没有实时更新,具体原因如下:

以下四种方式都可以正常的使用到userType,但是使用第四种初始化赋值的时候发现userType失去了它的响应式(Vue2):

  1. 直接引用

    <li>我是直接获取的userType:{{ $store.state.userInfo.userType }}</li>
  2. mapState解构

    import { mapState } from "vuex";
     computed: {
        ...mapState(["userInfo"]),
      }
  3. computed计算属性

    computed: {
        userType() {
          return this.$store.state.userInfo.userType;
        }
      },
  4. 初始化赋值

 created() {
    this.userType = this.$store.state.userInfo.userType;
  }

效果:

 

原因的话也很简单:

第一种方式直接引用$store.state.userInfo.userType是直接访问了userInfo对象的userType属性,这种方式会保持响应式,因为在Vue初始化时会将userInfo对象转为响应式对象。

第二种方式使用了mapState解构,它会将userInfo对象映射为当前组件的计算属性,这样就可以直接使用this.userInfo.userType来访问userType属性,这种方式也会保持响应式。

第三种方式使用了计算属性userType,每当this.$store.state.userInfo.userType发生变化时,计算属性会重新计算并返回新的值,这种方式也会保持响应式。

第四种方式在created钩子中直接将this.$store.state.userInfo.userType赋值给了this.userType,但是这种方式是普通赋值,没有经过Vue的响应式处理,所以this.userType不会保持响应式。

注:只是简单记录一下开发遇到的小问题,来加深自己的印象!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值