vuex我也能手写了!

前言

vuex给组件通信带来了极大便利,想想我们是不是也能打造一个简易版的vuex呢?

正文

实现vuex

vuex的基本用法如下:

  1. 首先引入createStore ,调用createStore(传入一个对象 作为参数)并将结果store这个实例对象抛出 ,在main.js中引入 store后将它use掉。
  2. 访问仓库数据只需引入useStore调用它后就能访问了。
  3. 触发mutations中的方法需使用commit('方法名' , 参数)来触发

步骤一

我们根据它的基本用法,我们使用 先搭建一个基本框架

js 复制代码
class Store {
    constructor(options) {
        this.$options = options  //一个对象
        this._state = reactive({  //响应式数据源
          data: options.state()
        })
        this._mutations = options.mutations
    }

function createStore(options) {
  return new Store(options)
}

export {
  createStore
}

步骤二

我们访问仓库数据源会直接store.state ,但是这里访问则是store._state.data ,那么可以使用get关键字去声明一个函数,直接解决问题!

js 复制代码
get state() { 
    return this._state.data
}

步骤三

因为 Vuex 插件需要被 use() 才能被使用,所以必须要有个 install 方法,其中接收的参数app 就是Vue ,我们利用 Vue 的provide方法将其提供出去

js 复制代码
 install(app) {   //将store挂载到全局   app就是vue
    app.provide('_store_', this)
 }

步骤四

为了能获取到仓库数据,我们需要打造一个useStore方法并抛出,也就是说把这个仓库的实例对象注入到组件中。(const store = useStore() 相当于 inject('store'))

js 复制代码
function useStore() {
  return inject('_store_')
}

步骤五

我们要访问仓库中mutations的方法得使用store.commit()进行触发,它接收一个函数名 ,其它为剩余的参数

js 复制代码
 commit(method, ...args) {  //触发mutations中的方法
    const fn = this._mutations[method]  //获取mutations中的方法
    fn && fn(this.state, ...args)  //如存在则调用mutation中的方法,这个方法接收state和剩余参数
 }

这里只打造了可以访问数据源和触发mutation中方法的简易版vuex,其它模块的实现也不会太难,最后附上整份代码:

js 复制代码
//手动实现vuex
import { reactive, inject } from 'vue'
class Store {
   constructor(options) {
        this.$options = options  //一个对象
        this._state = reactive({  //响应式数据源
          data: options.state()
        })
        this._mutations = options.mutations
   }

  get state() {
    return this._state.data
  }

  commit(method, ...args) {  //触发mutations中的方法
    const fn = this._mutations[method]  //获取mutations中的方法
    fn && fn(this.state, ...args)  //如存在则调用这个方法
  }

  install(app) {   //将store挂载到全局   app就是vue
    app.provide('_store_', this)
  }

}

function createStore(options) {
  return new Store(options)
}

function useStore() {
  return inject('_store_')
}

export {
  createStore,
  useStore
}
相关推荐
椒盐螺丝钉7 小时前
Vue Router应用:组件跳转
前端·javascript·vue.js
芳草萋萋鹦鹉洲哦9 小时前
【vue】调用同页面其他组件方法几种新思路
前端·javascript·vue.js
爱泡脚的鸡腿12 小时前
uni-app D4 实战(小兔鲜)
前端·vue.js·架构
广白12 小时前
钉钉小程序直传文件到 阿里云OSS
前端·vue.js·uni-app
摇滚侠13 小时前
Vue 项目实战《尚医通》,完成订单详情静态的搭建,笔记47
vue.js·笔记
特级业务专家14 小时前
续集:Vite 字体插件重构之路 —— 从“能用”到“生产级稳定”
javascript·vue.js·vite
Coder-coco14 小时前
个人健康系统|健康管理|基于java+Android+微信小程序的个人健康系统设计与实现(源码+数据库+文档)
android·java·vue.js·spring boot·微信小程序·论文·个人健康系统
一 乐16 小时前
英语学习激励|基于java+vue的英语学习交流平台系统小程序(源码+数据库+文档)
java·前端·数据库·vue.js·学习·小程序
老华带你飞16 小时前
个人健康系统|健康管理|基于java+Android+微信小程序的个人健康系统设计与实现(源码+数据库+文档)
android·java·vue.js·微信小程序·论文·毕设·个人健康系统
JIngJaneIL16 小时前
停车场管理|停车预约管理|基于Springboot+的停车场管理系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·notepad++·停车场管理|