千家信息网

vue3怎么使用provide实现状态管理

发表于:2025-11-17 作者:千家信息网编辑
千家信息网最后更新 2025年11月17日,这篇文章主要介绍vue3怎么使用provide实现状态管理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言在 Vue 生态中, Vuex 这个官方的状态管理库在 Vue 应用
千家信息网最后更新 2025年11月17日vue3怎么使用provide实现状态管理

这篇文章主要介绍vue3怎么使用provide实现状态管理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

    前言

    在 Vue 生态中, Vuex 这个官方的状态管理库在 Vue 应用开发中,为我们带来了非常便捷的功能。但是 Vuex 20K+ 的大小,也带来了一些成本,对于项目规模较小的应用来说, 引入 Vuex 只是为了存储用户信息之类的一小撮数据,有点不值得。

    Vue2.2.x 在后期就提供了 provide/inject API 来帮我们实现跨层级组件之间的通信。

    Vue3.x 把 provide 也放到了应用 API 上,这就更方便让我们在此基础上,实现一个基础的状态管理。

    如何通过 provide/inject 实现 Vuex的功能

    首先我们想一下大概的逻辑,把它做成一个插件,通过 use 方法注册到应用实例中。

    在 install 方法中,通过 app.provide 方法,把数据挂载到根组件上,该数据应该是一个响应式数据,并且为了数据安全,应该对数据的变更进行限制,遵循单向数据流的设计,不能让用户直接的进行修改,所以在暴露数据时,应该对数据进行 readonly(只读) 处理。

    实现类似 Vuex 的 useStore 功能,让用户通过此方法访问数据。

    实现类似 Vuex 的 mapState、mapMutations 和 mapActions方法,简化操作。

    用法直接跟 Vuex 一样。

    在应用中注册此插件

    // main.tsimport { createApp } from 'vue'import App from './App.vue'import router from './router'import store from './store'const app = createApp(App)app.use(router).use(store).mount('#app')

    插件的入口文件

    在入口文件中,直接导出所有方法。

    // sky-vuex/index.tsexport * from './main/index'

    创建 store ,把对应的数据挂载到根组件上

    store 本身是一个对象,包含 state 属性和 commit、dispatch 等方法。 store 最主要的一些功能就是让所有组件,都能拿到 store 对象,来获取 state 中的数据,以及调用相关方法来修改 state。

    // sky-vuex/main/index.tsimport {inject, reactive, readonly} from 'vue'const mainStoreSky = Symbol('main store key')interface storeOptions {  state?: any  actions?: any  mutations?: any}export const createStore = (options: storeOptions = {}) => { // 创建 store 对象  const initOptions = {    state: {},    actions: {},    mutations: {},  }  const mergeOptions: storeOptions = Object.assign(initOptions, options)  const state = reactive(mergeOptions.state)  const store = {    state: readonly(state),    dispatch(eventName: string, ...args: any[]) {      mergeOptions.actions[eventName](store, ...args)    },    commit(eventName: string, ...args: any[]) {      ...    },  }  return {    install(app: any) {      app.provide(mainStoreSky, store)    },  }}export const useStore = (): any => { // 其他组件通过此方法,获取 store 对象  return inject(mainStoreSky)}

    实现 mapState、mapMutations 和 mapActions方法

    export const mapState = () => {  const store = useStore()  return store.state}export const mapActions = (eventName: string) => {  const store = useStore()  return (...args: any[]) => store.dispatch(eventName, ...args)}export const mapMutations = (eventName: string) => {  const store = useStore()  return (...args: any[]) => store.commit(eventName, ...args)}

    组件中使用

    // store/index.tsimport { createStore } from '../sky-vuex/index'export default createStore({  state: {    age: 18  },  mutations: {    setAge(state: any, data: number) {      state.age = data    }  },})
    // Home.vue

    以上是"vue3怎么使用provide实现状态管理"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

    数据 方法 组件 应用 状态 管理 功能 对象 插件 用户 入口 内容 基础 文件 此方法 篇文章 便捷 安全 之间 价值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全工作的目标包括什么 毛小孩网络技术有限公司 沧州东胜软件开发 腾讯软件开发公司咋样 吉安壬酝网络技术有限公司 开平区企业网络技术不二之选 防火墙关了还是连不上数据库 什么是网络安全检测与评估 上千台服务器防火墙管理 罗马尼亚欧洲网络安全中心 和网络安全相关的大学 我的世界无主城生存服务器 巴南区工商软件开发流程要求 东方希望集团软件开发怎么样 滨州企业党建软件开发 鄂尔多斯网络安全知识竞答题 私人云服务器 项目需要用到几个应用服务器 福建运营软件开发介绍 网络安全和信息安全管理办法 机房服务器命名规范 济宁app软件开发系统 香港租游戏服务器经验 同上一堂课网络安全线上操作流程 有关网络安全的简笔画黑白 怎么看我的服务器 智慧门店服务器设置 游戏服务器 客户端 数据库开始的页面 mit人脸数据库
    0