nonaction
Version:
Make state management easily like you do nothing!
35 lines (34 loc) • 1.03 kB
JavaScript
import React, { createContext, useContext } from 'react';
const RootContext = createContext(null);
export const Container = hook => {
// Each hook has uniquely id
return {
_id: Symbol(),
hook
};
};
export const Provider = ({ children, inject }) => {
// Initial 把 inject 上的每個 container 都 initial
// Hook 週期綁定在 Provider 那層
// 再塞進去 Provider 的 value 裡頭 大家 share context
const Collect = {};
Array.isArray(inject)
? inject.forEach(
_container => (Collect[_container._id] = _container.hook())
)
: console.warn(
'[nonaction] Seems like `inject` in your Provider is not an array?'
);
// Type check
return React.createElement(
RootContext.Provider,
{ value: Collect },
children
);
};
export const useProvided = _container => {
// 取出 Context 上對應的東西
// 依照該 Container 的 id 取出對應的 Context value
const ContextValue = useContext(RootContext);
return ContextValue[_container._id];
};