vue2.6 + ts 使用vuex

news2024/11/23 11:27:26

目录

  • vue2.6 + ts 使用vuex
    • 安装
    • 01:直接使用 store / index.ts的数据
      • store / index.ts
      • main.ts
      • 001:同步mutation操作vuex数据与获取getters
      • 001:效果
      • 002:异步action、mutation操作vuex数据
      • 002:效果
    • 02:引入其他模块
      • 021:store / index.ts
      • store / test.ts
      • main.ts 依旧挂载
      • 组件内使用
      • 002效果

vue2.6 + ts 使用vuex

安装

01:直接使用 store / index.ts的数据

store / index.ts

import Vue from 'vue'
import Vuex from 'vuex'
import { CHANGE_SITE, ASYNC_CHANGE_COUNT, SYNC_CHANGE_COUNT } from './types'

Vue.use(Vuex)
interface modState<S extends unknown> {
  [key: string]: S
}
export interface RootData {
  site: string
}
export type RootState = RootData & unknown & modState<unknown>

type CountType = {
  count: Number
}
const changeCount = (count:number): Promise<CountType> => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({
        count: count *2
      })
    }, 2000)
  })
}

// 通用store
const store = new Vuex.Store<RootState>({
  state: {
    site: 'site-test',
    count: 0
  } as RootState,
  modules: {
    // [USER_MOD_PATH]: UserStore
  },
  getters: {
    getSite({ site }) {
      return site + '__'
    }
  },
  mutations: {
    [CHANGE_SITE](state, payload) {
      // console.log('change_site', state, payload)
      state.site = state.site + payload
    },
    [SYNC_CHANGE_COUNT](state, payload) {
      // console.log('change_count', state, payload)
      state.count = state.count + payload
    }
  },
  actions: {
    [ASYNC_CHANGE_COUNT]({ commit }, count: number) {
      // console.log('commit', commit, 'count', count)
      if ( count ) {
        changeCount(count).then(res=>{
          commit(SYNC_CHANGE_COUNT, res.count)
        })
      }
    }
  }
})
export default store

main.ts

import store from './store'
new Vue({
  store,
  render: h => h(App)
}).$mount('#app')

001:同步mutation操作vuex数据与获取getters

    <div>
      <div>同步修改 site</div>
      <div>site - {{ $store.state.site }}</div>
      <div>getSiteC - {{ getSiteC }}</div>
      <button @click="changeSite">修改site</button>
    </div>

<script lang="ts">
// 获取store的数据 01
import store from '@/store'
import { State, Mutation, Action } from 'vuex-class'
import { CHANGE_SITE} from '@/store/types'
export default class App extends Vue {
  // 获取store的数据 02
  @State('site')
  private site!: string
  @Mutation(CHANGE_SITE)
  private change_site!: (payload: string) => void

  private mounted() {
    // 获取store的数据 03
    console.log('site', this.site)
    console.log('getSite', this.$store.getters.getSite)
  }
  get getSiteC() {
    return this.$store.getters.getSite
  }
  private changeSite(): void {
    this.change_site('222')
  }
}

</script>

001:效果

在这里插入图片描述

在这里插入图片描述

002:异步action、mutation操作vuex数据

    <div>
      <div>异步修改 count</div>
      <div>count - {{ $store.state.count }}</div>
      <button @click="changeCount">修改count</button>
    </div>
<script lang="ts">
// 获取store的数据 01
import store from '@/store'
import { State, Mutation, namespace, Action } from 'vuex-class'
import {  ASYNC_CHANGE_COUNT } from '@/store/types'
export default class App extends Vue {
  @Action(ASYNC_CHANGE_COUNT)
  private async_change_count!: (payload: number) => void

  private mounted() {
  }
  private changeCount(): void {
    this.async_change_count(1)
  }
}
</script>

002:效果

在这里插入图片描述
在这里插入图片描述

02:引入其他模块

021:store / index.ts

import Vue from 'vue'
import Vuex from 'vuex'
import { CHANGE_SITE, ASYNC_CHANGE_COUNT, SYNC_CHANGE_COUNT } from './types'

// 导入其他模块
import TestStore, {
  TEST_MOD_PATH,
  test_state,
} from './test';

Vue.use(Vuex)
interface modState<S extends unknown> {
  [key: string]: S
}
export interface RootData {
  site: string
}
export type RootState = RootData & unknown & modState<unknown>

type CountType = {
  count: Number
}
const changeCount = (count:number): Promise<CountType> => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({
        count: count *2
      })
    }, 2000)
  })
}

// 通用store
const store = new Vuex.Store<RootState>({
  state: {
    site: 'site-test',
    count: 0
  } as RootState,
  modules: {
    [TEST_MOD_PATH]: TestStore
  },
  getters: {
    getSite({ site }) {
      return site + '__'
    }
  },
  mutations: {
    [CHANGE_SITE](state, payload) {
      // console.log('change_site', state, payload)
      state.site = state.site + payload
    },
    [SYNC_CHANGE_COUNT](state, payload) {
      // console.log('change_count', state, payload)
      state.count = state.count + payload
    }
  },
  actions: {
    [ASYNC_CHANGE_COUNT]({ commit }, count: number) {
      // console.log('commit', commit, 'count', count)
      if ( count ) {
        changeCount(count).then(res=>{
          commit(SYNC_CHANGE_COUNT, res.count)
        })
      }
    }
  }
})
export default store

store / test.ts

import type { RootState } from '@/store'
import type { Module } from 'vuex'
import Vue from 'vue'

import { TEST_CHANGE_CHECKED } from './types'

// 模块注册路径
export const TEST_MOD_PATH = 'test'
export interface TEST {
  checked: boolean
}
export type test_state = TEST

// store配置
const TestStore: Module<test_state, RootState> = {
  state() {
    return {
      checked: false
    }
  },
  getters: {},
  mutations: {
    [TEST_CHANGE_CHECKED](state, payload: boolean) {
      state.checked = payload
    }
  },
  actions: {}
}

export default TestStore

main.ts 依旧挂载

组件内使用

    <div>
      <div>修改test模块的</div>
      <div>count - {{ $store.state.test.checked }}</div>
      <div>计算属性 - {{ getChecked }}</div>
      <button @click="changeChecked">修改checked</button>
    </div>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
// 获取store的数据 01
import store from '@/store'
import { State, Mutation, namespace, Action } from 'vuex-class'
import {
  CHANGE_SITE,
  ASYNC_CHANGE_COUNT,
  TEST_CHANGE_CHECKED
} from '@/store/types'
import { TEST } from '@/store/test'

export default class App extends Vue {
  @State('test')
  private test!: TEST

  @Mutation(TEST_CHANGE_CHECKED)
  private test_change_checked!: (payload: boolean) => void

  private mounted() {
    // 获取test模块的
    console.log('test', this.test.checked)
  }
  private changeChecked(): void {
    this.test_change_checked(!this.test.checked)
  }
  get getChecked() {
    return this.test.checked
  }
}
</script>

002效果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

CANoe 简介

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

Go 语言项目源码解析:定时任务库 cron

环境准备 首先我们将源码克隆&#xff08;Fork&#xff09;为自己的个人仓库&#xff0c;只需要在 GitHub 项目主页点击 Fork 按钮&#xff0c;然后输入项目名称点击确认即可。克隆完毕后&#xff0c;可以下载到本地&#xff0c;或者直接在科隆后的 GitHub 仓库主页上点击 Cre…

RabbitMQ

RabbitMQ 1.MQ引言 MessageQueue: 消息队列 模块之间的耦合度多高&#xff0c;导致一个模块宕机后&#xff0c;全部功能都不能用了&#xff0c;并且同步通讯的成本过高&#xff0c;用户体验差。 1.1什么是MQ MQ&#xff08;Message Queue&#xff09;消息队列&#xff0c;是基…

Android Studio App开发实战项目之广告轮播(附源码 可用于大作业)

需要图片集和源码请点赞关注收藏后评论区留言即可~~~ 电商App的首页上方&#xff0c;都在明显位置放了一栏广告条&#xff0c;并且广告条会轮播&#xff0c;非常吸引眼球&#xff0c;这种广告轮播的功能&#xff0c;为推广热门事物出力甚大。 轮播视频已上传至我的主页&#x…

【云原生】docker 搭建ElasticSearch7

前言 本篇演示如何基于docker环境快速搭建起es7的环境 安装es7.6 1、拉取镜像 docker pull elasticsearch:7.6.2 2、执行下面的命令进行安装 docker run -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m"…

Android Studio App开发实战项目之计时器(附源码 简单易懂,适合新手学习)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、Handler的延迟机制 活动页面的Java代码通常是串行工作的&#xff0c;而且App界面很快就加载完成容不得半点延迟&#xff0c;不过偶尔也需要某些控件时不时的动一下&#xff0c;好让界面呈现动画效果更加活泼&#xff0…

shiro框架04会话管理+缓存管理+Ehcache使用

目录 一、会话管理 1.基础组件 1.1 SessionManager 1.2 SessionListener 1.3 SessionDao 1.4 会话验证 1.5 案例 二、缓存管理 1、为什么要使用缓存 2、什么是ehcache 3、ehcache特点 4、ehcache入门 5、shiro与ehcache整合 1&#xff09;导入相关依赖&#xff0…

2019银川F,ccpc威海D - Sternhalma 2022

1401D - Maximum Distributed Tree 求每个边经过的次数&#xff0c;假设求u,v这条边的次数&#xff0c;边的左端是u这个集合一共有n-siz[v]个点&#xff0c;右端是v这个集合有siz[v]个端点&#xff0c;经过这条边的次数就是siz[v]*(n-siz[v]),然后再按照次数多的乘以大的质因数…

【附源码】Python计算机毕业设计汽车租赁管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Go 语言中的 Moduels 管理(Let‘s Go 三十四)

在 Go 1.11以前使用包管理一直被开发者所诟病。既然GOPATH这种包管理引起了一线开发者的一片骂声&#xff0c;所以&#xff0c;Go官方体恤一线开发者对GOPATH这种包管理的情绪&#xff0c;一直致力努力提供对一线开发者友好的包管理解决方法而奋斗。从最初的GOPATH到GO VENDOR&…

基于遗传算法、元胞自动机邻域和随机重启爬山混合优化算法(GA-RRHC)的柔性车间调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

LeetCode50天刷题计划第二季(Day 27 — 寻找旋转排序数组中的最小值(9.50- 11.20)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、题目寻找旋转排序数组中的最小值示例提示&#xff1a;二、思路三、代码前言 芜湖 一、题目 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组&#…

web前端期末大作业——基于HTML+CSS+JavaScript实现中国茶文化(30页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

大数据开发是做什么的?怎样入门?

其实现在有很多小伙伴看中了大数据的发展前景&#xff0c;但是其实不知道大数据开发具体是做什么的&#xff0c;又该怎么学习&#xff1f;学习了之后又该做什么&#xff1f; 下面具体给你分析下大数据开发是做什么的&#xff0c;又需要学习和掌握哪些技能~ 大数据开发做什么&a…

致远OA ajax.do 任意文件上传 (CNVD-2021-01627) 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓01 漏洞描述02 影响范围03 验证方式04 利用方式05 修复方案01 漏洞描述 致远OA是一套办公协同管理软件。由于致远OA旧版本某些接口存在未授权访问&#xff0c;以及部分函数存在过滤不足&#xff0c;攻…

大数据实战之前戏

开发背景 因为要开发一套通话详单系统。该系统上每天产生1亿条通话话单&#xff0c;要保存一个月的通话话单。也就是保存30亿条通话&#xff0c;能够做到准实时的通话详单查询。于是采用大数据架构进行话单的保存和查询。 服务器规划 为了验证系统的可用性&#xff0c;我先搭…

从零学习 InfiniBand-network架构(七) ——IB协议中数据如何传输

从零学习 InfiniBand-network架构&#xff08;七&#xff09; —— IB协议中数据如何传输 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;未经作者允许&#xff0c;禁止转载 &#x1f6a9;本专题部分内容源于《InfiniBand-n…

C++ 智能指针最佳实践源码分析

智能指针在 C11 标准中被引入真正标准库&#xff08;C98 中引入的 auto_ptr 存在较多问题&#xff09;&#xff0c;但目前很多 C开发者仍习惯用原生指针&#xff0c;视智能指针为洪水猛兽。但很多实际场景下&#xff0c;智能指针却是解决问题的神器&#xff0c;尤其是一些涉及多…

QT之Windows开发及源码调试环境搭建

QT之Windows开发及源码调试环境搭建1. QT 安装2. 配置源码调试2.1 QTCreator2.2 Visual Studio 20193. 参考1. QT 安装 QT对5.15以及以上版本提供在线安装工具 官方链接清华镜像&#xff0c;但是这里面没由Windows的在线安装工具(2022/11/11查看的时候没有) 这里安装以QT 5.…

全是狠活!SpringBoot文档也太那个了,图文并茂详尽讲解

前沿 SpringBoot是由Pivotal团队提供的在Spring框架基础之上开发的框架&#xff0c;其设计目的是用来简化应用的初始搭建以及开发过程。 SpringBoot本身并不提供Spring框架的核心特性以及扩展功能&#xff0c;只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是…