1、vuex 是什么

实现数据共享

是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享。

概念:在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

不使用Vuex和使用Vuex:

使用Vuex统一管理状态的好处:
①能够在 vuex中集中管理共享的数据,易于开发和后期维护
②能够高效地实现组件之间的数据共享, 提高开发效率
③存储在vuex中的数据都是响应式的,能够实时保持数据与页面的同步

2、vuex 工作原理图

3、搭建vuex环境

npm i vuex

main.js

// 引入store
import store from './store'new Vue({el: '#app',render: h => h(App),store,
})

vuex 放在项目的 store文件夹中

store/index.js

import Vue from 'vue'
// 引入Vuex
import Vuex from 'vuex'
// 应用Vuex插件
Vue.use(Vuex)// 用于响应组件中的动作
const actions = {}
// 用于操作数据(state)
const mutations = {}
// 用于存储数据
const state = {}// 创建并暴露store
export default new Vuex.Store({actions,mutations,state,
})

注意:需要在 store/index.js 应用Vuex,不然在main.js 中应用Vuex,但 import store from './store'会先解析,会出错。

在文件中,import … from … 无论放任何位置,都会先被解析。

4、关于 actions、mutations、state

state

  • vuex 管理的状态对象
  • 它应该是唯一的

actions

  • 值为一个对象,包含多个响应用户动作的回调函数
  • 通过 commit( )来触发 mutation 中函数的调用, 间接更新 state
  • 如何触发 actions 中的回调?

在组件中使用: $store.dispatch(‘对应的 action 回调名’) 触发

  • 可以包含异步代码(定时器, ajax 等等)

mutations

  • 值是一个对象,包含多个直接更新 state 的方法
  • 谁能调用 mutations 中的方法?如何调用? 在 action 中使用:commit(‘对应的 mutations 方法名’) 触发
  • mutations 中方法的特点:不能写异步代码、只能单纯的操作 state

案例:

Count.vue

<template><div><h1>当前数值为:{{ $store.state.sum }}</h1><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="myclick">+</button><button @click="Waitclick">1s后+</button>
data() {return {n: 1,}
},
methods: {myclick() {// this.$store.dispatch('jia',this.n)// 若无动作,可以直接committhis.$store.commit('JIA',this.n)}Waitclick() {this.$store.dispatch('waitjia',this.n)}
}

store/index.js

import Vue from 'vue'
// 引入Vuex
import Vuex from 'vuex'
// 应用Vuex插件
Vue.use(Vuex)// 用于响应组件中的动作
const actions = {// jia(context, value) {// context.commit('JIA', value)// } waitjia(context, value) {// console.log(context)  {getters: {…}, state: {…}, rootGetters: {…}, dispatch: ƒ, commit: ƒ, …}// 业务逻辑后commitsetTimeout(() => {context.commit('JIA', value)// 也可以不按标准,直接在actions中改state,但是开发者工具是连接mutations的,开发者工具将失效,所以不要这样写。// context.state.sum += value}, 1000)}
}
// 用于操作数据(state)
const mutations = {// mutations中函数一般用大写JIA(state, value) {state.sum += value}
}
// 用于存储数据
const state = {sum: 0
}// 创建并暴露store
export default new Vuex.Store({actions,mutations,state,
})

若actions 中要处理很多业务逻辑,

则可以用到 context 中的 dispatch(),相当于用很多服务员。

// 用于响应组件中的动作
const actions = {waitjia(context, value) {console.log('处理了一些事情')context.dispatch('demo1', value)},demo1(context, value) {console.log('我又哈哈哈处理了一些事情')context.dispatch('demo2', value)}  demo2(context, value) {setTimeout(() => {context.commit('JIA', value)}, 1000)}
}

为什么逻辑要写在actions中呢,因为如果很多组件都要这个逻辑,就会每个组件都要在methods中写逻辑,很麻烦,逻辑写在actions中,就可所有组件用,方便省事。

5、getters配置项

  1. 值为一个对象,包含多个用于返回数据的函数

  2. 如何使用?—— $store.getters.xxx

getters 用于将state中的数据进行加工

const getters = {bigSum(state) {return state.sum*10}
}

使用:

<h1>数字放大10倍为:{{ $store.getters.bigSum }} </h1>

6、mapState与mapGetters

<h1>当前数值为:{{ $store.state.sum }} </h1>

<h1>数字放大10倍为:{{ $store.getters.bigSum }} </h1>

这样写很麻烦,总是有$store.state.$store.getters.

所以这样:

<h1>当前数值为:{{ aa }} </h1>

<h1>学校:{{ bb }} </h1>

<h1>数字放大10倍为:{{ cc }} </h1>

computed: {aa() {return this.$store.state.sum},bb() {return this.$store.state.school},cc() {return this.$store.getters.bigSum
}

可是这样也很麻烦,需要在computed 中写很多$store.state.$store.getters.

所以用到了mapState 与 mapGetters

Count.vue

import { mapState, mapGetters } from 'vuex'
computed: {// 借助mapState生成计算属性(对象写法)//...mapState({aa:'sum', bb: 'school'}),// 借助mapState生成计算属性(数组写法)...mapState(['sum','school']),// 即对象写法中的...mapState({sum:'sum', school: 'school'}), 可以命名相同。...mapGetters(['bigSum']),
}

x对象中放y对象,y前需要加 ... 就相当于将y展开放入x

7、mapActions与mapMutations

methods: {myclick() {this.$store.commit('JIA',this.n)},sheclick() {this.$store.commit('JIAN',this.n)}Waitclick() {this.$store.dispatch('waitjia',this.n)}
}

this.$store.commit若写很多也很麻烦,所以为了省略写this.$store.commit

用到了mapActions与mapMutations

import { mapActions, mapMutations } from 'vuex'
methods: {// (对象写法)...mapMutations({myclick: 'JIA', sheclick: 'JIAN'}),// (数组写法)// ...mapMutations(['JIA', 'JIAN']),// mapActions同上...mapActions({Waitclick: 'waitjia'}),

但是需要传值

<button @click = "myclick(n)">+</button>
<!-- (数组写法)-->
<!-- <button @click = "JIA(n)">+</button> --><button @click="Waitclick(n)">1s后+</button>

8、多组件共享数据

9、vuex模块化

看下面例子

index.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)// 引入小仓库
import home from './home'
import detail from './detail'export default new Vuex.Store({modules: {home,detail,}
})

detail.js

// detail 模块的小仓库
import {reqGoodsInfo
} from "@/api"// state:仓库存储数据的地方
const state = {goodInfo: {},
}
// mutations:修改state的唯一手段
const mutations = {GETGOODINFO(state, goodInfo) {state.goodInfo = goodInfo},}
// actions:处理action,书写自己的业务逻辑、也可以处理异步
const actions = {// 获取产品信息async getGoodInfo({commit}, skuId) {// 向服务器发请求let result = await reqGoodsInfo(skuId)if (result.code == 200) {commit("GETGOODINFO", result.data)}}
}
// getters:计算属性,用于简化仓库数据,让组件获取仓库的数据更方便
const getters = {categoryView(state) {// 需要加上 || {},否则若没请求到数据,则会报错return state.goodInfo.categoryView || {};},skuInfo(state) {return state.goodInfo.skuInfo || {};},
}// 对外暴露
export default {state,mutations,actions,getters,
}

main.js

// 引入仓库
import store from "@/store"

Dedail/index.vue

......
......
import { mapGetters } from "vuex";export default {name: "Detail",data() {return {skuNum: 1,};},mounted() {this.$store.dispatch("getGoodInfo", this.$route.params.skuid);},computed: {...mapGetters(["categoryView", "skuInfo"]),

Vuex统一管理状态相关推荐

  1. Vue + webpack 项目配置化、接口请求统一管理

    准备工作 需求由来: 当项目越来越大的时候提高项目运行编译速度.压缩代码体积.项目维护.bug修复......等等成为不得不考虑而且不得不做的问题.  又或者后面其他同事接手你的模块,或者改你的bug ...

  2. VueX(Vue状态管理模式)

    一.初识VueX 1.1 关于VueX VueX是适用于在Vue项目开发时使用的状态管理工具.试想一下,如果在一个项目开发中频繁的使用组件传参的方式来同步data中的值,一旦项目变得很庞大,管理和维护 ...

  3. 如何使用Vuex来管理应用程序的状态?

    嘿,你好啊!你想知道如何用Vuex来管理你的应用程序的状态吗?这听起来像是一个严肃的问题,但其实我们可以把它变得非常有趣! 首先,我们需要安装Vuex.你可以通过运行以下命令来安装Vuex: npm ...

  4. 前端项目统一管理API接口

    前端项目统一管理API接口 如今的前端框架层出不穷.应对的项目也是大小不一,微型的项目倒是无所谓文件结构,大多数项目我们都需要做到以下几点 规范文件目录,完善项目结构,以达到开发时思维清晰,错误定位准 ...

  5. axios封装,api接口封装统一管理

    axios封装,api接口封装统一管理 一. axios说明 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. axios的封装和api接口的统一管理, ...

  6. android自定义dialog开源库,android-dialog: 此框架提供五种对话框的显示,并支持对话框的扩展,目的是为了提供对话框的统一管理,并提供对话框显示的公共接口。...

    android-dialog 此框架提供七种对话框的显示,并支持对话框的扩展,目的是为了提供对话框的统一管理,并提供对话框显示的公共接口. LoadingDialog:正在加载对话框 MessageD ...

  7. svn如何取消某个文件的版本管理_微服务架构如何统一管理工程配置文件

    面临的问题 在分布式微服务架构系统中,业务和系统功能被拆分成了几十甚至上百个服务实例.每个服务实例就是以往单体应用时代的一个独立部署的工程.每个工程都需要自己独立的启动加载和运行时配置文件. 在项目开 ...

  8. 前端httpd+keepalived加后端heartbeat+nfs+drbd实现httpd服务的高效应用及资源统一管理...

    本文四台机器:Centos6.0 lv1.lv2两台机器做httpd的前端,使用keepalived做高可用:虚拟出一个vip供client访问. node1.node2应用drbd技术实现文件镜像存 ...

  9. 托管式服务网格:多种类型计算服务统一管理的基础设施

    王夕宁 读完需要 8 分钟 速读仅需 3 分钟 作者简介:王夕宁 阿里云高级技术专家,阿里云服务网格产品ASM及Istio on Kubernetes技术负责人,专注于Kubernetes.云原生.服 ...

最新文章

  1. python 水位_一种适用于利用图像识别水位的水位尺的制作方法
  2. xcopy 跳过已经存在的_《天官赐福》舍不得跳过的片头片尾,无别,不散唱出花城心声...
  3. James Fee’s 5 Predictions Geo for 2010 and 5 Things That Won’t Happen
  4. 十天学Linux内核之第九天---向内核添加代码
  5. shiro之自定义realm
  6. docker应用,后端服务出现OOM情况排查
  7. 三个剩两个,两个剩一个,最后一个都没剩下。
  8. mysql char 二进制_SQL:char 和 varchar、binary 和 varbinary、二进制字符串、严格模式、汉字编码方式...
  9. 闽南师范大学计算机学院研究生,闽南师范大学计算机学院2019考研调剂信息
  10. 使用Latex制作分享,演讲,Presentation用的Slides,PPT——Beamer教程
  11. Servlet过滤器Filter和监听器
  12. 计算机考试考什么二级,计算机国家二级考试会考什么内容?怎么考?
  13. 软件观念革命:交互设计精髓_交互设计基础知识整理
  14. 微信云支付的扫码支付
  15. 详解GAMIT/GLOBK软件使用
  16. oracle一次性说清楚,多种分隔符的一个字段拆分多行,再多行多列多种分隔符拆多行,最终处理超亿亿。。亿级别数据量
  17. 关于Palantir—第四部分:Palantir应用程序
  18. 中产需要盒马,盒马想要下沉
  19. 帝国CMS7.2 手机网站使用教程
  20. 我 stormzhang 来报道了!

热门文章

  1. 手动集成 Ironic 裸金属管理服务(Rocky)
  2. 小农意识-读《狼图腾》有感
  3. 通过手机号码查询归属的基础类
  4. Java开发实例大全(PDF):603个典型事例及源码分析和24个应用方向
  5. 心田花开php面试,心田花开面试试题是什么?心田花开怎么面试的?
  6. PS时间格式 Get-Date -Format yyyyMMdd-hhmm-ss-fff
  7. img图片不显示问题
  8. pandas计算含缺失值中列平均值_Pandas进阶修炼120题,给你深度和广度的船新体验...
  9. 基于Javaweb的小项目(类似于qqzone) 8 —— 回复相关操作
  10. 马上七夕了程序员如何给爱人一个浪漫表白?