nuxt.js ssr vuex 实现登录操作刷新数据不丢失

26 篇文章 0 订阅
21 篇文章 1 订阅

vuex 状态管理在 nuxt 中的是用法,记录下

demo 请狠狠的戳这里  https://download.lllomh.com/cliect/#/product/N510116415222524
 

1,准备文件

在  store 目录下 新建 

actions.js
index.js
mutation-types.js
mutations.js
userInfo
  --index.js
  --user.js

2,编辑

在 actions.js中

import * as types from './mutation-types.js';

export default {
	isLogin({commit}, status) {
		commit(types.ISLOGIN, status);
    },
}

在index.js中

import Vue from 'vue';
import Vuex from 'vuex';
import mutations from './mutations'
import actions from './actions'

import userInfo from './userInfo';

Vue.use(Vuex);

let modules = {
    ...userInfo,
};

export default ()=> new Vuex.Store({
    state: {
        groups: [1],
        status:null
    },
    modules,
    actions,    // 根级别的 action
    mutations,  // 根级别的 mutations
    // 根级别的 getters
    getters: {
        getGroups(state) {
            return state.groups
        }
    }
})

在mutation-types.js 中

// user type
export const GET_USER_INFO = 'GET_USER_INFO';
export const SET_USER_INFO = 'SET_USER_INFO';
export const OUT_USER_INFO = 'OUT_USER_INFO';

//common type
export const ISLOGIN = 'ISLOGIN';

在mutations.js 中

import * as types from './mutation-types.js';

export default {
    [types.ISLOGIN](state, ststus) {
      let stus =this.$cookies.get('USERINFO')
      stus=JSON.stringify(stus)
      state.status = (stus=='{}' || stus==undefined)?false:true;
    },
}

在userInfo/index.js中

import user from './user';

export default {
    user,
};

在userInfo/user.js中

import * as types from '../mutation-types.js';


export default {
    namespaced: true,
    state: {
        userInfo: {},
    },
    getters: {
        getUserInfos: (state) => {
            const { userInfo } = state;
            return userInfo
        },
    },
    actions: {
        getUserInfo({commit}, info) { //获取信息
          commit(types.GET_USER_INFO, info);
        },
        changeUserInfo({commit}, info) { //登录成功
          commit(types.SET_USER_INFO, info);
        },
        outUserInfo({commit}, info) { //退出删除信息
          commit(types.OUT_USER_INFO, info);
        },
    },
    mutations: {
      [types.GET_USER_INFO](state, userInfo) {//获取信息
        state.userInfo=this.$cookies.get('USERINFO')
      },
        [types.SET_USER_INFO](state, userInfo) { //登录成功
            state.userInfo = JSON.stringify(userInfo);
            this.$cookies.set('USERINFO',JSON.stringify(userInfo))

        },
        [types.OUT_USER_INFO](state, userInfo) {//退出删除信息
            state.userInfo = {};
            this.$cookies.remove('USERINFO')
        },
    },
};

3,使用

1,调出

commit 和dispatch的区别在于commit是提交mutatious的同步操作,dispatch是分发actions的异步操作

dispatch:含有异步操作,例如向后台提交数据,写法: this.$store.dispatch(‘action方法名’,值)

commit:同步操作,写法:this.$store.commit(‘mutations方法名’,值)

这里用的...扩展用算符

在 methods 中 来调出方法

      ...mapActions("user", ["changeUserInfo","getUserInfo"]),// 定义可以调用 userinfo里面的 user.js里面的actions 里的 方法
      ...mapActions(['isLogin']), //执行根级别的 action

然后在组件中使用了,

这里登陆状态跟用户信息2个action都要加载上比登录成功后

          this.$axios.$post(P_LOGIN,data).then(res => {
            if(res.code=='00000'){
              this.$toast.clear()
              this.data=res.data
              this.changeUserInfo(res.data) //执行写入 用户信息
              this.isLogin()  //执行更新登录状态 这里更新状态可以直接在mutations.js changeUserInfo 内部执行   this.commit(types.ISLOGIN) 来及时更新登录状态 
              this.$router.push('/user')
              // console.log(this.$store.state.user.userInfo,'sss') //读取另个方式
              // this.$store.dispatch('changeUserInfo', {qq:22})  调用另一个方式

              // setTimeout(()=>{

              // },2000)
            }
          })

还有在访问的时候要获取状态,所以也要先执行下在mounted执行可, 最好在 created内执行。不会闪

  created(){
    this.isLogin()
  },

2,渲染

取值 现在 computed 里面调出

  computed:{
    ...mapState("user", ["userInfo"]), //读取user 模块里面的 state userInfo
    ...mapState({           //读取根目录index.js里面的 state 里的 status
      status:'status'
    })
  },

在视图直接用  

{{status}}11
即可 这里是对应的

4,后续

有些项目按这个写法后会提示这个错误 WARN  Classic mode for store/ is deprecated and will be removed in Nuxt 3. 

这样的话  目录也就是 1,准备 跟2,编辑2个步骤改一下

换成 :

actions.js

import * as types from './mutation-types.js';

export default {
  getUserInfo({commit}, info) { //获取信息
    commit(types.GET_USER_INFO, info);
  },
  changeUserInfo({commit}, info) { //登录成功
    console.log(info)
    commit(types.SET_USER_INFO, info);
  },
  isLogin({commit}, status) {
    commit(types.ISLOGIN, status);
  },
}

index.js

export const state = () => ({
  status: null,
  userInfo:{}
})

mutation-types.js

// user type
export const GET_USER_INFO = 'GET_USER_INFO';
export const SET_USER_INFO = 'SET_USER_INFO';
export const OUT_USER_INFO = 'OUT_USER_INFO';

//common type
export const ISLOGIN = 'ISLOGIN';

mutations.js 这里更新状态可以直接在 内部执行    this.commit(types.ISLOGIN) //及时更新登录状态  

import * as types from './mutation-types.js';

export default {
    [types.GET_USER_INFO](state, userInfo) {//获取信息
      state.userInfo=this.$cookies.get('USERINFO')
    },
    [types.SET_USER_INFO](state, userInfo) { //登录成功
      state.userInfo = JSON.stringify(userInfo);
      this.$cookies.set('USERINFO',JSON.stringify(userInfo))
      this.commit(types.ISLOGIN) //及时更新登录状态
    },
    [types.ISLOGIN](state, ststus) {
      let stus =this.$cookies.get('USERINFO')
      stus=JSON.stringify(stus)
      state.status = (stus=='{}' || stus==undefined)?false:true;
    },

}

最后效果

demo

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Nuxt.js中使用Vuex,你需要按照以下步骤进行设置: 1. 首先,你需要在nuxt.config.js文件中添加Vue插件配置。你可以通过在plugins数组中添加一个对象来实现。这个对象应该具有src属性,指向你的插件文件的路径,并且ssr属性设置为false,以确保插件只在客户端渲染时执行。例如,你可以添加以下代码到nuxt.config.js中: plugins: [ { src: '~/plugins/store-cache', ssr: false }, ], 2. 接下来,你需要创建一个Vuex store文件。你可以在store目录下创建一个index.js文件,并在其中导入Vuex并创建一个新的store实例。例如: import Vuex from 'vuex' const createStore = () => { return new Vuex.Store({ state: { // 在这里定义你的状态 }, mutations: { // 在这里定义你的mutations }, actions: { // 在这里定义你的actions }, getters: { // 在这里定义你的getters } }) } export default createStore 3. 现在,你已经设置好了Vuex store。你可以在Vue组件中使用store的状态、提交mutations和触发actions了。在你的组件中,你可以通过使用$store对象来访问store。例如,你可以在computed属性中使用$store.state来获取状态,或使用$store.commit来提交一个mutation。例如: export default { computed: { currentUser() { return this.$store.state.user } }, methods: { updateUser() { this.$store.commit('updateUser', { name: 'John Doe' }) } } } 这就是在Nuxt.js中使用Vuex的基本方法。通过设置插件配置和创建store实例,你可以在你的Vue组件中使用Vuex的状态管理功能。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [nuxt-stash:Nuxt.jsVuex存储的轻量级替代](https://download.csdn.net/download/weixin_42106299/18828526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Nuxt.jsVuex数据持久化](https://blog.csdn.net/FitnessSnail/article/details/130646101)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [nuxt-typescript-demo:在Nuxt.js上使用Typescript和vuex-module-decorators的示例](https://download.csdn.net/download/weixin_42134537/18713370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值