Vue——14-vuex安装 State、Mutations以及Getters状态的的使用

目录

Vuex是什么?

一、可以直接使用vue-ui 进行下载插件vuex

二、使用npm安装vuex

三、yarn安装

vuex的五大核心

mapState辅助函数

mapMutations 辅助函数

载荷

mapGetters辅助函数


Vuex是什么?

介绍:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。

理解:核心就是 store(仓库),仓库是用来干什么的?你就当它用来储存东西的。

看个官网图片:

state:存储数据和状态。

mutatins:通俗的理解mutations,里面装着一些改变数据方法的集合,这是Veux设计很重要的一点,就是把处理数据逻辑方法全部放在mutations里面,使得数据和视图分离。切记:Vuex中store数据改变的唯一方法就是mutation!

action:在mutation中我们讲到,mutation中是存放处理数据的方法的集合,我们使用的时候需要commit。但是commit是同步函数,而且只能是同步执行。那我们想异步操作怎么办?
作用:在actions中提交mutation,并且可以包含任何的异步操作。actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据(但是还是通过mutation来操作,因为只有它能操作)

 下面说一下具体安装方法

但首先你得有一个脚手架,具体安装方法请参考Vue——安装@vue/cli(Vue脚手架)的三种方式

一、可以直接使用vue-ui 进行下载插件vuex

 

 

安装完毕后会发现文件中多了一个store文件夹,里面有个index.js文件 

 

store/index.js中应该有以下代码:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
  },
  mutations:{
  },
  getter:{
  },
  actions: {
  },
  modules: {
  }
})

 接下来在main.js中引入配置

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store';
Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

 引入后就可以使用vuex了


二、使用npm安装vuex

npm install vuex --save

三、yarn安装

yarn add vuex

安装完毕后不会自动生成store文件夹以及里面的文件,这时要自己去新建并且书写里面的配置项

可以package.json中查看是否安装成功vuex


下面来看一下vuex的五个核心:

vuex的五大核心

也就是store文件夹下的index.js中的五个状态

state、mutaions、getter、actions、modules

1.、state:vuex的基本数据,用来存储变量

在vue中使用 

$store.state.(state中数据的名称)  

state方法是写在计算属性(computed)里的

2、mutation:提交更新数据的方法,必须是同步的(如果需要异步使用action)。每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。

在vue中使用

$store.commit('')

mutation方法是写在methods里的

3、 geeter:从基本数据(state)派生的数据,相当于state的计算属性,具有返回值的方法

我们可以认为,【getters】是store的计算属性。getters方法是写在计算属性(computed)里的

4. action:和mutation的功能大致相同,不同之处在于  Action 提交的是 mutation,而不是直接变更状态。 Action 可以包含任意异步操作。

5. modules:模块化vuex,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。
简单来说就是可以把以上的 state、mutation、action、getters 整合成一个user.js,然后放到store.js里面。


使用state显示数据的四种方法

index.部分

  state: {
    count:5
  },

app.vue部分 如下:

第一种:

<h1>{{ $store.state.count }}</h1>

第二种:

 <h2>{{ vcount }}</h2>
 computed: {
			vcount() {
				return this.$store.state.count
			}
		} 

第三种: 

<h3>{{ count }}</h3>

mapState辅助函数

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

接下来引入辅助函数:

import { mapState} from "vuex";
computed:{
    ...mapState(["count"]),
}

第四种:

<h4>{{ count }}</h4>
computed:{
    ...mapState({
      count: (state) => state.count,
    }),
}

效果如下:

 使用mutation状态写出加减计数器

index.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    count:5
  },
  mutations: {
    add(state){
      state.count++
    },
    sub(state){
      state.count--
    }
  },
})

app.vue部分 如下:

第一种:

    <h1>{{ $store.state.count }}</h1>
    <button @click="vadd">+</button>
    <button @click="vsub">-</button>
methods:{
    vadd() {
      this.$store.commit("add");
    },
    vsub() {
      this.$store.commit("sub");
    },
}

第二种:

    <h2>{{ vcount }}</h2>
    <button @click="$store.commit('add')">+</button>
    <button @click="$store.commit('sub')">-</button>
  computed: {
    vcount() {
      return this.$store.state.count;
    },
}

第三种:

    <h3>{{ count }}</h3>
    <button @click="add">+</button>
    <button @click="sub">-</button>

mapMutations 辅助函数

与其他辅助函数类似,你可以在组件中使用 this.$store.commit(‘xxx’) 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)

引入辅助函数: mapMutations 

import { mapState ,mapMutations } from "vuex";
methods:{
    ...mapMutations(['add', 'sub'])
}

第四种:

    <h4>{{ count }}</h4>
    <button @click="sadd">+</button>
    <button @click="ssub">-</button>
methods:{
    ...mapMutations({
      sadd: "add",
      ssub: "sub",
    }),
}

第五种01  点击增加5或者10甚至其他值  通过传参

    //index.js部分
		inc(state,n){
			console.log(n);
			state.count += n
		},

app.vue部分 

<button @click="inc(5)">+5</button>
<button @click="inc(10)">+10</button>
methods:{
    ...mapMutations(['inc'])
}

也可以这样写:

<button @click="Inc2(5)">+5</button>
<button @click="Inc2(10)">+10</button>
methods:{
    ...mapMutations({
      Inc2: "inc",
    }),
}

第六种 通过preload载荷形式

mutations的载荷

把值传递给Mutations  给store.commit传一个附加参数,就叫做mutation的载荷

index.js部分:

    // index.js 部分
    // 第二个参数是载荷的方式,比如一个对象,一个数组,字符串等都可
		incrementcount(state,preload){
			console.log(preload);
			state.count += preload.count
		}

app.vue部分 

<h2>{{count}}</h2>
<button @click="counter(5)">+5</button>
<button @click="counter(10)">+10</button>
 counter(count) {
				this.$store.commit({
					type: 'incrementcount',
					count
				})
			} 

显示效果如下:

 对数组中的对象进行添加的两种写法: 

// index.js部分
export default new Vuex.Store({
  state: {
    record:[
			{id:100,name:'Nanchen',age:23},
			{id:101,name:'JiuAn',age:30},
			{id:102,name:'NanXi',age:50},
			{id:103,name:'QiuYun',age:28},
		]
  },
mutations:{
    add(state,preload){
			state.record.push(preload)
		}
}

app.vue部分  

    <p>{{ record }}</p>
    <button @click="add(home)">添加一组</button>
  data() {
    return {
      home:{
        id:250,
        name:'Nanchen66',
        age:80
      },
    };
}
 methods: {
    ...mapMutations(['add']) ,
  },
  computed: {
    ...mapState(['record']),
  },

第二种写法:

app.vue部分  

        //index.js
  mutations: {
    addrecord(state,preload){
			state.record.push(preload)
		}
  },
<h3>{{record}}</h3>
<button @click="sadd()">添加+</button>
  methods: {
    sadd() {
				const home = {
					id: 114,
					name: 'xuqi',
					age: 35
				}
				this.$store.commit('addrecord',home)
			}
  },
  computed: {
    ...mapState(['record']),
  },

效果如下:

 

getters

index.js

重新弄一份对象中的数组

            list: [{
				id: 1,
				name: "商品一",
				status: false
			},
			{
				id: 2,
				name: "商品二",
				status: true
			},
			{
				id: 3,
				name: "商品三",
				status: false
			},
			{
				id: 4,
				name: "商品四",
				status: true
			},
			{
				id: 5,
				name: "商品五",
				status: false
			}
		]
getters:{

    activeList(state){
      return state.record.filter(v=>{
        return v.status
      })
    },
  },

这里要筛选出带有status值为true的对象 

app.vue部分  

第一种写法:

  <h1>{{$store.getters.activeList}}</h1>

第二种写法:

<h2>{{list}}</h2>
computed:{
    list(){
      return this.$store.getters.activeList
    },
}

第三种写法:

使用辅助函数mapGetters

mapGetters辅助函数

mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性

app.vue部分  

import {mapGetters } from "vuex";
  <!-- 第三种方法使用辅助函数 -->
  <h3>{{activeList}}</h3>
computed:{
    ...mapGetters(['activeList']),
}

第四种写法:

  <!-- 第四种方法 -->
  <h4>{{list}}</h4>
computed:{
   ...mapGetters({
      list:'activeList'
    })
}

效果如下所示:(记得把之前的给注释掉以免被干扰)

 下面是筛选ID大于3的数据(因为上面的代码影响所以也只会执行status为true并且ID大于3的数据)

index.js部分 

getters:{
    getList:(state,getters)=>{
      return getters.activeList.filter(v=>{
        return v.id >3
      })
    }
}

app.vue部分  

 <h4>{{getList}}</h4>

直接在第四种方法后写入:

getList:'getList'

运行结果如下:

筛选只需要ID为3的数据

index.js部分  

getters:{
    getById:function(state){
      return function(id){
        return state.list.filter(function(v){
          return v.id === id
        })
      }
    }
}

app.vue部分  

<h4>{{getById(3)}}</h4>

 再在第四种方法后写入:

 getById:'getById'

效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Southern Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值