diff --git a/src/react.js b/src/react.js index 2485c7f..322ad5f 100644 --- a/src/react.js +++ b/src/react.js @@ -1,7 +1,30 @@ -import {watch, reactive, toRefs, shallowRef, onUpdated, onMounted, onBeforeUnmount, isRef, isReactive} from 'vue'; +import {watch, reactive, toRefs, shallowRef, onUpdated, onMounted, onBeforeUnmount, isRef, isReactive, defineComponent, toRef, provide, inject, unref} from 'vue'; + +function _createProviderComponent (token) { + return defineComponent({ + props: ['value'], + setup (props, { slots }) { + provide(token, toRef(props, 'value')); + return () => slots.default(); + }, + }); +} -export function createContext() { - return {} +function _createConsumerComponent (token, defaultValue) { + return (props, { slots }) => { + const injection = unref(inject(token, defaultValue)); + return slots.default(injection); + }; +} + +export function createContext(defaultValue) { + const token = Symbol(); + return { + _defaultValue: defaultValue, + _token: token, + Provider: _createProviderComponent(token), + Consumer: _createConsumerComponent(token, defaultValue) + }; } export function forwardRef() { @@ -187,8 +210,7 @@ export function useRef(initialValue) { } export function useContext(context) { - // TODO - context; + return unref(inject(context._token, context._defaultValue)); } export function useCallback(cb, deps) {