飞奔的炮台 发表于 2021-12-13 11:26:46

#yyds干货盘点#Vuex实战讲解(全),玩转Vue必备知识

Vuex概况store核心概念

[*]- State:包含了store中存储的各个状态。
[*]- Getters:类似于 Vue 中的计算属性,根据其他 getter 或 state 计算返回值。
[*]- Mutation: 一组方法,是改变store中状态的执行者,只能是同步操作。
[*]- Action:一组方法,其中可以包含异步操作。
[*]- Moudule:Module是store分割的模块,每个模块拥有自己的state、getters、mutations、actions。
vuex辅助函数
在Vuex中获取数据的辅助函数有两个mapState、mapGetters,操作Mutation和acitonhas函数mapMutations、mapActions。
前两个用在computed(计算属性中)
后两个用在methods(方法中)
如何使用多个组件共享同一个状态(数据)
1.安装vuex
新建store文件夹===>index.jsmain.js中,导入store对象,并且放在new Vue中 就可以通过this.$store的方式获取到这个store对象
2.使用vuex中的count(state中定义的共享状态)
this.$store.state.count
3.不能直接修改store中的状态,直接修改devtools监听不到数据的修改
4.mutations 负责同步修改状态
Vuex的store修改状态唯一的方式:提交mutations-->(this.$store.commit('add'))
Getters Store中的计算属性
   // 计算数字的平方    quadratic(state) {      // 第一个参数,状态state      return state.count * state.count    ![](<> "点击并拖拽以移动")
2.筛选数据
filterInfo(state) {      return state.info.filter(res =>{          return res.age>18      })

[*]获取数据

info:this.$store.getters.filterInf3.如果想要获取符合条件的个数


[*]{{$store.getters.filterInfo.length}}
4.如果不想年龄晒选写死,想自己输入年龄,只需要在getters里写一个方法

// 筛选数据    filterInfo(state, age) {      //要返回一个方法才可以传值      //age返回的不是一个确定的值,而是一个函数      // 1.      // return function(age){      //   return state.info.filter(res =>{      //   return res.age>age      //   })      // }      // 2.      return (age) => {//return后才可以传递参数      return state.info.filter(res => res.age > age)      5.getters中的两个参数

// 第一个state,拿数据,第二个参数geters:也就是说可以从getters中调用上面平方根的方法testGettes(state,getters){return getters.quadraticvuex辅助函数
辅助函数
mapState, 用于将state中的数据映射到组件的计算属性中

    <!-- 第一种 -->      <!--         组件中的计算属性名称,和vuex状态名称不一致的时候,可以使用对象写法   -->    computed:mapState({       cnum:"count",    })    <!-- 第二种 -->    <!--       字符串数组写法,      组件中计算属性名,和vuex中状态名一致的时候   -->   computed:mapState([      "count",   ])   <!-- 第三种 -->   <!--       当组件有自己的计算属性的时候,我们可以使用结构写法,将辅助函数合并到计算属性中   -->          computed:{      ...mapState({      cnum:"count",       })   ![](<> "点击并拖拽以移动")
mapGetters 用于将getter中的计算属性映射到组件的计算属性中用法同mapState
    computed:{      // 对象展开符,解构mapGetters      ...mapGetters({      // 将store中的getters的filterInfo,映射到组件上的info计算属性上      info:"filterInfo"      }),            ...mapGetters([ //字符串数组      "getInfoLength"      ])    }      mapMutations : 用于将mutations映射到methods中...mapMutations([    "add"]),// 对象写法...mapMutations({    // 同步,通过commit触发mutations    myadd:"add",    // 方法名:mutation函数名    addtwo:"addParms"}),mapActions :于将actions映射到methods中...mapActions({    // 方法名:mutation函数名    myasync:"asyncAdd"}Vuex中的核心 --- modules
当项目比较大的时候,如果只有一个模块来维护数据,那么这个模块会非常的大,对于维护性来说,不是特别高,所以vuex中,提供模块功能,我们可以通过modules将vuex处理为多个模块
const myCount={state:{    user:{      name:'admin',      pass:'12345'    },    count:10},getters:{      },mutations:{    // 模块的同步中是没有第三参数,(根状态)    cAdd(state,paylaod){      console.log(this)      state.count++    }},actions:{      }}export default new Vuex.Store({state:{    num:2},modules: { // 模块选项   // 引用myuser模块    u:myUser,    c:myCount,   cat    }}
使用模块的属性

$store.state.模块名称.属性名$store.getters.模块名称.属性名$store.commit('方法名称')//同步提交$store.dispatch('方法名称') //异步提实战解析上面概念说完了,该实战练习了,动起来!

State,Mutations
store下的index.js

import Vue from 'vue'import Vuex from 'vuex'// 安装插件Vue.use(Vuex)export default new Vuex.Store({state: {//存储状态    // 自定义共享状态    count:0,    stu:[      {id:1001,name:123},      {id:1003,name:'符鼠'},      {id:1004,name:'追梦'},    ],    user:{      name:'随便',      sex:'随机'    }},// vuex中的store状态更新的唯一方式是提交Mutationmutations: {//写方法,通过mutations修改、页面的插件才能监听到    add(state){//方法的第一个参数就是state,也就是state的对象      // this是store对象      state.count++    },//state(store中的state),(Payload:提交方法携带的参数)    addTen(state,ten){//点击加10      state.count += ten    },    addTwo(state,obj){//点击加2,加obj才能接收对象      state.count += obj.two    },    // 向stu数组中添加一条数据    addStu(state,payload){      state.stu.push(payload)//向数组中添加数据    },    updUser(state,age){//给stu对象添加新属性      // state.user.age='18'不能写等号      // state.user = {...state.user,'age':12}      Vue.set(state.user,'age',123)    }},    actions: {},modules: {}}Aone组件

<template><div class="hello">    <h1>aone组件</h1>    <h2>{{$store.state.count}}</h2>    <li>{{$store.state.stu}}</li>    <button @click="addTen">+10</button>    <button @click="addStu">添加成员</button></div></template><script>export default {name: 'aone',props: {    msg: String,    count:Number},data() {    return {      stu:{id:1005,name:'测试'}    }},methods: {    addTen(){      // 触发mutations函数,指定额外参数,字符串方式提交      this.$store.commit('addTen',10)      },    addStu(){      this.$store.commit('addStu',this.stu)    }},}</scripthello组件

<template><div class="hello">    <h1>helloworld组件</h1>    <h2>{{$store.state.count}}</h2>    <h2>{{$store.state.user}}</h2>    <button @click="addTwo">点击加2</button>    <button @click="updUser">修改</button></div></template><script>export default {name: 'HelloWorld',props: {    msg: String,    count:Number},methods: {    addTwo(){      // 触发mutations函数,指定额外参数,对象形式提交      this.$store.commit({      type:'addTwo',      two:2      })      },    updUser(){      // 触发mutations函数,指定额外参数      this.$store.commit({      type:'updUser' })    }},}</script
Actions,Getters
store下的index.js

import Vue from 'vue'import Vuex from 'vuex'// 安装插件Vue.use(Vuex)// 实例化vuex并导出export default new Vuex.Store({state: {    count: 0,    info: [      {      di: 1, name: '开发者1', age: 21      },      {      di: 2, name: '开发者2', age: 22      },      {      di: 3, name: '开发者3', age: 23      },    ]},// 只能通过mutations更改数据mutations: {//如果mutation是一个异步函数,那么devtools不能跟踪数据变化    // mutations负责同步修改状态    increment(state, payload) {      //   setTimeout(()=>{      state.count += payload      //   },2000)    }},// 专写异步actionsactions: {//context上下文对象    asyncIcrement(context, payload) {      setTimeout(() => {      context.commit('increment', payload)      }, 2000)    }},getters: {//store的计算属性    // 计算数字的平方    quadratic(state) {      // 第一个参数,状态state      return state.count * state.count    },    // 筛选数据    filterInfo(state, age) {      //要返回一个方法才可以传值      //age返回的不是一个确定的值,而是一个函数      // return function(age){      //   return state.info.filter(res =>{      //   return res.age>age      //   })      // }      return (age) => {//return后才可以传递参数      return state.info.filter(res => res.age > age)      }    },    testGettes(state,getters){      // 调用上面平方根的方法      return getters.quadratic    }},modules: {}}myvux组件

<template><div id="main">    <h2>这是myvue组件</h2>    <h3>{{$store.state.count}}</h3>    <button @click="add">+1</button>    <button @click="asyAdd">异步+1</button>    <h2>获取年龄小于22的开发</h2></div></template><script>export default {methods: {    add(){      this.$store.commit('increment',5)    },    asyAdd(){      // 触发actions异步并传参      this.$store.dispatch('asyncIcrement',10)    }},}</scriptmyhome组件

<template><div id="home">    <h2>这是home组件</h2>    <h3>{{$store.state.count}}</h3>    <h3>平方:{{$store.getters.quadratic}}</h3>    <!-- 通过getters来筛选数据 -->    <div>      <h3>获取大于22的</h3>       <li v-for="itme in info">      {{itme}}      </li>      <!-- {{$store.getters.filterInfo.length}} -->      //调用上面函数      <h5>{{$store.getters.testGettes}}</h5>    </div></div></template><script>export default {data() {    return {      info:this.$store.getters.filterInfo(22)    }},}</script
辅助函数及Modules
store下的index.js

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {    count:0,    user:{      name:'admin',      pass:'123'    },    info: [      {      di: 1, name: '开发者1', age: 21      },      {      di: 2, name: '开发者2', age: 22      },    ]},getters:{    filterInfo(state){      // 过滤大于20的数据      return state.info.filter(info=>info.age>22)    },    getInfoLeng(state,getter){      return getter.filterInfo.length    }},mutations: {    add(state){      this.count ++    },    addParms(state,num){      this.count += num    }},actions: {    //异步    asyncAdd(context){      setTimeout(()=>{      context.commit('add')      },2000)    }},modules: {}}Mystate组件(mapstate对应state)

<template><div id="mystate">    <!-- 使用vuex中的count -->    <p>数字:{{ $store.state.count }}</p>    <!-- <p>数字data:{{num}}</p> -->    <!-- <p>计算属性中的数字:{{cnum}}</p> -->    <!-- vuex中的数据 -->    <!-- <p>mapstate:{{count}}</p>    <p>mapstate:{{user}}</p> -->    <p>cuser:{{ cuser }}</p>    <p>cuser:{{ csuser }}</p>    <p>cnum:{{ cnum }}</p>    <p>组件自己的计算属性:{{ cPrice }}</p></div></template><script>import {mapState} from 'vuex'// console.log(mapState); export default {data() {    return {      // 在data中定义不是响应式      num:this.$store.state.count,      price:10    }},// 计算属性// computed:{//   cnum(){//   return this.$store.state.count//   }// }// 通过mapState辅助函数,帮我们自动生成计算属性// computed:mapState([//字符串数组写法// // 属性名和vuex状态名相同可以使用数组的形式写//   'count',//将vuex中状态count映射到计算属性中//   'user'// ])// 以对象形式使用// computed:mapState({//   cuser(state){//   // 通过计算属性的第一个函数,是vuex中的状态state,所以可以通过state直接获取数据//   return state.user//this.$store.user//   },//   // 简写方式//   csuser:state => state.user,//   // 等价于tate => state.count//   cnum:'count'// })computed:{    //组件自己的计算属性    cPrice(){      return '$'+this.price    },    //通过mapState映射过来的计算属性    ...mapState({    cuser(state){      // 通过计算属性的第一个函数,是vuex中的状态state,所以可以通过state直接获取数据      return state.user//this.$store.user    },    // 简写方式    csuser:state => state.user,    // 等价于tate => state.count    cnum:'count'})}}</scriptMygetter组件(mapgetters对应getters)

<template><div id="mygetter">    <h3>mapgetter用法</h3>    <p>直接使用getters:{{$store.getters.filterInfo}}</p>    <p>mapgetters:{{info}}</p>    <p>获取长度(info):{{getInfoLeng}}</p></div></template><script>// 获取辅助函数import { mapGetters, mapState } from "vuex";// console.log(mapState);export default {computed: {    // 对象展开符解构mapgetters    ...mapGetters({//对象写法      // 将store中的getters的filterInfo映射到组件上的info计算属性上      info:'filterInfo'    }),    ...mapGetters([//字符串数组写法      'getInfoLeng'    ])},};</scriptmymutations组件(mapmutations对应mutations)

<template><div id="mymutations">    <h3>使用mapmutions和mapactions</h3>    <button @click="add">触发add</button>    <button @click="myadd">触发myadd</button>    <!-- 传参 -->    <button @click="addtwo(3)">+3</button>    <button @click="myasync">触发异步</button></div></template><script>// 获取辅助函数import {mapState,mapGetters,mapMutations,mapActions} from 'vuex';export default {// 计算属性computed:{   },// 放方法methods: {    // 为了触发mutation函数 定义的方法没必要这么写    // clickAdd(){    //   this.$store.commit('add')    // }    //触发异步    myasync(){      this.$store.dispantch('asyncAdd')    },    // 字符串数组的用法    ...mapMutations([      'add'    ]),    // 对象写法    ...mapMutations({      // 同步方法通过commit触发mutauions      myadd:'add',      // 方法名:mutation函数名      addtwo:'addParms'    }),    //异步    ...mapActions({      myasync:'asyncAdd'    })},}</scriptModules模块的使用

<script>//vuex文件import Vue from 'vue'import Vuex from 'vuex'import myUser from './myuser'import cat from './cat'Vue.use(Vuex)// const myUser={ // } export default new Vuex.Store({modules: {//模块选项    // 引入    u:myUser,    cat}})</script>-----------------------------------------------------------下面是展示页面<template><div class="modules">    <!-- 多了一层u -->    <h4>user信息:{{$store.state.u.user}}</h4>    <h4>cat信息:{{$store.state.cat.mycat}}</h4></div></template
结尾如果对您有帮助,希望能给个
页: [1]
查看完整版本: #yyds干货盘点#Vuex实战讲解(全),玩转Vue必备知识