CD's blog CD's blog
首页
  • HTMLCSS
  • JavaScript
  • Vue
  • TypeScript
  • React
  • Node
  • Webpack
  • Git
  • Nestjs
  • 小程序
  • 浏览器网络
  • 学习笔记

    • 《TypeScript 从零实现 axios》
    • Webpack笔记
  • JS/TS教程

    • 《现代JavaScript》教程
🔧工具方法
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

CD_wOw

内卷的行情,到不了的梦
首页
  • HTMLCSS
  • JavaScript
  • Vue
  • TypeScript
  • React
  • Node
  • Webpack
  • Git
  • Nestjs
  • 小程序
  • 浏览器网络
  • 学习笔记

    • 《TypeScript 从零实现 axios》
    • Webpack笔记
  • JS/TS教程

    • 《现代JavaScript》教程
🔧工具方法
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Vue2基础及原理

    • Vue2的生命周期
    • Vue2实用方法及原理
    • vue2 的 keepAlive 实现原理
    • Vue2的extend与手动挂载$mount
    • Vue2如何做同构SSR
    • Vue2.x之$set是怎么实现的
    • vue2在TypeScript中如何使用vuex
      • 1.基础使用方式
      • 2.VUEX 的基本使用方法
        • 对 vuex 做分类
      • 3. 将 Vuex 改为 TypeScript 的形式
      • 4.在 vue 页面中使用 vuex
    • Vue2.x中一些技巧及痛点问题解决方法
    • Vue2实现原理
    • Vue2 题解QA
  • Vue3基础及原理

  • 周边工具

  • Vue笔记
  • Vue2基础及原理
CD
2020-06-26
目录

vue2在TypeScript中如何使用vuex

VUEX 是 VUE 所提供的一种全局管理方式,可以存放全局或跨多组件所需要的数据。首先,我们先通过简易脚手架 cli 中选择 typescript 快速搭建一个项目。

# 1.基础使用方式

  1. 在 src 文档中创建 store/xxx.js 文档为 vuex 的根目录。
  2. 在 main.js 基础页面中引入 VUEX,并将创建的 store 文件导入,如下:
import Vue from 'vue'
import store from './store'
new Vue({
  ...,
  store,
  render: h => h(App),
}).$mount('#app')
1
2
3
4
5
6
7

# 2.VUEX 的基本使用方法

  1. 根目录下引入 VUE,VUEX,并使用:Vue.use(Vuex)
  2. 定义 VUEX 并导出
// 基础使用方式
const store = new Vuex.Store({
  state: {
    count: 0
  },
  getters: {
    count: state => state.count;
  },
  actions: {
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})
//若是觉得拥堵,将内部分离成单文件,即state.js、getters.js的形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 对 vuex 做分类

在使用的状态管理量多,且需要分门别类进行管理时,最好将不同部分的 state 分别建立 js 文件存储: store/modules/(users.js | category.js | market.js)等。再将其导入主文件 store/index.js 中。

# require.context 实现项目工程化

require.context 函数接受三个参数

directory {String} -读取文件的路径

useSubdirectories {Boolean} -是否遍历文件的子目录

regExp {RegExp} -匹配文件的正则

语法: require.context(directory, useSubdirectories = false, regExp = /^.//); 函数执行后返回的是一个函数,并且这个函数有 3 个属性:

  1. resolve {Function} -接受一个参数 request,request 为 test 文件夹下面匹配文件的相对路径,返回这个匹配文件相对于整个工程的相对路径

  2. keys {Function} -方法返回匹配成功模块的名字组成的数组

  3. id {String} -执行环境的 id,返回了匹配的文件夹的相对于工程的相对路径,是否遍历子目录,匹配正则组成的字符串,主要用在 module.hot.accept

index.js

import Vue from "vue";
import Vuex from "vuex";
import getters from "./getters";
Vue.use(Vuex);

const moduleFile = require.context("./modules", true, /.js$/);

const modules = moduleFile.keys().reduce((modules, modulePath) => {
  // .* 单个字符匹配任意次,即贪婪匹配。
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, "$1");
  // 当上下文环境传入某个文件的键时,就会得到一个标准的es module
  // modulePath为匹配到的文件的相对路径,将其作参数传入moduleFile中相当于import该文件
  const value = moduleFile(modulePath);
  modules[moduleName] = value.default;
  return modules;
}, {});
const store = new Vuex.Store({
  modules,
  getters,
});

export default store;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

modules/xxx.js

const state = {
  sidebar: [],
};

const mutations = {
  SET_SIDEBAR: (state, sidebar) => {
    state.sidebar = sidebar;
  },
};

const actions = {
  createSidebar: ({ commit }, sidebar) => {
    commit("SET_SIDEBAR", sidebar);
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 3. 将 Vuex 改为 TypeScript 的形式

state:

// 定义state类型
export interface State {
  name: string;
  total: number;
  isLogin: boolean;
  categories: object[];
}

export const state: State = {
  name: "",
  total: 0,
  isLogin: false,
  categories: [],
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14

action:

// 增加形参的类型
export default {
  createSidebar(context: any, sidebar: any) {
    commit("SET_SIDEBAR", sidebar);
  },
};
1
2
3
4
5
6

mutaction:

import { State } from "./state";
export default {
  add(state: State, sidebar: any) {
    sidebar ? (state.total += sidebar) : state.total++;
  },
};
1
2
3
4
5
6

# 4.在 vue 页面中使用 vuex

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import { mapMutations } from 'vuex';
import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src

@Component({
  components: {
    HelloWorld,
  },
})
export default class Home extends Vue {
public add() {
    this.$store.commit('add');
  }

  public addAsync(num: any) {
    this.$store.dispatch('createSidebar', {});
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
编辑 (opens new window)
#Vue2
上次更新: 2023/03/27, 21:41:56
Vue2.x之$set是怎么实现的
Vue2.x中一些技巧及痛点问题解决方法

← Vue2.x之$set是怎么实现的 Vue2.x中一些技巧及痛点问题解决方法→

最近更新
01
gsap动画库学习笔记 - 持续~
06-05
02
远程组件加载方案笔记
05-03
03
小程序使用笔记
03-29
更多文章>
Theme by Vdoing | Copyright © 2020-2023 CD | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式