/* * @Description: * @Author: Format-qi 283810417@qq.com * @Date: 2022-03-06 13:16:00 * @LastEditors: Format-qi 283810417@qq.com * @LastEditTime: 2022-06-24 15:30:58 */ import { InjectionKey, provide, inject, reactive, readonly as defineReadonly, // defineComponent, UnwrapRef, } from 'vue'; export interface CreateContextOptions { readonly?: boolean; createProvider?: boolean; native?: boolean; } type ShallowUnwrap = { [P in keyof T]: UnwrapRef; }; export function createContext( context: any, key: InjectionKey = Symbol(), options: CreateContextOptions = {}, ) { const { readonly = true, createProvider = false, native = false } = options; const state = reactive(context); const provideData = readonly ? defineReadonly(state) : state; !createProvider && provide(key, native ? context : provideData); return { state, }; } export function useContext(key: InjectionKey, native?: boolean): T; export function useContext( key: InjectionKey = Symbol(), defaultValue?: any, ): ShallowUnwrap { return inject(key, defaultValue || {}); }