手写vuex4源码(二)组件install逻辑

文章详细分析了Vuex的使用,包括其install方法用于创建多个store实例,以及createStore和useStore方法如何实现全局和组件内的状态管理。同时介绍了如何创建Vuex插件,通过install方法在应用启动时调用,实现store实例的全局暴露。此外,文章还阐述了模块设计思路,包括插件安装逻辑、store类的初始化以及在组件中使用$store的方式。
摘要由CSDN通过智能技术生成

一、分析vuex

从vuex使用角度分析

  • vuex是一个对象
  • 对象上有install方法,在app.use(store)时调用
  • 可以创建多个store实例,工厂模式
createApp(App).use(store,'my').mount('#app')
  • 对象上有createStore和useStore方法
  • vuex实现挂载到全局和组件内访问(inject获取 和$store获取)

二、创建vuex插件

// 创建容器,返回一个store 工厂模式
class Store {
    constructor(options) {
     
    }
    install(app, injectKey) { //createApp.use(store)
    }
}
export function createStore() {}

export function useStore() {}

三、模块设计

  • install:插件安装逻辑,在createApp.use(store)时调用
  • store类:容器初始化
  • createStore和useStore:提供给组件使用

1、install

install方法在createApp.use(store)时调用
全局暴露一个变量:store的实例
提供一个默认的实例,如果传入则采用传入的
同时实现在组件中使用$store

 install(app, injectKey) { //createApp.use(store)
        // console.log(app,injectKey)
        // 把store提供出去,全局暴露一个变量:store的实例

        // app是一个对象,相当于vue2的实例,vue3没有实例
        // 给根app增加一个_provide,子组件会去向上查找
        app.provide(injectKey || storeKey, this)
        // vue.prototype.$store 实现在组件中使用$store
        app.config.globalProperties.$store = this;
    }

2、createStore

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

3、useStore

// 不需要app.inject,vue内部已经将这些api导出来了
export function useStore(injectKey = storeKey) {
    return inject(injectKey)
}
 const store = useStore();
 console.log(store)

四、测试使用效果

class Store {
    constructor(options) {
        this.a = 100
    }
    ...
}

在这里插入图片描述

初始vuex/index.js文件

import { inject } from "vue"

// 创建容器,返回一个store 工厂模式
const storeKey = 'store'
class Store {
    constructor(options) {
    }
    install(app, injectKey) { //createApp.use(store)
        // console.log(app,injectKey)
        // 把store提供出去,全局暴露一个变量:store的实例

        // app是一个对象,相当于vue2的实例,vue3没有实例
        // 给根app增加一个_provide,子组件会去向上查找
        app.provide(injectKey || storeKey, this)
        // vue.prototype.$store 实现在组建中使用$store
        app.config.globalProperties.$store = this;
    }
}
export function createStore(options) {
    return new Store(options)
}

// 不需要app,vue内部已经将这些api导出来了
export function useStore(injectKey = storeKey) {
    return inject(injectKey)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值