Vuex个人总结笔记

一、官网图

大管家先生:什么是vuex
在这里插入图片描述

image
image

二、安装使用

1.安装

npm i -s vuex

使用脚手架创建vue项目时勾上Vuex,自动配置vuex

vue create 项目名称

在这里插入图片描述

三、划分目录结构(模块化)

在这里插入图片描述
image
index.js

//index.js
//一般state不进行抽离
import Vue from 'vue';
import Vuex from 'vuex';

import mutations from './mutations';
import actions from './actions';
import getters from './getters';
import modulesA from './modules/modulesA';

Vue.use(Vuex);

const state = {
  cartList: [],
};

export default new Vuex.Store({
  state,
  mutations,
  actions,
  modules: {
   a:modulesA
},
});

modulesA.js

//modulesA.js
export default {
  state: {},
  mutations: {},
  getters: {},
  actions: {},
};

mutations-types.js(const 变量=方法名)

//mutations-types.js
export const ADD_COUNT="add_count";
export const ADD_TO_CART="add_to_cart";

mutations.js

//mutations.js
//导入mutations-typs,可将方法名改为变量
import { ADD_COUNT, ADD_TO_CART } from "./mutations-types";

export default {
  [ADD_COUNT](state, payload) {
    payload.count += 1;
  },
  [ADD_TO_CART](state, payload) {
    state.cartList.push(payload);
  }
};


//vue组件
<script>
import {ADD_COUNT} form '../../store/mulataions-types'

methods:{
addCount(){
this.$store.commit(ADD_COUNT)
}
}
</script>

actions.js

//actions.js
//导入mutations-typs,可将方法名改为变量
import { ADD_COUNT, ADD_TO_CART } from './mutations-types';

export default {
  addCart(context, payload) {
    let oldProduct = context.state.cartList.find((item) => {
      return item.iid === payload.iid;
    });
    if (oldProduct) {
      context.commit(ADD_COUNT, oldProduct);
    } else {
      payload.count = 1;
      context.commit(ADD_TO_CART, payload);
    }
  },
};

getters.js

//getters.js
export default {
  cartLength(state) {
    return state.cartList.length;
  },
  cartList(state) {
    return state.cartList();
  },
};

四、五大核心

1.state(相当于data)

<h1>{{$store.state.counter}}</h1>

  state: {
    counter: 10,
  },

2.getters(相当于computed计算属性)

//app.vue
<h1>{{$store.getters.powerCounter}}</h1>

//index.js
getters: {
    powerCounter(state) {
      return state.counter * state.counter;
    },
  },

getters使用第二个参数:getters

getters:{
  more20stu(state){
    return state.students.filter(s=>s.age>20)
  },
  more20stuLength(state,getters){
    return getters.more20stu.length
  }
}

使用getters时传递参数:返回一个函数即可


getters:{
fullName(state) {
      return (state.name = '王五');
    },
stuAge(state, getters) {
      return function(age) {
        console.log(getters.fullName)
        return state.students.filter((n) => n.age > age);
      };
    },
}

3.mutation(相当于methods,不能添加异步操作代码)
(1)使用方法

//vue组件
<button @click="addCounter">增加</button>

addCounter(){
      this.$store.commit('add')
    }

//vuex文件
mutations: {
    add(state) {
      state.counter++;
    },
  },

(2)提交风格
方式一:传递值

//App.vue
<button @click="addCounters(10)">增加10</button>

addCounters (con) {
      this.$store.commit("add",con)
    },

//index.js
add(state,con) {
      return state.counter+=con;
    },

方式二:传递对象

addStudent(){
 const stu={id:114,name:"alan",age:35}
 this.$store.commit('addStudent',stu)
}

//mutations
addStudent(state,stu){
state.students.push(stu)
}
//App.vue
<button @click="addCounters(10)">增加10</button>

addCounters (con) {
      this.$store.commit({
        type: "addCounters",
        con,
      })
    },

//index.js
addCounters(state, payload) {
      // return (state.counter += payload.con);
      console.log(payload.con);
    },

小结

this.$store.commit("方法名",payload)

//vuex
方法名(state,payload)

4.actions(相当于异步methods)
(1)使用

//App.vue
<button @click="changeInfo">修改信息</button>

methods: {
    changeInfo () {
      this.$store.dispatch("aChangeInfo","我是payload")
    },


//index.js
mutations: {
    changeInfo(state) {
      return (state.info.name = 'Wayhome');
    },
},
  actions: {
    aChangeInfo(context,payload) {
      setTimeout(() => {
        context.commit('changeInfo');
        console.log(payload);
      }, 1000);
    },
  },

(2)对象的解构(context可以当成store)

  aChangeInfo(context) {
      setTimeout(() => {
        context.commit('changeInfo');
        console.log(payload);
      }, 1000);
    },

context表示上下文的关系
context可以解构为{state,commit},所以可以改为
  aChangeInfo({state,commit}) {
      setTimeout(() => {
        context.commit('changeInfo');
        console.log(payload);
      }, 1000);
    },

添加回调函数,查看actions是否已经执行


  //vue组件
  updateInfo() {
    this.$store.dispatch("aUpdateInfo", {
      message: "我是携带的参数",
      success: () => {
        console.log("里面已经完成了");
      }
    })
  }


  //store 里面的index.js
  aUpdateInfo(context, payload) {
    setTimeout(() => {
      context.commit("updateInfo");
      console.log(payload.message);
      payload.success()
    }, 1000)
  }

5.modules

//index.js
const modulesA = {
  state: {
    name: '张三',
  },
  mutations: {
    changeName(state) {
  state.name = '李四';
    },
    UpdateName(state, payload1) {
      return console.log(payload1);
    },
  },
  getters: {
    fullName(state) {
      return (state.name = '王五');
    },
    fullName2(state, getters, rootState) {
      return getters.fullName + rootState.counter;
    },
  },
  actions: {
    aUpdateName(context, payload2) {
      setTimeout(() => {
        context.commit('UpdateName',"payload1");
        console.log(payload2);
      }, 1000);
    },
  },
};

const store = new Vuex.Store({
  state: {
    counter: 111,
  },
  modules: {
    a: modulesA,
  },
});
//使用
//App.vue

<h1>{{$store.state.a.name}}</h1>
    <h1>{{$store.getters.fullName2}}</h1>
    <button @click="changeName">修改名字</button>
    <button @click="UpdateName">异步修改名字</button>

methods: {
    changeName () {
      this.$store.commit("changeName")
    },
    UpdateName () {
      this.$store.dispatch("aUpdateName", "payload2")
    }
  }
}

五、简单使用

1.用state和mutations修改数值

//App.vue
<h1>{{$store.state.counter}}</h1>
<button @click="addCounter">增加</button>

methods{
addCounter(){
      this.$store.commit('add')
    },
 btnClick() {
      this.$store.commit(ADD_STUDENT, {
        name: "张三",
        age: 18,
      });
    },
    btnClick() {
      this.$store.commit({
        type:TO_ADD,
        payload:{
          name:"张三",
          age:20
        }
      });
    },
    btnClick() {
      this.$store.commit({
        type:TO_ADD,
        payload:{
          name:"张三",
          age:20
        }
      });
    },
}

//index.js
state: {
    counter: 10,
  },
mutations: {
    add(state) {
      state.counter++;
    },
  },

2.getters计算属性

getters: {
    stu(state) {
      return state.students.filter((n) => n.age > 18);
    },
    stuCounter(state,getters) {
      return getters.stu.length;
    },
  },

3.传递参数
(1)getters(可使用mapGetters重构:重构链接

//App.vue
<h1>{{$store.getters.stuAge(20)}}</h1>

//index.js
state: {
    counter: 10,
    students: [
      { id: 1, name: '张三', age: 10 },
      { id: 2, name: '李四', age: 20 },
      { id: 3, name: '王五', age: 30 },
    ],
  },

getters:{
fullName(state) {
      return (state.name = '王五');
    },
stuAge(state, getters) {
      return function(age) {
        console.log(getters.fullName)
        return state.students.filter((n) => n.age > age);
      };
    },
}

(2)mutations

//App.vue
<button @click="addCounters(10)"></button>
methods:{
addCounters (con) {
      this.$store.commit("addCounter", con)
    }}

//index.js
mutations: {
    addCounter(state, con) {
      return (state.counter += con);
    },
  },

六、vuex运作流程

流程讲解(看代码):
1.监听clickCart事件;

2.vue组件---->actions:使用dispatch,将addCart和cart发送给actions;

3.actions接收addCart(context,payload),第一个context是一个对象,为{state,commit},payload是vue组件发过来的cart;

4.actions发送(commit)addCount和addToCart给mutations;

5.mutations接收addCount(state,payload),其中payload为oldProduct;接收addToCart(state,payload),其中的payload参数,为context.commit('addToCart', payload)中的payload,而这个payload又是addCart(context, payload)中的payload,即传过来的cart;

注:payload传递方向
(1)vue组件的cart---->actions的addCart(state,payload)的payload----> context.commit('addToCart', payload)的payload---->mutations的 addToCart(state, payload) 的payload。

(2)addCart定义的oldProduct----> context.commit('addCount', oldProduct)中的oldProduct----> addCount(state, payload) 中的payload。

//vue组件
<template>
<detail-bottom-bar @clickCart="clickCart" />
</template>

methods:{
clickCart() {
      const cart = {};
      cart.img = this.topImg[0];
      cart.title = this.goods.title;
      cart.desc = this.goods.desc;
      cart.price = this.goods.realPrice;
      cart.iid = this.iid;
      this.$store.dispatch("addCart", cart);
    }
}
//store仓库
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    cartList: [],
  },
  mutations: {
    addCount(state, payload) {
      payload.count += 1;
    },
    addToCart(state, payload) {
      state.cartList.push(payload);
    },
  },
  actions: {
    addCart(context, payload) {
    //让oldProduct的指针指向iid相等item
      let oldProduct = context.state.cartList.find(
        (item) => {
          return item.iid === payload.iid;
        }
      );
      if (oldProduct) {
        context.commit('addCount', oldProduct);
      } else {
        payload.count = 1;
        context.commit('addToCart', payload);
      }
    },
  },
  modules: {},
});

七、在uniapp中使用vuex

https://blog.csdn.net/weixin_44143975/article/details/88815728

posted @ 2020-08-04 11:53  Wayhome'  阅读(438)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css