首页 > 其他分享 >vue全家桶进阶之路37:Vue3 状态管理

vue全家桶进阶之路37:Vue3 状态管理

时间:2023-04-18 20:44:49浏览次数:42  
标签:count 状态 vue 进阶 37 state increment Vuex store

Vue3 的状态管理主要是通过 Vuex 4 来实现。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

在Vue3的状态管理中,以下是各个属性的作用:

  • state:存储应用程序中的状态数据。它可以包含任何类型的数据,包括基本类型、对象、数组等。可以通过commit和dispatch方法来修改state中的数据。
  • getters:允许你基于 store 中的 state 数据进行计算。类似于Vue组件中的计算属性。通过getters,我们可以将store中的状态数据进行加工、过滤、处理后再返回给组件使用,而无需在组件中手动操作state数据。
  • mutations:用于修改store中的状态数据。每个mutation都有一个字符串的类型和一个handler函数。在handler函数中,我们可以进行同步操作来修改state中的数据。需要注意的是,mutations中的函数必须是同步函数,否则会导致状态不可预测。
  • actions:用于处理异步任务以及提交mutations。在actions中,我们可以编写异步代码,例如向后端API发送请求获取数据等操作。然后通过commit方法提交mutation,以更新state中的数据。actions中的函数是可以是异步函数的,因此我们可以在其中执行异步操作。
  • modules:允许我们将store分割成模块,每个模块都有自己的state、mutations、actions、getters等,以便于管理和维护。每个模块都可以有自己的子模块,形成树状结构。

总的来说,状态管理的主要作用是将组件中的状态数据集中管理,从而避免了在不同组件之间传递大量的数据。同时,使用状态管理可以使我们更好地组织代码,将逻辑分离,提高代码的可维护性和可读性。

下面是一个简单的示例,演示了如何在 Vue3 中使用 Vuex 4 来实现状态管理。

首先,在项目中安装 Vuex 4:

npm install vuex@next --save

然后,在应用程序的入口文件中,创建一个 Vuex store 并导出它:

import { createStore } from 'vuex'

const store = createStore({
  state() {
    return {
      count: 0
    }
  },
  mutations: {
    increment(state) {
      state.count++
    },
    decrement(state) {
      state.count--
    }
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  },
  getters: {
    count(state) {
      return state.count
    }
  }
})

export default store

在上面的示例中,createStore() 函数用于创建一个 Vuex store。在 state 对象中,定义了应用程序的状态,这里只定义了一个 count 属性,并初始化为 0。在 mutations 对象中,定义了修改状态的方法,这里定义了两个方法:incrementdecrement。在 actions 对象中,定义了异步操作的方法,这里定义了一个名为 incrementAsync 的方法,它在 1 秒后调用 increment 方法。在 getters 对象中,定义了计算属性的方法,这里定义了一个名为 count 的计算属性。

接着,在应用程序的入口组件中,使用 useStore() 函数来注入 Vuex store:

<template>
  <div>
    <h1>Count: {{ count }}</h1>
    <button @click="increment">Increment</button>
    <button @click="decrement">Decrement</button>
    <button @click="incrementAsync">Increment Async</button>
  </div>
</template>

<script>
import { defineComponent, useStore } from 'vue'

export default defineComponent({
  setup() {
    const store = useStore()

    const increment = () => {
      store.commit('increment')
    }

    const decrement = () => {
      store.commit('decrement')
    }

    const incrementAsync = () => {
      store.dispatch('incrementAsync')
    }

    return {
      count: store.getters.count,
      increment,
      decrement,
      incrementAsync
    }
  }
})
</script>

在上面的示例中,useStore() 函数用于注入 Vuex store,并将其赋值给 store 变量。然后,定义了三个方法:incrementdecrementincrementAsync,它们分别调用了 Vuex store 中定义的 incrementdecrementincrementAsync 方法。在组件的 return 语句中,使用 store.getters.count 访问了计算属性 count 的值,以供模块调用。

 

 

Vue3提供了一个新的状态管理工具,即Vuex 4。它与Vue3一起使用,可用于在应用程序中管理全局状态。Vuex 4的设计目标是在减少样板代码的同时提高开发人员的工作效率和开发速度。

与Vuex 3相比,Vuex 4的一个重要改变是将核心代码与Vue3的新响应式API集成在一起。这意味着你不需要使用getter和setter来声明状态或修改它们,而可以使用Vue3的新响应式API。

import { createStore } from 'vuex'

const counterModule = {
  state() {
    return {
      count: 0
    }
  },
  mutations: {
    increment(state) {
      state.count++
    },
    decrement(state) {
      state.count--
    }
  },
  actions: {
    asyncIncrement(context) {
      setTimeout(() => {
        context.commit('increment')
      }, 1000)
    }
  },
  getters: {
    doubledCount(state) {
      return state.count * 2
    }
  }
}

const store = createStore({
  modules: {
    counter: counterModule
  }
})

export default store

在这个例子中,我们使用createStore函数创建一个新的Vuex store。counterModule是一个包含计数器状态的模块,其中包含一个state对象,用于存储计数器值,以及mutationsactionsgetters对象,用于操作和派生计数器状态。

最后,我们将计数器模块添加到store中,以便在应用程序中访问它。现在我们已经设置好了Vuex 4 store,我们可以在Vue3应用程序中使用它来管理全局状态。

标签:count,状态,vue,进阶,37,state,increment,Vuex,store
From: https://www.cnblogs.com/beichengshiqiao/p/17331028.html

相关文章

  • 【Vue】Vue路由总结
    由vue-router模块控制,需要额外安装依赖。参考官网npminstallvue-router--save组成router-link路由跳转,类似a标签,路由跳转作用<router-linkto=""/>router-view路由视图,用于其他组件在该视图位置显示。<router-viewname="name"/><!--可以指定视图名,在路由跳转时......
  • vue2源码-八、依赖收集的过程
    依赖收集的过程前言使用真实节点替换原始节点,主要涉及以下步骤:1.新老节点的更新方案。2.虚拟节点与真实节点映射。3.实现新老节点的替换。依赖收集已经完成了Vue的两大核心部分:响应式数据和数据渲染,即完成了整个Vue的初始化流程:当newVue()时,执行_init初始化,通过moun......
  • vue03 01.创建项目
    目录01.创建项目打包工具vite介绍安装命令启动项目浏览效果代码目录打包预览运行插件使用01.创建项目打包工具vite官网vite学习视频vite介绍Vite也是前端构建工具相较于webpack,vite采用了不同的运行方式:开发时,并不对代码打包,而是直接采用ESM的方式来,而是直接采用ESM的方式来运行......
  • vue前端实现上传文件,vue 上传文件
     以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region文件上传可以带参数[HttpPost("upload")]publicJsonResultuploadProject(IFormFilefile,stringuserI......
  • vue
    vuevue使用端口号静态是在static里面index。html不能改变id=app是绑定的一对一绑定webpack学习静态模块打包器到处暴露export,暴露了HelloWorld有暴露就有,导入import安装webpack使用webpack建立一个项目暴露一个方法有暴露就有引入接收,然后调用方法......
  • Vue中 $attrs、$listeners 详解及使用
    传送门:Vue中子组件向父组件传值及.sync修饰符详解传送门:Vue中状态管理器(vuex)详解及应用场景传送门:Vue中事件总线(eventBus)详解及使用传送门:Vue中provide、inject详解及使用Vue中常见的组件通信方式可分为三类父子通信父向子传递数据是通过props,子向父是通过events($emit);......
  • Vue 登录login post请求 security UserDetailsService 获取参数为""
    背景原请求将数据放到params中,导致数据拼接在请求地址后面,具有高级安全隐患。请求方法:axios.request({url:'/login',method:'post',params:{username:'****',password:'****'}})出现的问题将params改成data,使数据放在请求体中,但后端自定义的U......
  • 客服系统vue源码聊天界面,ajax上传图片功能实现
    在线客服系统的聊天界面上,有上传图片按钮功能,使用js实现ajax上传图片功能html部分,有一个点击事件<divclass="iconExtendBtn"@click="uploadImg"><divclass="elIconel-icon-picture"></div>......
  • Vue3移动端适配解决方案
    导读:使用vw和vh解决适配问题vw:viewwidth屏幕宽度,1vw等于屏幕宽度的百分之一vh:viewheight屏幕高度,1vh等于屏幕高度的百分之一使用插件postcss-px-to-viewport可以自动将px转换为vw/vh安装npmipostcss-px-to-viewport-Dvite.config.tsimportvuefrom'@vitejs/plugin......
  • 【Vue2.x源码系列06】计算属性computed原理
    上一章Vue2异步更新和nextTick原理,我们介绍了JavaScript执行机制是什么?nextTick源码是如何实现的?以及Vue是如何异步更新渲染的?本章目标计算属性是如何实现的?计算属性缓存原理-带有dirty属性的watcher洋葱模型的应用初始化在Vue初始化实例的过程中,如果用户options选......