vue中,页面监听store中数据 的变化以及时做出相应,watch、computed与store的getter属性协调

vue中,页面监听store中数据 的变化以及时做出相应,watch、computed与store的getter属性协调

如题目所示,今天来讲一个非常简单但是非常常见的使用场景。假设在用户登录的时候,store会全局用户的相关信息,当用户退出登录后,store里面的信息会清空,同时,在某一个页面,内容很多,你不想每次进入的时候都通过刷新一下来重新获取store内容,而是想要自动地监听store对应内容的变化,来自己做出响应。那么就可以参考下面的做法:
涉及到的设计内容:

  • store
  • watch
  • computed

假设我现在有一个登录页面,在store存在用户信息时跳转到主页,如果没有,从主页跳转回登录页,也就说只有登录才可以访问主页:
登录页面如下所示:

<template>
    <div>
        登录
        <button type="button" @click="changename">change</button>
    </div>
</template>
<script>
import store from '@/store'
export default {
  data () {
    return {
      name: ''
    }
  },
  methods: {
    changename () {
      store.commit('getinfo', { name: 'zsy' })
    }
  }
}
</script>

然后在store中有如下信息:

export default new Vuex.Store({
  state: {
    name: 'xjd',
    stunumber: '',
    school: '',
    sex: ''
  },
  getters: {
    getname (state) {
      return state.name
    }
  },
  mutations: {
    getinfo (state, a) {
      state.name = a.name
      state.stunumber = a.stunumber
      state.school = a.school
      state.sex = a.sex
    }
  },

那么我们的需求就是,当store中的name变化,登录页面可以监听到,然后进行判断,决定要不要跳转。所以我的登录页面有一个按钮,点击之后可以触发mutation中的更改函数,去更改name这个属性,那么该如何使得store中的name改变后,登录页面可以主动监听到?
使用watch和computed、store.getter!
简单来说,就是通过登录页面的computed计算属性,写一个函数,然后返回的是所要监听store中的某个属性,注意这个属性的返回必须使用getter,不能直接使用store.state来访问!

//store
  getters: {
    getname (state) {
      return state.name
    }
  },
  //登录页面
  computed: {
    getname () {
      return store.getters.getname
    }
  },

然后,通过watch监听这个computed函数:

  watch: {
    getname (newvalue, oldvalue) {
      console.log(newvalue)
    }
  },

这样子,就可以达到点击button,更改store.state中的name属性时,会被登录页面所监听到了!
控制台输出zsy,意味着新的值zsy已经被获取,你就可以做自己要做的功能了:
在这里插入图片描述
同样的,如果需要在主页做跳转,只需要重复上述处理,如果发现name变成 ‘ ’(空),就跳回登录页面。