nuxt 实现在其它js文件中使用store的方式


Posted in Javascript onNovember 05, 2020

前言

在新建的js文件中想用store里面的数据,比如token想在封装的axios里面,请求头里面去使用,亦或者通过app的JS接口获取token并存储在store里面。

我们都知道如何在vue中如何使用。

代码

/*
 * @Description: 
 * @Author: lxc
 * @Date: 2019-07-02 16:14:07
 * @LastEditTime: 2019-08-14 16:08:19
 * @LastEditors: lxc
 */
// 导出 store 的地方

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import actions from './actions'
import mutations from './mutations'
import getters from './getters'
import canteen from './modules/canteen'
import contact from './modules/contact'
import health from './modules/health'
import scan from './modules/scan'

Vue.use(Vuex)

let store
const initStore = () => {
 return store || (store = new Vuex.Store({
 // 存放公用数据
 state,
 // 异步操作要通过actions,否则通过cimmit直接操作mutations
 actions,
 // 同步放数据
 mutations,
 getters,
 modules: {
  // store 模块....
 }
 }))
}
export default initStore

其它js文件中如何调用:

import store from '@/store'
const TOKEN = 'testToken'

// 这里只是举个例子
function getToken() {
 return isNotEmpty(store().state.token) ? store().state.token : TOKEN
}

我自己使用是可以的。希望对大家有帮助。

补充知识:nuxt如何处理用户登录状态持久化:nuxtServerInit 页面渲染前的store处理

在一般的vue-cli项目中,我们可以用vuex-persistedstate,它可以使vuex的状态持久化,页面刷新都不会丢失,原理当然是localStorage啦!

当然也可以使用vue-cookies进行保存token,那么问题来了,nuxt项目怎么保存登录状态呢?

虽然上面这两种方法我们都可以使用,但是有个问题,由于在created钩子中不存在window对象(获取cookie、localStorage都需要window对象),比如想要获取登录状态即判断是否存在token时,只能在mounted中进行操作,但这样又会引发一个问题,就是进页面的一瞬间还是无法得知登录状态,体验上会有影响,会存在显示用户名等组件显示隐藏延迟。

nuxt非常友好,它提供了fetch钩子,还有nuxtServerInit,这两个钩子都运行在服务端并且我们能很快速地操作store

1、fetch的使用

如果页面组件设置了fetch方法,它会在组件每次加载前被调用(在服务端或切换至目标路由之前),此方法需要跟服务端的人员配合

<script>
export default {
 async fetch ({ app, store, params }) {
 let { res } = app.$axios.get('/token');
 store.commit('setToken', res.data.token);
 }
}
</script>

2、nuxtServerInit

状态树文件中指定了nuxtServerInit方法,nuxtJs调用它的时候会将页面的context上下文对象作为第2个参数传给它以供服务端调用,与fetch一样,不包括context.redirect和context.error方法,具体哪些参数可以查看官方文档。

当我们想要将服务端的一些数据传到客户端,可以通过这个获取保存在状态中,客户端再从状态里取出来就好了。

nuxtServerInit:先把token存入cookie,这样每次请求都会自带cookie,那么利用nuxtServerInit里的参数 {req, res},去获取到请求附带的cookie,然后解析出token,然后再存入vuex。

推荐使用cookie插件cookie-universal-nuxt

<script>
import Vuex from 'vuex'
 
let store = () => new Vuex.Store({
 state: {
 token: ''
 },
 mutations: {
 setToken (state, token) {
  state.token = token
 }
 },
 actions: {
 nuxtServerInit({ commit }, { req }) {
  let cookie = req.headers.cookie;
 
  // 将cookie转成json对象(自己实现该方法)
  let token = cookieparse(cookie).token;
  commit('setToken', token);
 },
 }
})
 
export default store
</script>

context上下文对象:

属性 类型 可用 描述
app vue根实例 客户端 & 服务端 包含所有插件的根实例。例如:想使用axios,可以通过context.app.$axios获取
isClient Boolean 客户端 & 服务端 是否来自客户端渲染,废弃,请使用process.client
isServer Boolean 客户端 & 服务端 是否来自服务端渲染,废弃,请使用process.server
isStatic Boolean 客户端 & 服务端 是否通过nuxt generate
isDev Boolean 客户端 & 服务端 是否开发模式,在生产坏境的数据缓存中用到
isHMR Boolean 客户端 & 服务端 是否通过模块热替换,仅在客户端以dev模式
route 路由 客户端 & 服务端 路由实例
store vuex数据 客户端 & 服务端 Vuex.sttore实例
env l Object 客户端 & 服务端 nuxt.config.js中的环境变量
params Object 客户端 & 服务端 route.params的别名
query Object 客户端 & 服务端 route.query的别名
req http.Request 服务端 Node.js API的Request对象。如果nuxt以中间件形式使用的话,这个对象就根据你所使用的框架(个人理解为页面)而定。nuxt generate 不可用
res http.Reponse 服务端 Node.js API的Reponse对象。如果nuxt以中间件形式使用的话,这个对象就根据你所使用的框架(个人理解为页面)而定。nuxt generate 不可用
redirect Function 服务端 用于重定向另一个路由,状态码在服务端被使用,默认302 redirect([status,]path[,query])
error Function 客户端 & 服务端 前往错误页面,error(parmas),params包含statusCode和message字段
nuxtState Object 客户端 nuxt状态
beforeNuxtRender(fn) Function 服务端 更新NUXT在客户端呈现的变量,具体了解请看官网

以上这篇nuxt 实现在其它js文件中使用store的方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE和Mozilla的兼容性汇总event
Aug 12 Javascript
jQuery 扩展对input的一些操作方法
Oct 30 Javascript
js自动生成对象的属性示例代码
Oct 28 Javascript
Extjs4.0 ComboBox如何实现三级联动
May 11 Javascript
基于JS实现checkbox全选功能实例代码
Oct 31 Javascript
jquery 键盘事件的使用方法详解
Sep 13 jQuery
快速将Vue项目升级到webpack3的方法步骤
Sep 14 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
May 28 Javascript
js canvas画布实现高斯模糊效果
Nov 27 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
Sep 03 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
Jan 08 Javascript
uin-app+mockjs实现本地数据模拟
Aug 26 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
Nov 05 #Javascript
vue实现点击出现操作弹出框的示例
Nov 05 #Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
Nov 05 #Javascript
Vant 在vue-cli 4.x中按需加载操作
Nov 05 #Javascript
前端vue如何使用高德地图
Nov 05 #Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
Nov 05 #Javascript
vue 全局封装loading加载教程(全局监听)
Nov 05 #Javascript
You might like
坏狼的PHP学习教程之第2天
2008/06/15 PHP
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
php按单词截取字符串的方法
2015/04/07 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
python exit出错原因整理
2020/08/31 Python
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
校庆活动方案
2014/03/31 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
反邪教学习心得体会
2016/01/15 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android