写给新手同学的vuex快速上手指北小结

作者:渣渣帅 时间:2024-04-27 16:03:33 

本文介绍了写给新手同学的vuex快速上手指北小结,分享给大家,具体如下

引入


//store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
 state: {...},
 mutations: {...},
 actions: {...}
})

export default store

//main.js
...
import store from './store'
Vue.prototype.$store = store
const app = new Vue({
 store,...
})
...

//test.vue 使用时:
import {mapState,mapMutations} from 'vuex'

State篇

state更新实时渲染是基于==computed==这个计算属性的,直接赋给data只能赋值初始值,不会随着state改变实时渲染


<!--state改变不会实时渲染-->
export default {
 data() {
  return {
  name:this.$store.state.name,
  };
 },
}

<!--监听state改变重新渲染视图-->
<template>
 <div>
   {{name}}
 </div>
<template>
export default {
 computed: {
  name() {
  return this.$store.state.name;
  }
 },
}

注意: data中的变量如果和computed中的变量重名,data优先,注意命名

获取多个state值,写多个函数return,很繁琐,所以有==mapState==辅助函数


<!--取多个很冗余,繁琐-->
export default {
 computed: {
  token(){
  return this.$store.state.token;
  },
  name(){
  return this.$store.state.name;
  }
 },
}


<!--mapState 直接取出-->
import { mapState } from 'vuex'
export default {
 computed: mapState([
  'token',
  'name'
 ])
}

我们有局部计算,怎么和mapState一起用?


import { mapState } from 'vuex'
export default {
 computed:{
   getTime(){
     return 123;
   },
   ...mapState([
    'token',
    'name'
   ])
 }
}

我们为它起个别名


<template>
 <div>
   xiaokeai,dahuilang是我们取的别名
   token,name是state的值
   {{xiaokeai}}
 </div>
<template>
<script>
 import { mapState } from 'vuex'
 export default {
   computed:{
     ...mapState({
       xiaokeai:"token",
       dahuilang:"name",
     })
   }
 }
</script>

我们要state和data发生点什么


<template>
 <div>
   假如token的值123;
   balabala的值就是 123皮卡皮
   {{balabala}}
 </div>
<template>
<script>
 import { mapState } from 'vuex'
 export default {
   data(){
     return {
       pikaqiu:"皮卡皮卡"
     }
   }
   computed:{
     ...mapState({
       xiaokeai:"token",
       dahuilang:"name",
       // 为了能够使用 `this` 获取局部状态,使用一个自定义名字的函数
       balabala(state){
         return state.token + this.pikaqiu;
       }
     })
   }
 }
</script>

取个对象值怎么破?


<template>
<div>
{{daSon}}
{{xiaoSon}}
</div>
</template>
<script>
 import { mapState } from 'vuex'
 export default {
   data(){
     return {
       pikaqiu:"皮卡皮卡"
     }
   }
   computed:{
     ...mapState({
 daSon: state=>state.obj.yeye.baba.daSon,
 xiaoSon:state=>state.obj.yeye.baba.xiaoSon,
})
   }
 }
</script>

这种方式取对象写到业务里不直观,也不共用,下节==Getter==有更优的方案

Getter篇

Getter是针对state的【对象】值提前做一些处理,以便用的时候直接提取

可以 this.$store.getters.xxx 使用,也可以使用mapGetters辅助函数,==辅助函数注意:== 和state一样,注入在computed中


import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
obj: {
 yeye: {
 baba: {
  daSon: "老大",
  xiaoSon: "老二"
 }
 }
}
},
getters: {
   <!--将想要提取或者处理的值这里处理好-->
getson: state => {
 return state.obj.yeye.baba;
}
}
})

export default store

<!--用的时候,和state一样,也可以别名等等操作-->
<template>
<div>
   {{getson}}
</div>
</template>

<script>
import { mapGetters } from 'vuex'
export default {
computed: {
 ...mapGetters([
   getson
 ])
}
}
</script>

Mutation篇

操作: this.$store.commit("名字","值");


import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
token: "vuex的token",
},
mutations: {
setToken(state, val) {
 state.token = val;
}
}
})

export default store

mapMutations 辅助函数,和state一样,可以别名, ==注意:== 辅助函数注入在methods中


methods: {
 ...mapMutations([
  'setToken'
 ])
}

<!--使用-->
this.setToken(100); //token修改为100

Mutation 必须是同步函数,不要误解这句话,以为异步不能用,异步可以用在里面,视图的渲染,取值都没有问题,问题在于:调试的时候,一些浏览器调试插件不能正确监听state。所以方便调试,尽量将异步写入action中

Action篇

注意action的 参数不是 state ,而是context,context里面包含commit,state。基本操作:this.$store.dispatch("函数名","值")


const store = new Vuex.Store({
state: {
 count: 0
},
mutations: {
 increment (state) {
  state.count++
 }
},
actions: {
 increment (context) {
  context.commit('increment')
 }
}
})

<!--辅助函数操作 注入在methods中-->
import { mapActions } from 'vuex'

export default {
methods: {
 ...mapActions([
   "increment"
 ])
}
}

<!--使用-->
this.increment(123);

module篇

module 目的将store按功能拆分成多个文件,利于维护管理,module 分为2种情况,1.是有命名空间, 2.是没有命名空间

没有命名空间: action、mutation 和 getter 是注册在全局的,所以要注意,方法函数不要设置同名了,如果同名了会都执行。
stete例外是局部。


import Vue from 'vue';
import Vuex from 'vuex';
import moduleA from "./modules/cat.js";
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
token: "vuex的token",
},
modules:{
moduleA
}
})

export default store;

<!--moduleA.js-->
export default {
// namespaced: true,
state: {
 cat:"我是cat",
},
mutations: {
setCat(state, val) {
 state.cat = val;
}
},
actions: {

},
getters: {

}
};

无命名空间 取值


this.$store.state.moduleA.cat
或者
...mapState({
cat:state=>state.moduleA.cat,
}),

不可以(state是局部,不可以这么取):
...mapState([
 "cat"
]),

无命名空间 改变值


和原来一样,因为方法是注册在全局的
this.$store.commit("setCat",666);
或者
...mapMutations([
"setCat"
])

有命名空间: state, action、mutation 和 getter 是局部的,模块间命名互相不冲突,可以重名。
namespaced 设置为true,即可开启


<!--moduleA.js 文件-->
export default {
namespaced: true,
state: {
 cat:"我是cat",
}
}

有命名空间取值


this.$store.state.moduleA.cat

或者
<!--注意这里:命名空间的名字带上,在modules注册时候呢个key值-->
<!--也可以别名,方法和之前一样,就是第一个参数是空间名-->
...mapState("moduleA",[
 "cat"
])

有命名空间 改变值


<!--只是第一个参数是空间名,其他操作一样-->
...mapMutations("moduleA",[
"setCat"
])
this.setCat(888);

或者:

this.$store.commit("moduleA/setCat",666);

最后 plugins

vuex页面刷新会丢失数据,用vuex-persistedstate插件可解决


import createPersistedState from "vuex-persistedstate";

const store = new Vuex.Store({
state: {},
mutations: {},
actions: {},
getters: {},
modules:{},
 plugins: [
   createPersistedState({
     storage: window.sessionStorage
   })
 ]
})

export default store

来源:https://juejin.im/post/5e955f29f265da480304a303

标签:vuex,快速上手
0
投稿

猜你喜欢

  • 深入浅析Vue中mixin和extend的区别和使用场景

    2024-05-29 22:42:43
  • asp数字或者字符排序函数代码

    2011-02-24 11:00:00
  • Python函数之zip函数的介绍与实际应用

    2022-06-02 00:52:51
  • 实用自动化运维Python脚本分享

    2022-05-23 20:26:57
  • OpenCV-Python使用cv2实现傅里叶变换

    2023-07-08 05:11:06
  • 详解win10下pytorch-gpu安装以及CUDA详细安装过程

    2023-07-01 07:21:36
  • python 计算方位角实例(根据两点的坐标计算)

    2023-08-01 09:30:54
  • 详解Python变量与注释高级用法

    2022-08-06 08:17:08
  • python pygame实现五子棋双人联机

    2022-04-12 22:41:04
  • pygame+opencv实现读取视频帧的方法示例

    2021-01-04 23:41:27
  • SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中)

    2024-01-16 02:25:00
  • python起点网月票榜字体反爬案例

    2021-03-11 02:56:05
  • MySQL插入中文不乱码的5种方法

    2024-01-17 10:47:21
  • JS正则(RegExp)判断文本框中是否包含特殊符号

    2023-05-12 18:18:55
  • 十个Python程序员易犯的错误

    2023-11-27 03:43:13
  • 举例讲解Python中is和id的用法

    2022-07-31 19:52:36
  • 合并ThinkPHP配置文件以消除代码冗余的实现方法

    2023-11-21 11:54:31
  • 判断数据库里存在的BIG5码

    2009-04-09 18:31:00
  • 如何在conda虚拟环境中配置cuda+cudnn+pytorch深度学习环境

    2022-06-16 14:43:04
  • textarea 在IE和FF下换行无法正常显示的解决方法

    2022-09-11 01:33:40
  • asp之家 网络编程 m.aspxhome.com