赞
踩
Vuex是一个专为Vue.js应用程序开发的状态管理模块,采用集中式储存管理应用的所有组件的状态,解决多件数据通讯。
要点:
1. 集中式管理数据状态方案
2 . 数据是响应式的 (修改数据页面也会随之改变)
在配置vue-cli中创建项目时,直接选中Vuex项,这样就可以不用做任何配置了(脚手架会帮我们完成所有相关配置)
(1)安装
npm i vuex
(2)配置
——创建Vuex.store实例
——向Vue实例注入store
(3)使用。在组件中使用
1.state:统一定义公共数据(类似date)
2.mutations: 用来修改数据的(类似于methods)
3.getters:计算属性,对现在的状态进行计算得到新的数据----派生(类似于cpmputed)
4.actions:异步操作,发起异步请求(发起axios请求)
5.modules:模块拆分,将以上五个部分进行模块haul拆分
state作用:定义公共数据并在组件中使用
- new Vuex.store({
- state: {
- 属性名: 属性值
- }
- })
- new Vuex.store({
- state: {
- num:10,
- userInfo: {
- name: 'tom',
- skills: ['抖音', 'B站', '美团'],
- address: '武汉黑马',
- logo: 'https://vuejs.org/images/logo.svg'
- // https://www.runoob.com/wp-content/uploads/2016/02/react.png
- }
- }
- })
在组件中,通过this.$store.state.属性名
来访问。
this.$store.state.num
在模板中,则可以省略this
而直接写成: {{$store.state.属性名}}
<div>num:{{$store.state.num}}</div>
mutations作用:通过调用mutations来修改定义在state中的公共数据。
- new Vue.store({
- // 省略其他...
- mutations:{
- // 每一项都是一个函数,可以声明两个形参
- mutation名1:function(state [, 载荷]) {
-
- },
- mutation名2:function(state [, 载荷]) {
-
- },
- }
- })
每一项都是一个函数,可以声明两个形参:
第一个参数是必须的,表示当前的state。在使用时不需要传入
第二个参数是可选的,表示载荷,是可选的。在使用时要传入的数据
使用格式
this.$store.commit('mutation名', 实参)
实例:
- new Vuex.store({
- state: {
- num:10,
- userInfo: {
- name: 'tom',
- skills: ['抖音', 'B站', '美团'],
- address: '武汉黑马',
- logo: 'https://vuejs.org/images/logo.svg'
- // https://www.runoob.com/wp-content/uploads/2016/02/react.png
- }
- }
- })
- const url = 'http://s02.mifile.cn/assets/static/image/logo-mi2.png'
- this.$store.commit('changeUrl', url)
getters作用:计算属性(类似于computed)在satate中的数据基础上进行一些加工的得到新的数据 !!!敲黑板(不会改变原来的数据)
- new Vue.store({
- //省略其他
- getters:{
- gieters名1:function(state){
- return 要返回的数据
- }
- }
- })
在组件中通过:$store.getters.getter的名字
来访问
$store.getters.getter名
actions作用:
- new Vue.store({
- // 省略其他部分
- actions:{
- axtions名1:function(state,载荷){
- // 1.发起异步请求,请求数据
-
- // 2.通过$state.commit调用mutation来修改/保存数据
-
- }
- }
- })
this.$state.dispatch('acthion名',参数)
实例:
- // 发ajax请求,从后端获取数据,再来去修改state中的数据
- actions: {
- getBooks (context, params) {
- console.log('getbooks的查询参数是', params)
- axios({
- url: 'https://www.fastmock.site/mock/37d3b9f13a48d528a9339fbed1b81bd5/book/api/books',
- method: 'GET'
- }).then(res => {
- console.log(res)
- context.commit('setBooks', res.data.data) //需要在mutations里面封装一个setBooks函数
- })
- }
- },
this.$store.dispatch('disBooks',{id:1}) //没有参数就不传
actions一般用来发异步请求,数据回来之后,在去调用mutations来保存数据
modules作用
- export default new Vuex.store({
- stete:{},
- mutations:{},
- getters:{},
- actions:{},
- modules:{
- 模块名1:{
- //namespaced为true,则使用mutations必须要带上模块名
- namespaced:true,
- stete:{},
- mutations:{},
- getters:{},
- actions:{},
- modules
- },
- 模块名2:{
- //namespaced默认为false,使用mutations是可以不用带模块名
- namespaced:true,
- stete:{},
- mutations:{},
- getters:{},
- actions:{},
- modules
- },
- ......
- }
- })
访问模块中的数据:
- 获取state数据项:{{$store.state.模块名.数据项名}}
- 获取getters数据项:{{$store.getters['模块名/getters名']}}
访问模块中的mutations/actions:
- $store.commit('mutations名' , 参数) //namespaced为false
- $store.commit('模块名/mutations名' , 参数) //namespaced为true
-
- $store.dispath('dispath名' , 参数) //dispath为false
- $store.dispath('模块名/dispath名' , 参数) //dispath为true
vuex中的数据与本组件内的数据名相同
...mapState({'新名字': 'xxx'})
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。