Vue学习笔记——Vuex详解

视频资源来自:b站coderwhy王红元老师——最全最新Vue、Vuejs教程,从入门到精通
文章仅为个人观看视频后的学习心得笔记,用于个人查看和记录保存。文中定有疏漏错误之处,恳请指正。

认识Vuex

image-20210712093919716

token -> 命令行

Linus -> linux/git

单界面的状态管理

image-20210712102911326

多界面状态管理

下载:npm install vues@3.1.3 --save

image-20210712110533054

Devtools,Vue开发的一个浏览器插件。可以记录每次修改的state状态

Action——异步操作在这做

backend:后端

fronted:前端

Vuex基本使用

1.创建store/index.js

import Vue from "vue";
import Vuex from "vuex"

//1.安装插件
Vue.use(Vuex)

//2.创建对象
const  store = new Vuex.Store({
  state: {
    counter: 0
  },
  mutations: {
    increment(state){
      state.counter++
    },
    decrement(state){
      state.counter--
    }
  },
  actions: {},
  getters: {},
  modules: {}
})

//3.导出store对象
export default store

2.在main.js中引入:import store from "./store"

将store对象放置在new Vue对象中,这样可以保证在所有的组件中都可以使用到

Vue.prototype.$store = store的意思是把所有的状态都交到这一个$store去管理

3.在其他组件中使用store对象中保存的状态即可

读数据:$store.state.counter

写数据:

methods: {
    addition() {
      this.$store.commit('increment')
    },
    subtraction() {
      this.$store.commit('decrement')
    }
  }

把要改变的数据写在方法里,通过commit来提交给mutations,让mutations去改数据。这样在vuejs devtools插件里面调试时才能看到相应数据的变化。否则,虽然网页中数据变化,但插件中无法显示。

Vuex核心概念

State单一状态树

Single Source of Truth,也叫单一数据源

即使有更多信息需要管理,还是建议用单一store,否则不利于维护。(不考虑安全性)

Getters基本使用

在store的index中:

  getters: {
    powerCounter(state){
      return state.counter*state.counter
    }

在组件中:

<h2>getCounter:{{$store.getters.powerCounter}}</h2>

计算属性版:filter

computed: {
  more1p7(){
    return this.$store.state.students.filter(s => s.height>=1.7)
  }
},

getters版:

more1p7(state){
  return state.students.filter(s => s.height>=1.7)
}
//state不能省
more1p7Length(state,getters){
   return getters.more1p7.length
}

相当于全局的计算属性

如果想用getters传参:

不能直接在state后面加参数,(加了也表示getters。。@_@),应当在return里写一个函数

moreHeight(state){
  return function (height) {
    return state.students.filter(s =>s.height >=height)
  }
    
  //箭头函数等价
  return height => {
     return state.students.filter(s =>s.height>=height)
      }
}

Mutation

回调函数的第一个参数就是state

Mutation传参

mutation方法中,直接在state后面增加参数

    incrementCount(state,num){
      state.counter+=num
    },
    addStudent(state,stu){
      state.students.push(stu)
    }

在组件的methods中,在函数名后面跟参数(称为Payload,载荷)

<button @click="addCount(5)">+5</button>

1.普通的提交封装

addCount(num){
  this.$store.commit('incrementCount',num)
},
addStudent(){
  const  stu = {id: 114,name: 'KK',height: '1.80'}
  this.$store.commit('addStudent',stu)
}

2.特殊的提交封装

addCount(num){
  this.$store.commit({
  type: 'incrementCount',
    num
})

此时,mutation中:

incrementCount(state,payload){
  state.counter += payload.num
},

负载接受对象形式的变量,里面可以存储多个属性,方便操作。

Mutation响应规则

state中,属性都会被加入到响应式系统中,而响应式系统会监听属性的变化。当属性(该属性本身就已经添加在state中)发生变化时,会通知所有界面中的用到属性的地方,让界面发生刷新。用定义增加属性,并不会把新加的属性添加到响应式系统中。<font color=#909534>(据说新版本已经可以添加了,也可能是弹幕乱说)</font>

应该用响应式方法 set

删属性delete不是响应式方法

delete state.info.age

应该用Vue.delete

Vue.delete(state.info,'age')

Mutation常量类型

建立文件mutation-types

export const INCREMENT = 'increment'

导入到其它js文件中

import {
  INCREMENT
} from "./mutation-types";

原本mutations里的的函数

increment(state){},

可以写成

[INCREMENT](state){},

而组件里要用到的字符串'increment'可以用INCREMENT代替

Mutation同步函数

通常情况下, Vuex要求我们Mutation中的方法必须是同步方法。

主要的原因是当我们使用devtools时, 可以devtools可以帮助我们捕捉mutation的快照。但是如果是异步操作, 那么devtools将不能很好的追踪这个操作什么时候会被完成。

如setTimeout在mutation中操作,devtools不能显示

Action

代替Mutation进行异步操作

<font color=#909534>context:上下文</font>

点+后延迟1秒,counter+1。

actions: {
  aIncrement(context,payload){
    setTimeout(() =>{
      context.commit(INCREMENT)
      console.log(payload)
    },1000)
  }
},
addition() {
 // this.$store.commit(INCREMENT)
  this.$store.dispatch('aIncrement','我是payload')
},

dispatch在开头图

加上Promise

aIncrement(context,payload){
  return new Promise((resolve,reject) =>{
   setTimeout(() =>{
     context.commit(INCREMENT)
      console.log(payload)
      resolve('1111')
    },1000)
  })
}
addition() {
  this.$store
    .dispatch('aIncrement','我是携带的信息')
    .then(res =>{
      console.log('里面已经完成了提交')
      console.log(res);
    })
},
image-20210712203219268

Module

Module 里定义的ModuleA最后生成时是放在state里的

<h2>{{$store.state.a.name}}</h2>

<font color=#909534>同步是commit,异步是dispatch</font>

模块里的函数也可以在组件里直接用commit调用

this.$store.commit('updateName','lisi')

模块里的getters里的函数也可以直接调用

<h2>{{$store.getters.fullname}}</h2>

<font color=#909534>就是模块分了好几个,其实最后还是只有一个</font>

模块里的getters函数里可以有第三个参数

fullname3(state,getters,rootState){
  return getters.fullname2 + rootState.counter
}

用rootState来调用根的参数

actions操作一样。

取根里的getters时,用rootGetters

对象的解构

数据抽离

总目录:
邂逅Vuejs
Vue基础语法
组件化开发
前端模块化
webpack详解
Vue CLI详解
vue-router
Promise的使用
Vuex详解
网络模块封装
项目实战

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容