nuxt在js文件中访问vuex

14 篇文章 1 订阅


nuxt因为某些特殊的原因,无法像传统的vue项目一样,在js文件中引入store文件就可以操作vuex

一. nuxt无法在js文件中直接引用vuex的原因

传统vue:

传统的vue项目需要自己在store目录下创建vuex管理文件,最后通过引入这个管理文件就可以操作vuex了

nuxt:

Nuxt.js 会尝试找到 src 目录(默认是应用根目录)下的 store 目录,如果该目录存在,它将做以下的事情:

引用 vuex 模块 将 vuex 模块 加到 vendors 构建配置中去 设置 Vue 根实例的 store 配置项

nuxt中的state必须是以函数的形式存在的

export const state = () => ({
  counter: 0
})

export const mutations = {
  increment(state) {
    state.counter++
  }
}

相比传统vue项目,nuxt的状态树是通过在store文件夹里面编写的js文件自动生成的,所以你无法通过引入store文件夹下面的文件使用vuex

二. 解决方案

1.解决思路

既然无法通过引用store文件来调用vuex,那么是否可以用别的方法代替这一步操作呢?

在查阅了无数资料过后,最终发现了一个突破口,nuxt会在实例化之后,将自身绑定到window上面,我们可以通过 window.$nuxt.$store来获取vuex实例

window.$nuxt.$store.xxx

但是当我使用这句代码的时候报了一个错误 window is not defined
在这里插入图片描述

2.解决window is not defined的问题

nuxt在渲染的时候分为客户端渲染和服务端渲染,服务端是无法获取到window对象的,所以才会报错window is not defined
想要解决这个问题需要在代码里判断一下渲染环境,使其在客户端的时候才会渲染这段代码

if(process.client) {
  console.log(window.$nuxt)
}

这时页面上已经没有报错了,但是在控制台上输出的却是 undefined
在这里插入图片描述
我一开始怀疑是不是$nuxt没有被绑定到window上,所以我又输出了一下window做了一下确认

if(process.client) {
  console.log(window)
}

可以明显的看到,window里面是有$nuxt这个参数的
在这里插入图片描述

3. 解决window.$nuxt输出为undefined的问题

接上一个问题,为什么在window里面明明绑定的有$nuxt这个参数,但是输出的值却是undefined呢?
在经历了长达十多分钟的自我怀疑中,我突然想到了一种可能,会不会是nuxt实例化太慢了,导致在js文件中输出的window虽然有 $nuxt这个参数,但是这个参数还没有完全被绑定成功?
抱着对这个问题的猜想,我在代码中加了一个延时器

if(process.client) {
  setTimeout(() => {
    console.log(window.$nuxt)
  }, 0)
}

果然,这个不要脸的家伙出现了。。。

在这里插入图片描述

三、最终效果

经过不“屑”的努力,终于把$nuxt的实例给弄出来了,看一下最终的效果

最终代码

if(process.client) {
  setTimeout(() => {
    window.$nuxt.$store.commit('user/exitLogin')
  }, 0)
}

vuex文件

在这里插入图片描述
页面效果
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
要在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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾里桃花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值