当前位置: 首页 > article >正文

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

一、分析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)
}

http://www.kler.cn/a/6312.html

相关文章:

  • 低代码开发中 DDD 领域驱动的页面权限控制
  • 【Python高级353】python实现多线程版本的TCP服务器
  • 计算机网络概要与习题
  • 智驾感知「大破局」!新一轮混战开启
  • 教培行业数字化未来:一站​式开发在线教育系统源码与网校APP详解
  • leetcode之hot100---2两数相加(C++)
  • Android ART虚拟机 GC的各种类型
  • 分享一个国内可用的免费ChatGPT网站
  • 15_I.MX6ULL_LCD显示原理
  • [C++]类与对象上篇
  • DFSBFS总结
  • 《高等工程数学》习题卷(一)
  • 蓝桥杯训练day5
  • 【深度学习】基于Hough变化的答题卡识别(Matlab代码实现)
  • Text to image论文精读GigaGAN: 生成对抗网络仍然是文本生成图像的可行选择
  • day30 ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独
  • OBProxy 路由策略与使用运维-使用和运维
  • c++全排列 next_permutation()函数
  • 字节测试总监,让我们用这份《测试用例规范》,再也没加班过
  • 【故障诊断】基于最小熵反卷积、最大相关峰度反卷积和最大二阶环平稳盲反卷积等盲反卷积方法在机械故障诊断中的应用研究(Matlab代码实现)
  • vue尚品汇商城项目-day03【20.获取Banner轮播图的数据+21.使用swiper轮播图插件】
  • 【ZGC】为什么初始标记需要STW(stop the world) ?
  • 操作系统-AOSOA
  • AnaXNet: Anatomy Aware Multi-label Finding Classification in Chest X-ray
  • java14 使用增强的模式匹配切换表达式
  • Android 热修复小结