解读vue页面监听store值改变问题

 更新时间:2022年10月24日 09:09:56   作者:榴莲豆包  
这篇文章主要介绍了解读vue页面监听store值改变问题,具有很好的参考价值,希望对大家有所帮助。

vue页面监听store值改变

首先建立store:

import router, { rootRoute, exceptionRoutes, filterAsyncRoutes } from '@/routes'
import asyncRoutes from '@/routes/asyncRoutes'
import config from '@/utils/config'
import { length } from '@/utils'
import request from '@/api'
 
export default {
  namespaced: true,
  state: {
    messageList:[],//消息列表
  },
  mutations: {
    //聊天消息储存
    SET_MESSAGELIST:(state, info)=>{
      let data = Object.assign([], state.messageList ,info)
      state.messageList = data
    },
  },
  actions: {
    
    },
    // 同步缓存页面
    AsyncIncludes ({ commit, state }, data) {
      commit('SET_INCLUDES', data)
    },
    // 新增缓存页面
    AddIncludes ({ commit, state }, path) {
      let includes = state.includes
      if (includes.indexOf(path) < 0) {
        includes.push(path)
      }
      commit('SET_INCLUDES', includes)
    },
    // 删除缓存页面
    DelIncludes ({ commit, state }, path) {
      let includes = state.includes.filter(i => i !== path)
      commit('SET_INCLUDES', includes)
    },
    // 退出
    Logout ({ commit }) {
      commit('SET_OUT')
    }
  },
  getters: {
    includes: state => state.includes,
    get_CustomerList: state => state.customerList,
    get_ExpertList: state => state.expertList,
  }
}

重点是:

SET_MESSAGELIST:(state, info)=>{
      let data = Object.assign([], state.messageList ,info)
      state.messageList = data
    }

然后是存值:

hat.$store.commit('permission/SET_MESSAGELIST', that.conversationList)

一定带上模块名称(permission)。

然后是使用computed计算属性取值:

 computed: {
 
        cuserList() {
 
            return this.$store.state.permission.messageList;
 
        },
 
    },

使用深度监听新值变化:

watch:{     //监听value的变化,进行相应的操做便可
    fuid: function(a,b){     //a是value的新值,b是旧值
      this.uid = this.fuid;
      this.chatList =[]
      this.getChatList();
    },
    cuserList: {
        handler(nval, oval) {
          debugger
          if(nval.length>0){
              this.userList.forEach(item=>{
                nval.forEach(item2=>{
                  if(item.uid==item2.send_uid && this.uid ==item2.receive_uid){
                   item.unreadCount = item.unreadCount+1;
                   item.msg_type = item2.msg_type;
                   item.msg_content = item2.msg_content;
                  }
                  if(item.uid==item2.send_uid && this.uid ==item2.receive_uid){
                   item.unreadCount = item.unreadCount+1;
                   item.msg_type = item2.msg_type;
                   item.msg_content = item2.msg_content;
                  }
                })
              })
              console.log(this.userList)
          }
        },
        deep: true, // 深度监听
        immediate: true,//立即执行
    },
  },

完毕,这样能解决绝大部分问题。 

vue监听store.state对象变化不起作用

store.state中的对象属性发生改变,引用state的组件中却监听不到变化,深度监听也不起作用,如下代码:

// state.js
noticeParams: [
    { CODE: null, NoticeType: null},
    { CODE: null, NoticeType: null},
    { CODE: null, NoticeType: null}
  ]
// 所引用组件
export default {
  methods: {
    profileJump(path, tab) {
      this.$router.push({ path: path, query: { tab: tab } });
    }
  },
  computed: {
    ...mapState(['noticeParams'])
  },
  watch: {
    noticeParams(val){
      console.log('HomeHeader=====>', val);
    }
  }
};
// 重新赋值
computed: {
    ...mapState(['noticeParams'])
  },
methods:{
    fn(){
        // 省略了一些操作
        this.$store.commit('setNoticeParams', this.noticeParams)
    }
}
 // mutations里的方法
 setNoticeParams(state, data) {
     // 问题就出现在此处
    state.noticeParams = data
  }

由于重新赋值的代码中里引用了初始 state.noticeParams,而mutations的方法中将改变后的state.noticeParams又重新赋值给state.noticeParams,此时state.noticeParams里的属性值发生了改变但引用并未发生变化,所以监听没起作用,解决方法就是创建新的数组

setNoticeParams(state, data) {
    let arr = Object.assign([], state.noticeParams, data);
    state.noticeParams = arr
    // 创建一个空数组,将初始state.noticeParams与改变后的state.noticeParams==》data合并,最后赋值给state.noticeParams
  }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue 中固定导航栏的实例代码

    vue 中固定导航栏的实例代码

    今天小编就为大家分享一篇vue 中固定导航栏的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue 解除鼠标的监听事件的方法

    vue 解除鼠标的监听事件的方法

    这篇文章主要介绍了vue 解除鼠标的监听事件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Vue2模版编译流程详解

    Vue2模版编译流程详解

    vue中有一张响应式系统的流程图,vue会将模板语法编译成render函数,通过render函数渲染生成Virtual dom,但是官方并没有对模板编译有详细的介绍,这篇文章带大家一起学习下vue的模板编译
    2023-07-07
  • vue中将el-switch值true、false改为number类型的1和0

    vue中将el-switch值true、false改为number类型的1和0

    这篇文章主要介绍了vue中将el-switch值true、false改为number类型的1和0问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue-cli多页面应用实践之实现组件预览项目

    vue-cli多页面应用实践之实现组件预览项目

    在最近的项目中遇到了一个需求,找了相关资料后终于实现,这篇文章主要给大家介绍了关于vue-cli多页面应用实践之实现组件预览项目的相关资料,需要的朋友可以参考下
    2022-05-05
  • vue基于better-scroll实现左右联动滑动页面

    vue基于better-scroll实现左右联动滑动页面

    这篇文章主要介绍了vue基于better-scroll实现左右联动滑动页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Vue3响应式高阶用法之shallowReadonly()使用

    Vue3响应式高阶用法之shallowReadonly()使用

    在前端开发中,Vue3的shallowReadonly() API允许开发者创建部分只读的状态,这对于保持顶层属性不变而内部属性可变的场景非常有用,本文将详细介绍 shallowReadonly() 的使用方法及其应用场景,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • vue3搭配pinia的踩坑实战记录

    vue3搭配pinia的踩坑实战记录

    Pinia是一个同时支持Vue2和Vue3的应用状态管理工具,简单来说就是为了管理整个应用中的响应式数据,解决各个组件交互时数据状态的不好管理的问题,下面这篇文章主要给大家介绍了关于vue3搭配pinia踩坑的相关资料,需要的朋友可以参考下
    2022-04-04
  • vant toast 关闭栈溢出问题及解决

    vant toast 关闭栈溢出问题及解决

    这篇文章主要介绍了vant toast 关闭栈溢出问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 解决vue bus.$emit触发第一次$on监听不到问题

    解决vue bus.$emit触发第一次$on监听不到问题

    这篇文章主要介绍了解决vue bus.$emit触发第一次$on监听不到问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论