详解Vuex常见问题

Posted goloving

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解Vuex常见问题相关的知识,希望对你有一定的参考价值。

  Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

  使用Vue开发项目时,通常我们就会遇到如下几种棘手的问题:

  问题1:通过路由传递参数,我们会采用params或者query形式,但这两种方式都会在URL上做手脚,如果传递的参数过多,会导致400 Bad Request(如:点击表格某行,携带行数据跳转到新页面进行查看)。

  问题2:兄弟组件传值

  问题3:多处地方使用同一数据,为节省重复请求(最为常见)

  业务场景:

  从A页面携带下钻参数(ID)到B页面,然后B页面获取参数(ID)进行数据请求。由于要下钻的ID过长,受浏览器的URL长度限制问题,我们不能采用常规的prams(xxx.com/B/:ID)或query(xxx.com/B?ID=…)形式传递。可以使用Vuex做中间过渡,跳转前存储ID信息,进入B页面后从Vuex获取ID信息。

  如果用户在B页面刷新数据,则Vuex的ID状态值会被清空无法获取,这里只能借助localStorage进行持久化进行处理(当然,如果直接使用localstorage进行持久化存储,而不借助Vuex也是可行的,但就是没了响应式的效果了)

1、Vuex,每次调用mutation之后向localstorage存值,防止刷新丢失

export default {
    state:{
        reportInfo:null
    },
    getters:{
        reportInfo(state){
            if(!state.reportInfo){
                state.reportInfo = JSON.parse(sessionStorage.getItem(‘reportInfo‘))
            }
            return state.reportInfo
        }
    },
    mutations:{
        initReport:(state,data) => {
            state.reportInfo = data
            sessionStorage.setItem(reportInfo,JSON.stringify(data))
        },
        changeReportReview:(state,data) => {
            state.reportInfo.is_review = data;//改state的reportInfo里的某个值,
同时修改sessionStorage的值,以保证一样
sessionStorage.setItem(
reportInfo,JSON.stringify(state.reportInfo)) } } }

2、调用时需要追加模块名称

  如上的getters,首先从store中获取,如果store中不存在则从localstorage中获取(刷新)

3、页面中如果有用户登出操作,此时一般需要removeItem,如果页面中有userInfo的判断信息,如下一般需要先做个判断userInfo存在才会去取userInfo.roleName的值,这样就会防止页面报错,类似于后台语言空指针的错误

<span class="el-dropdown-link">
      {{userInfo ? (userInfo.account ? userInfo.account : userInfo.phoneNum) : ""}}
      <i class="iconfont icon-user"></i>
</span>

 

<router-link :to="‘/account‘" v-if="userInfo && userInfo.roleName === ‘sys‘">
    <el-dropdown-item>添加账户</el-dropdown-item>
</router-link>

  如果没有removeItem的操作的话,则是不需要这样的。如下面的reportInfo,因为用户登出的时候,不会影响到它

<div class="suggess_requert" v-if="suggess.suggestion_level === 3">
    <div v-if="reportInfo.is_review === 1">
        <router-link v-if="userInfo && userInfo.roleName === ‘dba‘" :to="‘/list/review‘">
            <h3>提交审核意见</h3>
        </router-link>
        <h3 v-else>专家正在审核,请稍后</h3>
    </div>
    <router-link v-else-if="reportInfo.is_review === 2" :to="‘/list/reviewInfo/‘ + reportInfo.report_id">
        <h3>查看云和恩墨专家团队审核意见</h3>
    </router-link>
    <div v-else>
        <h3 v-if="userInfo && userInfo.roleName === ‘user‘" @click="reviewRequest()">一键请求云和恩墨专家团队帮您二次审核</h3>
    </div>
</div>

 


以上是关于详解Vuex常见问题的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

vue2和vue3中vuex的区别和使用方法详解?

详解基于vue,vue-router, vuex以及addRoutes进行权限控制

详解Vuex常见问题