评论

收藏

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

开发技术 开发技术 发布于:2021-12-13 11:26 | 阅读数:468 | 评论:0

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.filterInf
3.如果想要获取符合条件的个数


  • {{$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.quadratic
vuex辅助函数
辅助函数
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状态更新的唯一方式是提交Mutation  mutations: {//写方法,通过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)  }  },}</script
hello组件
<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)  }  },  // 专写异步actions  actions: {//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)  }  },}</script
myhome组件
<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'  })  }}</script
Mygetter组件(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'  ])  },};</script
mymutations组件(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'  })  },}</script
Modules模块的使用
<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
结尾如果对您有帮助,希望能给个
关注下面的标签,发现更多相似文章