Vuex 状态管理 —— 核心store

news/2024/11/28 10:28:41/

         在上一篇当中讲到关于接口请求函数获取数据,拿到 response.data ,简化调用,那么在拿到请求的响应数据之后呢?在前面讲到组件间的通信当中,如父子通信(父传子props,子传父$emit)以及组件与组件之前不能通过直接通信,但可以通过间接的方式,即中间人模式,这种方式仍存在问题,到后续通过事件中心的方式来进行处理,这当中也反应了一些问题:1.传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。2.经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。那么Vue也提供了相应的方案 —— Vuex 状态管理模式 !

        那么在本篇当中就来开讲关于在项目当中来如何使用Vuex状态管理,这里可能有人在想是不是vue项目开发都需要使用Vuex来进行状态的管理呢,显然不是,具体什么时候用?官话如下:

        简单来讲若项目简单就不需要,建议使用store模式; 若项目较大,建议使用Vuex来管理;这个需要对项目有一定的了解以及对Vuex的了解了!才疏学浅,仅是笔者的愚见,望海涵!


安装Vuex        

npm i -S vuex

创建Vuex整体结构

        /store/index.js 这个文件是初始化项目生成的,也是Vuex最核心的管理对象store,分别将里面的核心对象作为模块来导入;可以对应的来创建这些模块文件 :

/store/state.js       —— 状态对象    
/store/getters.js      —— 基于state的getter计算属性
/store/mutaions.js    —— 直接更新state
/store/actions.js     —— 通过mutaions间接更新state/store/mutaions-types.js  —— mutaions的type名称常量

        在 /stroe/index.js 文件当中分别引入这些模块;

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import getters from './getters'
import mutations from './mutations'
import actions from './actions'Vue.use(Vuex)export default new Vuex.Store({state,getters,mutations,actions
})

state

        现在需要获取一些轮播数据列表,通过数据请求的方式获取,然后直接保存到swiperList当中,通过v-for指令渲染,那么如果需要在其他组件当中去使用的话就需要数据传递,或是重新对数据进行请求,那么这时就可以将他作为一个共享的数据,在state中来定义swiperList,而不在当前组件的data中定义;

/* state 共享数据状态 */export default {swiperList: [] // swiperList-轮播列表
}

mutation-types

        创建 /store/mutation-types.js 文件来定义mutation中的type常量,当然也可以不用,但在项目中尽可能保证项目的一个结构:

/* mutation的type常量 */export const RECEIVE_SWIPERLIST = 'receive_swiperList' // 接收轮播数据

actions

        异步请求swiperList的轮播列表数据,如果是从前面的文章内容学习到这里可能有的对于同步以及异步数据请求还不大了解,那么在后续会来将同步和异步请求;

/* 通过mutation间接更新state */import { reqSwiperList } from '../api'
import { RECEIVE_SWIPERLIST } from './mutation-types'export default {// 异步请求 —— 获取swiperList数据async getSwiperList ({ commit }) {const result = await reqSwiperList()if (result.meta.status === 200) {const swiperList = result.data.swiperListcommit(RECEIVE_SWIPERLIST, { swiperList })}}
}

[ 小白注解 ] :这个部分其实看过上一篇内容的就可能不陌生,reqSwiperList() 就是通过调用封装各接口函数中的reqSwiperList方法,现在来看一下该接口函数:/api/index.js (之前的接口省略)

/* 封装各接口函数 */
// 引入ajax接口请求函数模块
import ajax from './ajax'
export const reqSwiperList = () => ajax('/api/swiperList')

这里同时用了反向代理处理了跨域 —— 配置vue.config.js ,在前面这块内容也有详细的讲解;

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,lintOnSave: false,devServer: {proxy: {'/api': {target: 'http://127.0.0.1:3000',changeOrigin: true}}}
})

        到这里你可能就理解了reqSwiperList()这块 ,那么判断 result.meta.status 则需要看一下API文档,那么这里就直接来看一下请求回来的数据看一下吧!

          通过状态码status===200判断是否请求成功,成功会返回数据,可以看到data当中的数据,这里用的是本地搭建Node服务器,可以看一下微信小程序搭载node.js服务器(简)这篇文章搭建一下最简单的测试一下;result.data.swiperList 为什么不直接去交给state中swiper就可以了,而是要 commit ( RECEIVE_SWIPERLIST,{ swiperList } ) ,commit是提交,提交给到mutation去,并将swiperList的数据一并带过去,如果在actions直接交给state赋值,就会导致数据不在被监控了,后续出现问题会无迹可寻;进行提交到mutation;

mutation

        commit ( RECEIVE_SWIPERLIST,{ swiperList } ) 提交到 mutation 中 ;mutation可以直接来修改 state 的数据状态,所以将提交过来的数据赋值给到state.swiperList即可;

/* 直接更新state的多个方法 */
import { RECEIVE_SWIPERLIST } from './mutation-types'export default {[RECEIVE_SWIPERLIST] (state, { swiperList }) {state.swiperList = swiperList}
}

        这样一来这整个过程就到结束了,state中的swiperList就有了,下面来测试一下,通过 vue的拓展工具 devtools 来进行查看:

        下面如何来组件当中如何进行使用该共享数据呢?这里现来main.js中注册store,一般创建项目的话 store 就已经注册好了!

渲染 state 数据

1 ) 在mounted生命周期中,通过 dispatch 来触发 actions 调用 ;this.$store.dispatch()

<!-- App.vue -->
<template><div id="app"><li v-for="item in $store.state.swiperList" :key="item.goods_id"><img :src="item.imgUrl" alt=""></li></div>
</template>
<script>
export default {mounted () {this.$store.dispatch('getSwiperList')}
}
</script>

2 ) 测试运行一下:

3)现在如果不在App.vue中渲染,改在MusicView.vue组件(前面内容讲解的留下的)中去调用,需要去父传子,子传父等进行通信传递吗?不需要的,state中的数据就是共享的;下面来这个组件(MusicView.vue)中渲染,同样在 mounted 生命周期中通过 this.$store.dispatch() 来触发 actions 调用 ;

<!--MusicView.vue-->
<template><div><h3>分享音乐社区</h3><router-link to="/music/kugou" active-class="chosen_cl"><li>分享酷狗Music</li></router-link><router-link to="/music/kuwo" active-class="chosen_cl"><li>分享酷我Music</li></router-link><router-view></router-view><li v-for="item in $store.state.swiperList" :key="item.goods_id"><img :src="item.imgUrl" alt=""></li></div>
</template>
<script>
export default {mounted () {this.$store.dispatch('getSwiperList')}
}
</script>
<style lang="scss">.chosen_cl{color:skyblue;font-weight: bold;}img{width: 200px;}
</style>

        那么本篇的内容就到此结束了,讲了如何引入使用 vuex 状态管理模式,以及通过一个简单的例子,如何进行异步请求数据保存到 state 和 通过 this.$store.dispatch() 来触发 actions 的调用 ;那么可能有些读者是一些初学者或者跟着前面的篇目学习的,对于这篇的内容有点小难度,那么会在后续出这么一篇关于同步和异步请求数据的篇目加强和巩固相关知识点,最后感谢大家的支持!


http://www.ppmy.cn/news/516538.html

相关文章

【C++篇】OOP中部分:继承和派生

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

php的变量引用与销毁机制

在php中&#xff0c;符号"&"表示引用。 1、看看不引用的情况是这样子&#xff1a; $a "hello world";//定义一个变量&#xff0c;下面赋值给$b $b $a;//这一步没有在$a之前加符号&&#xff0c;像这样子"$b & $a"。没有加&&…

好消息好消息——带计算机课程的希捷移动硬盘发货啦

咱们今天&#xff0c;开门建山。我要发什么货&#xff1f; 当当当当&#xff0c;就是下面啦&#xff1a; 带有 800 G 学习资料的移动硬盘啦&#xff0c;如图。 当年为了学习计算机&#xff0c;也是在网络上&#xff0c;东拼西凑&#xff0c;好不容易找到了不少的学习资源。可惜…

我的希捷ST31000340NS,BIOS不认,磁头反复归位,BUSY模式的固件门硬盘修复成功

当初我买了2块希捷1T的硬盘&#xff0c;为了安全起见还特地加钱买了企业级的&#xff0c;没想到为日后埋下了悲剧。 首先这2块硬盘正好是固件门里面的问题盘&#xff0c;我相信了希捷官方的“不是所有人都会出问题&#xff0c;没出问题就不用升级固件”口号&#xff0c;一直没有…

希捷硬盘1T挂了(1)

一块160G的ST用了5年&#xff0c;是做系统盘用的。 这款1T的ST2013年1月买的&#xff0c;现在挂了。 前两天&#xff0c;同事反映打开文件很慢&#xff0c;有时还找不到硬盘。 今天打开系统&#xff0c;用hdtune测试&#xff0c;发现里面有很多坏扇区&#xff0c;大概有2K多个。…

希捷 sshd 微型计算机,希捷1TB SSHD拆解/核心技术分析_硬盘_内存硬盘-中关村在线...

■3.5英寸希捷1TB SSHD拆解分析 盘体和SSD模块是固态混合硬盘的两大组成部分。它的盘体采用普通机械硬盘&#xff0c;它的区别在于集成SSD模块的PCB基板。因此它的PCB基板面积显得电子元件更为密集。 主要构成&#xff1a;盘体PCB板(SSD模块) 固态混合硬盘的SSD模块作为记忆缓存…

希捷1TB硬盘正式发布

随着全球范围内数字内容的迅猛增长&#xff0c;希捷科技公司(NYSE:STX)日前宣布为各种企业和台式电脑应用提供行业领先的集容量、性能、可靠性为一体的1TB硬盘。 数字内容在家庭和办公室的爆炸性增长带动了市场对大容量硬盘的迫切需求。企业和消费者不断制造和消费着惊人的数字…

二分查找算法及实现

概念 二分查找算法也成为折半查找,是一种非常高效的工作于有序数组的查找算法. 实现 需求 现有一个有序数组 arr [1,2,3,4,5,6,7,8,9], 目标值target 2 ,要求返回目标值target在数组arr中的索引,没有则返回-1; 代码实现 private int binarySearch(int[] arr, int target)…