vue学习(7)vuex的辅助函数封装(基于vue3)

news2024/12/23 7:35:03

简介:

封装了 mapState,mapGetters,mapActions,mapMutations,用更灵活的方式来使用vuex,主要使用的是vuex的createNamespacedHelpers方法,此方法是帮助重写以特定模块为主的辅助函数

createNamespacedHelpers 在vuex@^3.1.1 及以上都有

文件截图:

 源码:

以下举个例子,模块名为index,模块里有自己的state等相关

1、store/index.ts

import { InjectionKey, App } from 'vue'
import { createStore, useStore as baseUseStore, Store } from 'vuex'
import { StateTypes } from './types'
import index from './modules/index'

// InjectionKey 将store安装到Vue应用程序时提供类型,将类型传递InjectionKey给useStore方法
// 定义注入类型
const key: InjectionKey<Store<StateTypes>> = Symbol()

const store = createStore<StateTypes>({
  modules: {
    index
  }
})

export function useStore() {
  return baseUseStore(key)
}

export function setupStore(app: App<Element>): void {
  app.use(store, key)
}

export default store

2、store/types.ts

/** 模块类型 */
export interface StateTypes {
  index: any
}

/** state类型 */
export interface IndexStateType {
  requestCount: {
    count: number
  },
  [key: string]: any
}

/** getter类型 */
export interface GetterType {
  [key: string]: (state: IndexStateType) => any
}

3、store/modules/index.ts

import { Module, ActionTree, MutationTree, } from 'vuex'
import { IndexStateType, StateTypes, GetterType } from '../types'

const state: IndexStateType = {
  requestCount: {
    count: 0
  },
  a: 999
}

const getters: GetterType= {
  getCount(state) {
    return state.a
  }
}

const mutations: MutationTree<IndexStateType> = {
  increment(state: IndexStateType, clearFlag: boolean = false) {
    if (!clearFlag) {
      state.requestCount.count++
    } else {
      state.requestCount.count = 0
    }
  }
}

const actions: ActionTree<IndexStateType, StateTypes> = {
  increments({ dispatch, commit }) {
    commit('increment')
    // dispatch('xxmodule/xxx', xxx, { root: true })
  }
}

const index: Module<IndexStateType, StateTypes> = {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}

export default index

4、store/hooks.ts

import { createNamespacedHelpers } from 'vuex'
import { computed } from 'vue'
import {
  useStore
} from './index'

/**
 * 实际遍历函数
 * @param mapper 遍历属性名
 * @param mapFn 被调用的辅助函数
 * @param type true => Mutations, Actions; false => States, Getters
 * @returns
 */
function mapStore(props: string[] | string, mapStoreFcn: Function, type: boolean = false){
  const propsList = mapStoreFcn(props)
  const store = useStore()
  const storeState = {} as any
  Object.keys(propsList).forEach(item => {
    const fn = propsList[item].bind({$store: store})
    // Mutations, Actions 为方法,返回函数体, States, Getters 为计算属性,返回非响应式数据
    storeState[item] = type ? fn : computed(fn).value
  })
  return storeState
}

/**
 * state辅助函数
 * @param moduleName 模块名
 * @param mapper 属性数组 或者 单属性
 * @returns 
 */
export function useState(moduleName: string, props: string[] | string) {
  // 创建专属命名空间的store
  const store = createNamespacedHelpers(moduleName).mapState
  return mapStore(props, store)
}

/**
 * getters hook
 * @param moduleName 模块名
 * @param mapper 属性数组 或者 单属性
 * @returns 
 */
export function useGetters(moduleName: string, props: string[] | string){
  // 创建专属命名空间的store
  const store = createNamespacedHelpers(moduleName).mapGetters
  return mapStore(props, store)
}

export function useActions(moduleName: string, props: string[] | string){
  // 创建专属命名空间的store
  const store = createNamespacedHelpers(moduleName).mapActions
  return mapStore(props, store, true)
}

export function useMutations(moduleName: string, props: string[] | string){
  // 创建专属命名空间的store
  const store = createNamespacedHelpers(moduleName).mapMutations
  return mapStore(props, store, true)
}

调用方式:

useState,useGetters,useActions,useMutations都是传两个参数,第一参数为模块名,第二参数为数组,可以传单个或者多个,不过区别的是useState,useGetters返回的直接是非响应式对象值,而useActions,useMutations返回的是方法,可以自己去调用

import {
  ref
} from 'vue';

import {
  useState,
  useGetters,
  useActions,
  useMutations
} from '@/store/hooks'; 
export default function() {
  const page = ref<number>(1)
  const state = useState('index', ['requestCount', 'a'])
  const getter = useGetters('index', ['getCount'])
  const actions = useActions('index', ['increments'])
  actions.increments()
  console.log(state.requestCount.count);
  
  return {
    page
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud(微服务)学习篇(四)

Spring Cloud(微服务)学习篇(四) 1.nacos实现服务之间传参数 1.1 在dto包(shop-sms-api项目)中创建SmsDTO类 package com.zlz.shop.sms.api.dto;import lombok.Data;Data public class SmsDTO {private String tel; }1.2 复制SmsDTO类到shop-sms-server项目的dto包下面 1.3 …

AVL 树实现

AVL 树的概念 也许因为插入的值不够随机&#xff0c;也许因为经过某些插入或删除操作&#xff0c;二叉搜索树可能会失去平衡&#xff0c;甚至可能退化为单链表&#xff0c;造成搜索效率低。 AVL Tree 是一个「加上了额外平衡条件」的二叉搜索树&#xff0c;其平衡条件的建立是…

buu [MRCTF2020]Easy_RSA 1

题目描述&#xff1a; import sympy from gmpy2 import gcd, invert from random import randint from Crypto.Util.number import getPrime, isPrime, getRandomNBitInteger, bytes_to_long, long_to_bytes import base64from zlib import * flag b"MRCTF{XXXX}" …

【基础算法】单链表的OJ练习(1) # 反转链表 # 合并两个有序链表 #

文章目录前言反转链表合并两个有序链表写在最后前言 上一章讲解了单链表 -> 传送门 <- &#xff0c;后面几章就对单链表进行一些简单的题目练习&#xff0c;目的是为了更好的理解单链表的实现以及加深对某些函数接口的熟练度。 本章带来了两个题目。一是反转链表&#x…

Springboot怎么实现restfult风格Api接口

前言在最近的一次技术评审会议上&#xff0c;听到有同事发言说&#xff1a;“我们的项目采用restful风格的接口设计&#xff0c;开发效率更高&#xff0c;接口扩展性更好...”&#xff0c;当我听到开头第一句&#xff0c;我脑子里就开始冒问号&#xff1a;项目里的接口用到的是…

Django实践-03模型-01表生成模型

文章目录Django实践-03模型Django MTV之模型投票案例1.创建应用1.创建应用2.配置模板文件2.配置关系型数据库MySQL1.创建数据库2.创建表3.按照MySQL依赖4.修改settings.py文件 添加应用 配置数据库5. 基于数据库生成实体类3.使用ORM完成模型的CRUD操作1.新增2.删除3.更新4.查询…

代数小课堂:向量代数(方向比努力更重要)

文章目录 引言I 数字的方向性1.1 箱子受力1.2 爆破逃离方向II 向量的表示法2.1 极坐标方法对向量表示2.2 终点的坐标表示向量III 向量的计算3.1 计算向量的长度和方向3.2 平行四边形法则(计算向量的长度)引言 代数学除了带来了方程和函数工具,还揭示了关于数字的另一个规律,…

C++——特殊类设计

目录 不能被拷贝的类 只能在堆上创建对象的类 只能在栈上创建对象的类 不能被继承的类 只能创建一个对象的类(单例模式) 饿汉模式 懒汉模式 单例对象释放问题 不能被拷贝的类 C98&#xff1a;将拷贝构造函数与赋值运算符重载只声明不定义&#xff0c;并且将其访问权…

React Native学习笔记(2.基本语法-类组件)

1. 基本语法 (1). 引入组件。(2). 继承共通。(3). 定义render函数。(4). 返回文本。(5). export导出 2. 自定义组件&#xff08;引用&#xff09; 将上面定义的"cat“组件引用到当前文件里 (1). inprot引入。(2). 使用 3. 自定义组件&#xff08;参数定义与传参&#x…

【Linux】项目自动化构建工具——make/Makefile

目录 1.make与Makefile的关系 Makefile make 项目清理 clean .PHONY 当我们编写一个较大的软件项目时&#xff0c;通常需要将多个源文件编译成可执行程序或库文件。为了简化这个过程&#xff0c;我们可以使用 make 工具和 Makefile 文件。Makefile 文件可以帮助我们自动…

你知道Java中的JCP, JEP, JLS, JSR是什么意思吗?

目录 一、JCP 二、JSR 三、JLS 四、JEP 公众号&#xff1a;MCNU云原生&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;及时掌握。 JCP, JEP, JLS, JSR这些概念是Java社区中的一些概念&#xff0c;但是没有没有经常关注社区的童鞋们未必知道这些缩写所代表的…

centos7搭建FTP

1.简介文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一种协议&#xff0c;工作于OSI&#xff0c;TCP的应用层&#xff0c;客户端和服务端之前连接要经过一次TCP的三次握手&#xff0c;其作用就是可以使用户以文件操…

第十二章 实现shallowReadonly功能

实现shallowReadonly功能 shallowReadonly&#xff1a; 让一个响应式数据变为只读的(浅只读) 接下来附上测试用例&#xff1a; import { isReadonly,shallowReadonly } from "../reactive"describe(shallowReadonly,()>{test(should not make non-reactive pro…

Session会话管理

会话管理Web会话管理概述常见的Web应用会话管理方式基于Server端的Session的管理方式基于Cookie的Session的管理方式Cookie与Session最大的区别Cookie-Based的管理方式基于Token-Based的管理方式Web会话管理的安全问题Web会话管理概述 会话管理&#xff1a;在进行人机交互的时…

java高级篇之三大性质总结:原子性、可见性以及有序性

1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点&#xff0c;那就是两大核心&#xff1a;JMM抽象内存模型以及happens-before规则&#xff08;在这篇文章中已经经过了&#xff09;&#xff0c;三条性质&#xff1a;原子性&#xff0c;有序性和可见性。关于sy…

JavaSE:常用类

前言从现在开始进入高级部分的学习&#xff0c;鼓励自己一下&#xff01;画个大饼&#xff1a; 常用类->集合框架->IO流->多线程->网络编程 ->注解与反射->GUI很重要的东西&#xff0c;不能不会&#xff01;Object类祖宗类&#xff0c;主要方法&#xff1a;t…

接口测试简介

接口测试简介 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 ——百度百科&#xff01; …

低代码开发与传统开发有什么不同?有什么价值?

低代码开发与传统开发有些什么不同&#xff1f;有什么价值&#xff1f; 自2014年Forrester明确提出低代码&#xff08;Low-Code&#xff09;概念以来&#xff0c;这一领域已经逐步升温。近年来&#xff0c;低代码凭借其低开发门槛和易用性等优点赢得了众多投资研究机构和企业用…

设计模式(十四)----结构型模式之组合模式

1 概述 对于这个图片肯定会非常熟悉&#xff0c;上图我们可以看做是一个文件系统&#xff0c;对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树&#xff0c;当我们找到某个叶子节点后&#xff0c;就可以对叶子节点进行相关的操作。可以将这颗树…

Cookie原理及JAVA端关于Cookie的增删改查操作

什么是Cookie 在java中&#xff0c;Cookie是来自于Servlet规范中一个工具类&#xff0c;存在于Tomcat提供servlet-api.jar中Cookie存放当前用户的私人数据 Cookie原理 用户打开浏览器第一次&#xff08;指每次重新打开浏览器的第一次&#xff0c;而非指历来第一次&#xff0…