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

这篇具有很好参考价值的文章主要介绍了vue全家桶进阶之路37:Vue3 状态管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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应用程序中使用它来管理全局状态。

 

 

 

mutations的常用方法:

在Vue.js中,mutations是Vuex中用于修改状态的方法。以下是一些常用的mutations方法:

  1. 增加或减少状态值:
mutations: {
  increment(state) {
    state.count++;
  },
  decrement(state) {
    state.count--;
  }
}
  1. 更新状态值:
mutations: {
  updateName(state, newName) {
    state.name = newName;
  }
}

 

  1. 重置状态:
mutations: {
  reset(state) {
    state.count = 0;
    state.name = '';
  }
}

 

  1. 更新对象类型的状态属性:
mutations: {
  updateUserInfo(state, newUserInfo) {
    state.user = { ...state.user, ...newUserInfo };
  }
}

 

  1. 更新数组类型的状态属性:
mutations: {
  addItem(state, newItem) {
    state.items.push(newItem);
  },
  removeItem(state, index) {
    state.items.splice(index, 1);
  }
}

 

  1. 使用payload来传递数据:
mutations: {
  updateValue(state, payload) {
    state.value = payload.newValue;
  }
}

 

在这种情况下,payload是一个包含要传递给mutation的数据的对象。

这些是一些常见的mutations方法示例,你可以根据你的具体需求和应用程序的状态设计自定义的mutations方法。记住,mutations应该是同步的,并且只负责修改状态,而不应该进行异步操作。如果需要进行异步操作,应该使用actions来处理。文章来源地址https://www.toymoban.com/news/detail-417723.html

到了这里,关于vue全家桶进阶之路37:Vue3 状态管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue全家桶进阶之路50:Vue3 环境变量+跨域设置实例

    使用.env加后缀的方式来建立某个模式下的环境变量, 例如:项目根目录新建两个环境变量文件(development开发环境和production生产环境):  在新建的两个环境变量文件中设置相同的环境变量名: 环境变量名称必须以\\\"VUE_API_\\\"+名称的格式,否则不生效,这个格式是死的。至于

    2023年04月21日
    浏览(45)
  • vue全家桶进阶之路32:Vue3 WatchEffect和watch 监听

    在 Vue 3 中, watchEffect 是一个用于监听响应式数据变化的 API。它可以在函数内部自动跟踪数据的依赖,并在依赖变化时重新运行函数。 watchEffect  的作用以及各个参数的功能讲解: watchEffect(effect: (onInvalidate: InvalidateCbRegistrator) = void | (() = void) | Promisevoid, options?: WatchEffectOptio

    2023年04月17日
    浏览(78)
  • vue全家桶进阶之路48:Vue3 跨域配置devServer的参数和设置

    devServer 是一个用于配置开发服务器的选项对象。它可以用来配置服务器的各种选项,例如代理,端口号,HTTPS 等。 以下是一些常用的 devServer 参数和设置: port :指定开发服务器的端口号,默认为 8080 。 host :指定开发服务器的主机名,默认为 localhost 。 https :开启 HTTPS,可

    2023年04月21日
    浏览(45)
  • vue全家桶进阶之路46:Vue3 Axios拦截器和globalProperties全局设置

    在Vue.js 3中,使用Axios与Vue.js 2.x中类似,但是需要进行一些修改和更新,下面是Vue.js 3中Axios的定义和使用方式: 首先,你需要安装Axios和Vue.js 3.x,可以使用npm或yarn等包管理工具安装: 然后,在你的Vue.js 3应用程序中,你可以使用以下代码来导入和使用Axios: 上面的代码使用

    2023年04月20日
    浏览(52)
  • vue全家桶进阶之路47:Vue3 Axios拦截器封装成request文件

    可以将Axios拦截器封装成一个单独的request文件,以便在整个应用程序中重复使用。 以下是一个示例,展示如何将Axios拦截器封装成一个request文件: 1、创建一个名为request.js的新文件,并导入Axios: 2、创建一个名为request的函数,并将其导出: 这将创建一个名为request的函数,

    2023年04月21日
    浏览(53)
  • vue全家桶进阶之路43:Vue3 Element Plus el-form表单组件

    在 Element Plus 中, el-form 是一个表单组件,用于创建表单以便用户填写和提交数据。它提供了许多内置的验证规则和验证方法,使表单验证更加容易。 使用 el-form 组件,您可以将表单控件组织在一起,并对表单进行验证,以确保提交的数据符合预期的格式和要求。该组件具有

    2023年04月20日
    浏览(45)
  • vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs

    ref 在 Vue 3 中,你可以使用 setup 函数来定义组件的数据和方法。在 setup 函数中,你可以使用 ref 、 reactive 和 computed 等 Vue 3 的响应式 API 来定义数据,并返回一个包含你需要公开的数据和方法的对象。下面是一个例子: 在这个例子中,我们使用 ref 函数来定义了一个名为 mes

    2023年04月19日
    浏览(54)
  • 【Vue全家桶】Pinia状态管理

    🤗这里是前端程序员小张! 🌻人海茫茫,感谢这一秒你看到这里。希望我的文章对你的有所帮助! 🌟愿你在未来的日子,保持热爱,奔赴山海! Pinia开始于大概2019年,其目的是设计一个拥有 组合式 API 的 Vue 状态管理库 目前同时兼容Vue2、Vue3,也并不要求你使用Compositio

    2023年04月09日
    浏览(64)
  • Vue | Vue.js 全家桶 Pinia状态管理

    🖥️ Vue .js专栏:Node.js Vue.js 全家桶 Pinia状态管理 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力❤️ 目录 一、Pinia和Vuex的对比 什么是Pinia呢? Pina和

    2024年01月16日
    浏览(53)
  • electron+vue3全家桶+vite项目搭建【16.1】electron多窗口,pinia状态同步,扩展store方法,主动同步pinia的状态【推荐】

    demo项目地址 我们之前写了一个自动同步pinia状态的插件,可以参考如下文章 electron+vue3全家桶+vite项目搭建【16】electron多窗口,pinia状态无法同步更新问题解决 这里面有一个较大的弊端,就是pinia中的store,只要其中的某个属性修改,就会触发这个store的全量更新,当我们有一

    2024年02月11日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包