一、定义

官网:Vuex 是什么? | Vuex (vuejs.org)

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

二、安装

cdn

<script src="/path/to/vuex.js"></script>

npm (@3是为了指定版本,否则装的是最新版)

做过淘宝镜像的使用cnpm命令,如果没有做过,请使用npm命令

cnpm install vuex@3 --save

三、特点

这个状态自管理应用包含以下几个部分(也是特点,从官网获取):

  • state,驱动应用的数据源;(也就是说state的用来放状态数据的)

  • view,以声明方式将 state 映射到视图;(也就是将state的数据展示在浏览器的内容中)

  • actions,响应在 view 上的用户输入导致的状态变化。(用户需要通过actions来触发改变状态数据)

以下是一个表示“单向数据流”理念的简单示意图(从官网获取):因其顺序不可逆,所以是单向数据流

为了解决遇到多组件共享状态时,依旧维持单向数据流的简洁性,以及保持视图和和状态间的独立性,我们将组件的共享状态抽取出来,形成一个全局单例模式管理。这样,我们的代码将会变得更结构化且易维护。(此为阅读官网后的个人理解,如有错误请指正,谢谢♪(・ω・)ノ)

如下图:

Vue Components:组件。最终将数据呈现在视图中。所以数据Render(渲染)出来。

此结构也是不可逆的,再次证明其是是单向数据流的形式。

如果用户需要改变数据的流程:需要通过Dispatch方式去改,把最新值给到Actions。再通过Commit将数据提交给Mutations,其作用是专门修改state状态数据。此时state的值就是最新值,然后再次Render(渲染)给Vue Components

Backend API:接口。在Actions这块,我们可以做一些异步交互请求操作,拿到最新值。

Devtools:调试工具。我们可以通过调试工具看Mutations的最新值和旧值。

四、vuex的应用

每一个 Vuex 应用的核心就是 store(仓库)。——> 使用Vuex的目的就是为了得到store仓库

“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)

Vuex 和单纯的全局对象有以下两点不同:

  1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

  1. 改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。

引入vuex和创建store对象不需要自己写,在Vue自主搭建项目的时候就可以自动生成基本结构。链接请点:Vue自主搭建项目

4.1引入。(引入后就可以在任何组件中拿到状态数据了)

以下为自主搭建好的项目demo中,store文件夹里index.js的格式(注释是我自己写的)

1. 引入vuex及创建并导出store对象

import Vue from 'vue'
// 引入vuex
import Vuex from 'vuex'Vue.use(Vuex)// 创建store对象
/*** 接收参数:Object* 该对象包含5个核心:state,actions,mutations,getters,modules*/
export default new Vuex.Store({/*** 存放状态数据*/state: {},getters: {},mutations: {},actions: {},modules: {}
})

2.在入口文件main.js中引入store并放入vue实例当中(此结构也是自动生成)

import Vue from 'vue'
import App from './App.vue'
import router from './router'
// 1.引入store
import store from './store'Vue.config.productionTip = falsenew Vue({router,// 2.再将store放入vue实例当中store,render: h => h(App)
}).$mount('#app')

4.2使用

  1. 基础配置:

在src目录下创建pages文件夹,在pages文件夹中创建Box1.vue文件,建好基本结构。要访问Box1里的组件需要先在router的index.js中引入组件以及配置规则。

(此前要在App.vue文件中设置路由出口<router-view></router-view>)

<template><div><router-view></router-view></div>
</template>

Box1.vue

<template><div><h2>Box1组件</h2></div>
</template><script>
export default {}
</script><style></style>

index.js

// 引入组件
const Box1=()=>import('@/pages/Box1')// 规则
const routes = [{path: '/box1',component: Box1},
]
  1. 通过State将数据渲染到页面中。(mapState辅助函数)

当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键。

1)在Box1.vue中导出辅助函数mapState。接收参数:[ ]/{ },返回值:对象

import { mapState } from 'vuex'

2)在计算属性computed中使用辅助函数

 computed:{...mapState({//:左侧为自定义属性名  :右侧为映射到state中的属性名newName:'name',age:'age'})}

3)Box1.vue全部代码

<template><div><h2>Box1组件</h2><div>name值:{{ newName }}</div><div>age值:{{ age }}</div></div>
</template><script>
// 导出辅助函数mapState
import { mapState } from 'vuex'
export default {computed:{...mapState({//:左侧为自定义属性名  :右侧为映射到state中的属性名newName:'name',age:'age'})}
}
</script><style></style>

此时页面中为:

  1. 提交修改数据Actions

1)actions作用:(1)commit mutations (2)异步请求 (3)自调

2)actions使用:(1)方法名自定义 (2)系统自动注入参数:context。context中有commit方法、 dispatch方法、state属性

声明两个自定义方法并提交修改数据:

    nameActions(context,name){//console.log(context);//console.log(name);//提交mutations中的事件  参数:值(字符串形式)context.commit('changeName',name)},ageActions(context,age){context.commit('changeage',age)},

3)在Box1.vue中加入button按钮以及使用dispatch方法。

dispatch作用:映射actions中的事件

dispatch参数:事件名(字符串形式)、修改的数据

 <button @click="changeName('wsx')">修改name</button>  methods:{changeName(name){this.$store.dispatch('nameActions',name)},changeage(age){this.$store.dispatch('ageActions',age)}}

此时点击修改name按钮就能在控制台拿到要修改的name值。

4.修改state状态数据mutations

方法名自定义,系统自动注入参数state。

actions中的 context.commit('changeName',name)代码将要修改的name值提交给mutations。(age值一样)

需要在mutations中定义的方法里接收name和age值。

  // 作用:专门修改state状态数据mutations: {/*** 1.方法名自定义* 2.系统自动注入参数state*/changeName(state,name){// state中的name属性=新的name值state.name=name},changeage(state,age){state.age=age}},

点击按钮修改成功如下:

五、代码总结

Box1.vue

<template><div><h2>Box1组件</h2><div>name值:{{ newName }}</div><div>age值:{{ age }}</div><button @click="changeName('wsx')">修改name</button><button @click="changeage(26)">修改age</button></div>
</template><script>
// 导出辅助函数mapState
import { mapState } from 'vuex'
export default {computed:{...mapState({//:左侧为自定义属性名  :右侧为映射到state中的属性名newName:'name',age:'age'})},methods:{changeName(name){this.$store.dispatch('nameActions',name)},changeage(age){this.$store.dispatch('ageActions',age)}}
}
</script><style></style>

index.js

import Vue from 'vue'
// 引入vuex
import Vuex from 'vuex'Vue.use(Vuex)// 创建store对象
/*** 接收参数:Object* 该对象包含5个核心:state,actions,mutations,getters,modules*/
export default new Vuex.Store({/*** 存放状态数据*/state: {name:'pjm',age:'24'},getters: {},// 作用:专门修改state状态数据mutations: {/*** 1.方法名自定义* 2.系统自动注入参数state*/changeName(state,name){// state中的name属性=新的name值state.name=name},changeage(state,age){state.age=age}},/*** actions作用:1.commit mutations  2.异步请求  3.自调*/actions: {/*** 1.方法名自定义* 2.系统自动注入参数:context* 3.context:{commit,dispatch,state}*/nameActions(context,name){/* console.log(context);console.log(name); *//*** 提交mutations中的事件* 参数1 mutations中的事件 值->字符串*/context.commit('changeName',name)},ageActions(context,age){context.commit('changeage',age)// console.log(context);},},modules: {}
})

vuex3的介绍与state、actions和mutations的使用相关推荐

  1. 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)

    前情提示:有一天,我要实现一个效果→点击某个按钮改变一个全局变量,并且要让绑定了该变量的所有位置异步渲染.我试过用一个全局的js文件存放该变量,该变量值虽然改变了,但是没有做到异步渲染.接着我用win ...

  2. 在vue组件中使用vuex的state状态对象的5种方式

    下面是store文件夹下的state.js和index.js内容 state.js //state.js const state = {headerBgOpacity:0,loginStatus:0, ...

  3. 记录一位社招面试腾讯成功拿到offer的面试内容及收集的答案(上)

    //   以下记录 是为了 以后如果有机会面试大厂 起码了解一些 作为合格前端应该掌握的知识点  勉励自己 //   对了 还有平时 对用到的专有名词及缩写 请查清全称及读音 否则面试的时候 真的画面 ...

  4. vue怎么引入js文件_Vue核心知识:8.3 vuex在vue-cli中的应用,文件之间的导出与引入...

    问题:vuex在vue-cli中的应用 第一步:npm下载vuex资源包: npm install vuex --save 第二步:在 src/main.js 中引入 import Vue from ...

  5. vue根据url获取内容axios_vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据...

    在vue项目中组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的话,有必要考虑引入vuex来管理这些凌乱的状态,今天这边博文用来记录这一整个的过程,后台api接口是使用webpack-se ...

  6. vue 导出_Vue核心知识:8.3 vuex在vue-cli中的应用,文件之间的导出与引入

    问题:vuex在vue-cli中的应用 第一步:npm下载vuex资源包: npm install vuex --save 第二步:在 src/main.js 中引入 import Vue from ...

  7. vue 将数据保存到vuex中

    在项目中遇到这样一个问题,就是在登入的时候同时需要从后台获取到左边的导航,但是如果使用h5的localStorage来保存导航信息,会出现app加载进去之后localStorage才保存进浏览器,在m ...

  8. vue踩坑以及自己的解决办法总结,

    我们在使用vue构建单页应用的时候,能给我们的效率带来很大的提升,但是紧随而来的也有一些新框架的问题. 1,比如我们公司在移动端微信上面的项目,如果所有项目都合并成一个,首页加载速度就会非常慢,所以我 ...

  9. vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据

    vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据 在vue项目中组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的话,有必要考虑引入vuex来管理这些凌乱的状态,今 ...

最新文章

  1. DVWA的安装与简单使用
  2. C++Study 指针详解
  3. 【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?
  4. 7个GIF动图帮你瞬间理解三角函数
  5. 深度学习(二)——深度学习常用术语解释, Neural Network Zoo, CNN, Autoencoder
  6. 批量获取远程计算机MAC
  7. Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)
  8. Tab标签页接口---使用Intent对象
  9. 佳能102种相片风格_一位妈妈用蔬菜水果等,为女儿拍了一组相片,没想到在INS火了...
  10. arcpy 基于python制作六十进制与十进制互换的工具箱
  11. WPF控件 ProgressBar
  12. 微信小程序时间轴demo_微信小程序 - 时间轴(组件)
  13. 一种破解静态链接库(.lib)的简单方法
  14. java程序如何提取数据库json格式_java解析json格式文件,再保存在数据库怎么做?...
  15. linux下oracle登陆建表,Oracle建表过程初学
  16. linux驱动面试题2018(面试题整理,含答案)
  17. Keen Team: 这群执著的人和那些纯粹的事
  18. WIN10打印机显示服务器脱机,win10网络打印机显示脱机处理方法
  19. 【数据库实验】镶嵌查询
  20. 中国DNS解析出现大规模故障

热门文章

  1. 几种简单卷积计算方法实例-Faltung
  2. Elasticsearch索引自动套用模板
  3. 我们是狮子还是羚羊?
  4. 微信android版发布动态图片,太“炸”了!微信重大玩法更新!微信表情会动了!附安卓用户更新入口→...
  5. 手把手教Kaggle账号注册-不翻墙
  6. java word 文档合并_如何通过java将多个word文档合成一个wor
  7. 搭建完菜单后运行不显示菜单的原因及其解决方法(拼图小游戏)
  8. mysql主从脚本--主
  9. 爬虫怎么爬m3u8视频
  10. python中isalnum函数的用法_python isinstance、isalnum函数用法