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


Posted in Javascript onApril 14, 2020

本文介绍了写给新手同学的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

到此这篇关于写给新手同学的vuex快速上手指北小结的文章就介绍到这了,更多相关vuex快速上手内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript字典探测用户名工具
Oct 05 Javascript
Jquery 1.42 checkbox 全选和反选代码
Mar 27 Javascript
JavaScript prototype属性使用说明
May 13 Javascript
javascrip关于继承的小例子
May 10 Javascript
jQuery固定元素插件scrolltofixed使用指南
Apr 21 Javascript
js的各种排序算法实现(总结)
Jul 23 Javascript
BootStrap表单宽度设置方法
Mar 10 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
May 26 Javascript
vue2.0 keep-alive最佳实践
Jul 06 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
Oct 21 Javascript
使用vant的地域控件追加全部选项
Nov 03 Javascript
vue-cli设置publicPath小记
Apr 14 #Javascript
vue 实现用户登录方式的切换功能
Apr 14 #Javascript
react 不用插件实现数字滚动的效果示例
Apr 14 #Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 #Javascript
编写一个javascript元循环求值器的方法
Apr 14 #Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
Apr 14 #Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
Apr 14 #Javascript
You might like
PHP服务器页面间跳转实现方法
2012/08/02 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
cakephp常见知识点汇总
2017/02/24 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
Python常用小技巧总结
2015/06/01 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
python如何重载模块实例解析
2018/01/25 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
python切割图片的示例
2020/11/12 Python
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
投标文件签署授权委托书范本
2014/10/12 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang