nuxt 踩坑之 -- Vuex状态树的模块方式使用

【11】Vuex 状态树 Vuex 状态树 对于每个大项目来说,使用状态树 (store) 管理状态 (state) 十分有必要。这就是为什么 Nuxt.js 内核实现了Vuex。 在Vue School 上观看关于Nuxt.js 和 Vuex的免费课程 使用状态树 Nuxt.js 会尝试找到应用根目录下的store目录,如果该目录存在,它将做以下的事情: 引用vuex模块 将vuex模块 ... 阅读详情

初次看到这个模块方式,感觉很是新奇,之前的vuex状态树使用方法用的也有些腻了,就想来实践一发新的东西
废话不多说,直接进入正题

Vuex状态树-模块方式官方文档解读

  1. 状态树还可以拆分成为模块,store 目录下的每个 .js 文件会被转换成为状态树指定命名的子模块
    • 这句话啊,看了半天,我都没绕出来。之前一直用的是store目录下文件为:index.js、state.js、mutations.js、actions.js。后三个是index.js的子模块,你说这每个js文件都是一个模块?懵逼一分钟
    • 继续往下:使用状态树模块化的方式,store/index.js 不需要返回 Vuex.Store 实例,而应该直接将 state、mutations 和 actions 暴露出来。 到这里我虽然还懵逼着,但是转念一想,nuxt还有这操作,都不用我们自己辛辛苦苦写export default store = () => new Vuex.Store({}) 了,倒也真的省事儿呢
    • 还是继续看例子吧,官方给的这个,看了一遍没看懂(笨小孩的世界真滴难),你这index.js不是Vuex默认的store文件么,再来一todos.js,同样暴露出去的对象,不应该是index.js同级的么
    • 重点来了,看不会不要紧,照猫画虎我还是会滴~

照猫画虎

// store/index.js
export const state = () => ({
  num: 0
})

export const mutations = {
  increment (state) {
    state.num ++
  },
  decrement (state) {
    state.num --
  }
}


// store/plus.js
export const state = () => ({
  plusNum: 1
})

export const mutations = {
  plus (state) {
    state.plusNum ++
  }
}

// store/minus.js
export const state = () => ({
  minusNum: 10
})

export const mutations = {
  minus (state) {
    state.minusNum --
  }
}

// pages/store.vue
<template>
  <section class="container">
    <table>
        <tr>
            <td colspan=4>vuex状态树使用</td>
        </tr>
        <tr>
            <td>页内数据</td>
            <td>index.js</td>
            <td>plus.js</td>
            <td>minus.js</td>
        </tr>
        <tr>
            <td>{{ count }}</td>
            <td>{{ $store.state.num }}</td>
            <td>{{ $store.state.plus.plusNum }}</td>
            <td>{{ $store.state.minus.minusNum }}</td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
    </table>
  </section>
</template>
  • 跑一下,唷!报错了,我说同学们啊,我写的真的没有错!!!
  • 好吧,报错内容:[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.
  • 意思是我客户端和vue SSR生成的DOM不一样,客户端不也是SSR生成的,这是个问题,有知道的大佬,希望可以告诉我。
  • 不过这个问题我倒是解决了,虽然不知道问什么-_-!,把那一大堆的tr标签都放到tbody里面就OK了
  • 跑起来,没问题,按示例的写法,这样成功拿到了state的数据
  • 接着试试mutation的方法
<tr class="mutation-fun">
    <td @click="count ++">count ++</td>
    <td @click="$store.commit('increment')">increment</td>
    <td @click="$store.commit('plus')">plus</td>
    <td @click="$store.commit('minus')">minus</td>
</tr>
  • 报错:[vuex] unknown mutation type: plus
  • 修改下:
<tr class="mutation-fun">
    <td @click="count ++">count ++</td>
    <td @click="$store.commit('increment')">increment</td>
    <td @click="$store.commit('plus/plus')">plus/plus</td>
    <td @click="$store.commit('minus/minus')">minus/minus</td>
</tr>
  • 搞定~

自己先小结下这个模块怎么用的吧

  1. nuxt很贴心的帮我们省去了返回Vuex实例的代码,我们可以不用去写了
  2. 只有store文件夹下的index.js是一级的vuex状态,其他的js文件都是二级的状态树。(能不能有三级的我不知道,不过感觉没必要,哈哈哈!!)
  3. 每个状态树文件都可以包含state,mutation,action
  4. 使用二级状态树的state用: $store.state.文件名.变量名
  5. 使用二级状态树的mutation用: $store.commit(‘文件名/变量名’)
  6. 使用二级状态树的action用: $store.dispatch(‘文件名/变量名’)

官方示例没有提到的

  1. 二级状态树能调用一级状态树的state和mutation以及action吗?
    • 我们来给plus.js增加一个修改index.js中的state的方法plusIndex
export const state = () => ({
  plusNum: 1
})

export const mutations = {
  plus (state) {
    state.plusNum ++
  },
  plusIndex (state) {
    state.num ++
    console.log('点击递增index的num')
  }
}
  • 去试着调用了一下,文本打印出来了,也没有报错,但是完全获取不到index中的num哇~~
  • 这次聪明点儿,我直接把state打印出来:
export const state = () => ({
  plusNum: 1
})

export const mutations = {
  plus (state) {
    state.plusNum ++
  },
  plusIndex (state) {
    console.log('state: ', state)
    state.num ++
  }
}
  • 跑一下试试: 结果有点儿让人想哭:state: {num: NaN, plusNum: 1}。再看看页面上index.js对应的num依然是0,这就说明我们这里的num不是index.js里的num,而是下面state ‘.’(点)出来的num,并且没有给初始值就执行了一次 ++ ,所以值为NaN
  • 到这里,我已经大概猜测到了这里的弯弯绕是怎么回事儿了 –> 模块儿的作用域是本文件内。但编程不是靠猜的,要用实践证明的才是对的,下面在深究这个问题

    1. 反过来,一级状态树能调用二级状态树的state和mutation以及action吗?
  • 这里的情况跟上面一样,既然我们的这个store是模块方式生成的,那就要遵循模块化的规范,变量作用域只能在文件内

通过模块化编程规范来获取一级状态树的state

  • 先把index.js引过来,因为不放心引用过来的还是不是原来那个index.js,所以把它打印出来看看
const indexVuex = require('./index.js')
console.log('indexVuex: ', indexVuex)
  • 这下不就炸了嘛,我引过来的居然是一个空的vuex状态树!!!内容长这样子
{
    mutation: {},
    modules: {
        plus: {
            mutation: {},
            namespaced: true
        },
        minus: {
            mutation: {},
            namespaced: true
        }
    },
    namespaced: true
}
  • 好吧,我这个用模块化的方式来使用其他文件内的变量的想法也是泡汤了

最后的让步,我在组件中调用状态树时再去用二级状态树的方法修改一级状态树的state,先试试:

// plus.js
export const state = () => ({
  plusNum: 1
})

export const mutations = {
  plus (state) {
    state.plusNum ++
  },
  plusIndex (state, meio) {
    meio ++
    console.log('meio: ', meio)
  }
}

// 调用:
<td @click="$store.commit('plus/plusIndex', $store.state.num)">递增index的num</td>
  • 点击后,依然没能修改index.js中的num,查看打印结果中一直都是1,也就是说我们传进去的是基本数据类型的0~~
  • 那修改一下,我们传进去一个引用数据类型的看看可以不
// plus.js
export const state = () => ({
  plusNum: 1
})

export const mutations = {
  plus (state) {
    state.plusNum ++
  },
  plusIndex (state, meio) {
    meio.num ++
    console.log('meio: ', meio.num)
  }
}

// 调用:
<td @click="$store.commit('plus/plusIndex', $store.state)">递增index的num</td>
  • 功夫不负有心人,终于是成功了,虽然这样很麻烦,但也起到了效果
  • 这里经验证:反过来一级状态树调用二级状态树也是一样的,代码就不贴了

小结一下

  1. vuex状态树的模块写法,不同的文件之间不能直接引用
  2. vuex状态树使用模块加载引用,得到的是一组命名空间,而不是最终生成的Vuex模块文件
  3. 要通过b文件修改其他文件的state需要在store外部去修改

最后,小小的STAR下

  1. 情境(situation):粗略的看完一遍NUXT的官方文档,回头把不太清楚的东西再整理一下,这儿就卡在Vuex状态树的的模块写法上
  2. 任务(task):通过各种方法弄明白NUXT的Vuex状态树的模块写法是怎么实现的
  3. 行动(action):第一步,参照官方示例先让自己的状态树能运行起来;第二步,与普通写法的状态树写法比较并举一反三,看看模块写法和普通写法的状态树在使用上有什么区别和需要注意的
  4. 结果(result):第一,学会了vuex状态树的模块写法和用法;第二,通过探索store目录下的不同文件之间是否可以互相引用以及模块引用来熟悉模块方式的写法和普通方式的区别,也找到了模块写法中修改其他模块的state的方法;第三,模块写法的优点:写法简单,结构清晰明了,符合现在模块化开发;同文件(模块)内部类似普通写法,可按业务模块划分Vuex模块,提高开发效率;还有一点儿,我觉得这样写省事儿,也好看-,-| 妈妈再也不用担心我所有的Vuex都放同一个文件中,要用时还得找半天了~~

===============================================================================
以上!下期再见!
初学者,问题还很多,欢迎各位大神拍砖指导

Nuxt.js入门安装及灵活使用 Nuxt.js1、 案例入门1.1、create-nuxt-app 介绍1.2、安装1.3 启动1.4、访问2、目录结构2.1、 目录1.2、别名3、路由3.1、路由概述3.2、基础路由3.3、动态路由3.4、动态命名路由3.5、默认路由3.6、嵌套路由3.7、过渡动效3.7.1 全局过渡动效设置3.7.2、 自定义动画4、视图4.1、默认模板4.2、默认布局4.2.1、 布局概述4.2.2、 布局分析4.2.3、 公共导航4.3、自定义布局4.4、错误页面4.5、Nuxt组件特殊配置4.5.1、 模板代码 阅读详情

相关推荐

数字IC后端实现 | Innovus各个阶段常用命令汇总

数字IC后端设计实现之Innovus常用命令汇总

weixin_37584728的博客 7337

nuxt——vuex的使用

store/index.js内置 export const state = () => ({ // 这里是全局数据保存的地方 token:'', userInfo: {}, }) // 修改state里面的函数必须用到mutations里面的函数 export const mutations = { setUserInfo(state, data) { // 每个 mutation 函数都可以接受到两个参数 // 第一个是 state

xiaoququ的博客 1706

避开这些坑,你的Python爬虫才能稳定爬取IEEE Xplore(含反爬策略与MongoDB存储实战)

本文详细介绍了如何构建稳定的Python爬虫系统以爬取IEEE Xplore学术论文,包括反爬策略、MongoDB存储优化和断点续传机制。通过动态等待时间算法、请求头指纹管理和会话保持策略,有效应对IEEE的反爬机制。同时,优化MongoDB数据结构和索引,提升存储效率。最后,强调法律合规与伦理考量,确保爬虫合法合规运行。

weixin_29031057的博客 1096

nuxt项目中使用store

使用npx 由于nuxt项目创建项目以后,内部已自动集成store,所以无需再单独安装和引入

李知恩李知金 3233

Cisco思科 电子科技大学计算机网络 SRWE 期末技能考试 (PTSA)

电子科技大学2024春_SRWE_计算机网络系统 SRWE 期末技能考试 (PTSA)

2301_76745065的博客 5098

数据湖是什么?有什么优势?与数仓区别?未来的发展?

数据湖是什么?有什么优势?与数仓区别?未来的发展?一、什么是数据湖二、数据湖的发展三、数据湖有哪些优势四、数据湖应该具备哪些能力五、数据湖的实现遇到了哪些问题六、数据湖与数据仓库的区别七、为什么要做数据湖?区别在于?八、数据湖挑战九、湖仓一体十、目前有哪些开源数据湖组件 来源:大数据DT 一、什么是数据湖 数据湖是一种不断演进中、可扩展的大数据存储、处理、分析的基础设施;以数据为导向,实现任意来源、任意速度、任意规模、任意类型数据的全量获取、全量存储、多模式处理与全生命周期管理;并通过与各类外部异构数据

一个写湿的程序猿 9154

Vuex详细使用(包含分模块开发)

目录Vuex概述state状态概念​编辑mapState辅助函数Mutations概念携带单个参数携带多个参数mapMutations辅助函数action概念mapActions辅助函数getters概念module模块概念模块state访问模块getters访问模块mapMutations访问模块mapActions访问

weixin_54673155的博客 695

2025华为od面试手撕代码【求字符串表达式结果】

2025华为od面试手撕代码【求字符串表达式结果】

MISAYAONE的博客 1354

nuxt数据交互

nuxt数据交互

kedouwo的博客 440

SAP FI 会计科目表(COA)可直接套用配置模板

摘要:本文提供了SAP S/4HANA环境下可直接套用的会计科目表(COA)配置模板,包含科目编码规则、号段规划、科目组设置等核心内容。模板采用10位数字编码,按资产(1000)、负债(2000)、权益(3000)、成本(4000)、收入(5000)、费用(6000)六大类划分号段,并预设科目组控制字段状态。适用于集团/单一公司、国内/跨国企业场景,支持多表架构映射,配置完成后可通过事务码SAKO验证科目清单。模板遵循"前4位固定一级科目"原则,企业可根据行业特性调整明细科目。

金牌架构师 269

R语言Dunnett’s检验实战:寻找差异组之间的效果

总结起来,本文以R语言为工具,演示了如何使用Dunnett’s检验来找出单因素方差分析中不同组之间的效果差异。在本篇文章中,我们将通过R语言实战演示如何使用Dunnett’s检验来寻找不同组之间的效果差异。在分析结果时,通常我们会关注具有显著差异的组别,并基于Dunnett’s检验结果进行进一步的解释和讨论。首先,我们需要准备一组数据,假设我们有一个实验,涉及到四个不同的处理组和一个对照组。当我们发现方差分析结果显示存在显著差异时,我们可以进一步进行Dunnett’s检验来确定具体哪些组之间存在差异。

CoderExtra的博客 1104

掌握 Nuxt 3 中的状态管理:实践指南

摘要:该文指南详述了Nuxt 3的概况与安装,聚焦于在Nuxt 3框架下运用Vuex进行高效的状态管理,涵盖基础配置、模块化实践至高阶策略,助力开发者构建高性能前后端分离应用。

https://blog.cmdragon.cn/ 1388

基于STC8A8K64S4A12的掉电唤醒定时器应用,极大降低产品功耗

通过合理的配置和编程,我们可以充分发挥单片机的功能,实现能效优化和电池寿命延长的目标。其中,掉电唤醒定时器是其一项重要功能,可以在系统处于睡眠状态时通过定时器的计时功能进行唤醒,从而实现对系统功耗的有效控制。使用STC8A8K64S4A12的掉电唤醒定时器功能,我们可以在不影响系统正常工作的情况下,大大降低产品的功耗。通过以上的代码,我们实现了一个简单的掉电唤醒定时器功能。当系统进入睡眠模式后,定时器开始计时,到达预设的唤醒时间后,定时器中断被触发,系统从睡眠模式唤醒,执行相应的操作。

CodeSageX的博客 1091

vuex模块化 怎么引用state_nuxt踩坑之Vuex状态树的模块方式使用详解

nuxt踩坑之Vuex状态树的模块方式使用详解发布于 2020-3-17|复制链接摘记: 初次看到这个模块方式,感觉很是新奇,之前的vuex状态树使用方法用的也有些腻了,就想来实践一发新的东西废话不多说,直接进入正题Vuex状态树-模块方式官方文档解读状态树还可以拆分成为模块,store 目录下的每个 .js 文件会被转换成为状态树指定命名的子模块这句话啊,看了半天,我都没绕出来。之前一直用的是s...

weixin_39717029的博客 820

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

在Nuxt.js如何使用Vuex最新教程

简介

往事不回头,余生不将就 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Nuxt中vuex的定义与使用——nuxt2

= 注意state需要是一个函数 ==定义全局的store:// state —— Nuxt要求必须是一个函数})},// action/*** nuxtServerInit是store的初始化钩子, 初始化内容到store中* @param {*} store store的实例对象* @param {*} context 上下文(服务端所有的数据信息)*/// getters"显示" : "隐藏"子模块:以为例定义user页面的store:err:1,

mantou_riji的博客 955

Nuxt中如何使用Vuex-Store异步获取数据

Nuxt是一个基于Vue.js的通用型框架,它集成了使用Vue开发的绝大数组件/框架。 长话短说如何在Vuex-store中获取异步数据呢? 在Nuxt中由于集合了Vuex还有其他的一些配置,大大的方...

weixin_39037804的博客 2569

html页面使用vuex,Nuxt项目中使用vuex

Nuxt项目中使用vuexNuxt.js 内置引用了 vuex 模块,所以不需要额外安装。Nuxt.js 会尝试找到应用根目录下的 store 目录,如果该目录存在,它将做以下的事情:引用 vuex 模块将 vuex 模块 加到 vendors 构建配置中去设置 Vue 根实例的 store 配置项Nuxt.js支持两种store的使用方式普通方式: store/index.js, 返回一个vue...

weixin_35825868的博客 1018

Nuxt项目整合vuex

精选30+云产品,助力企业轻松上云!>>> Nuxt...

兮赫的博客 1451

nuxt环境下使用vuex

nuxt环境下使用vuex

m0_54557822的博客 725

Nuxt vuex状态树bug

nxut  的 状态树 官方网站有个BUG。 竟然说不用  引入 vuex,比较坑的 ,其实是他那套nuxt-community/starter-template 不用引入而已, 如果你从头开始搭建 是要引用的, npm install vuex --save        ...

muzidigbig的博客 584

nuxt vuex状态树bug

nxut  的 状态树 官方网站有个BUG。 竟然说不用  引入 vuex,比较坑的 ,其实是他那套nuxt-community/starter-template 不用引入而已, 如果你从头开始搭建 是要引用的, npm install --save vuex 自学的孩子伤不起,哎~~~~博主这种踩坑精神 你不点赞良心过的去吗 好,点不点赞看你了,或者 可以加入 我的

xuelang532777032的博客 1196

Nuxt.js中让vuex数据持久化,实测管用

首先对百度上搜到解决方案的可用性做下详解 1.vuex-persistedstate配合js-cookie 地址:nuxt中vuex数据持久化 可用性:不可用,按照文中的方法配置仍然出现找不到window对象的情况。在配置插件的时候配置了ssr: false,仍然找不到window对象,推测可能是Nuxt或Vuex的版本问题(注:这篇文章是19年12月的) 2.nuxtServerInit方法配合cookie-universal-nuxt 地址:vuex状态持久化在vue和nuxt...

Daydream的博客 2711

【Nuxt】02 Nuxt2项目搭建与配置、路由使用、生命周期、国际化等

Nuxt.js 是一个基于 Vue.js 的通用应用框架。本文主要介绍Nuxt的项目搭建、项目配置、开发使用,路由管理、vuex、国际化等配置。

ColdCoder的博客 9877

nuxt与vue的区别

1、路由 nuxt按照 pages 文件夹的目录结构自动生成路由 http://localhost:3000/user/reg 相当于 去访问 pages文件夹 下的 user文件夹 下的 reg.vue vue需在 src/router/index.js 手动配置路由 2、入口页面 nuxt页面入口为 layouts/default.vue vue页面入口为 src/App.vue 3、nuxt 类似 router-view , nuxt-link 类似 router-link 4、webpack配置 n

浮游的博客 1万+
上一篇: nginx 安装、配置、负载均衡、反向代理<二>
下一篇: Javascript面向对象编程之工厂模式、构造函数和ES6的class类
EricLua
博客等级 码龄10年 34粉丝 33原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值