Skip to content

🏗️ Context 系统

类似于 react 的 context.

基于调用栈的上下文传递.

typescript
import { createContext } from 'mve-core';
import { fdom } from 'mve-dom';
import { createSignal } from 'wy-helper';

type Theme = 'light' | 'dark';
const ThemeContext = createContext<{
  setTheme(v: Theme): void;
  getTheme(): Theme;
}>({
  getTheme() {
    return 'light';
  },
  setTheme(v) {},
});

function App() {
  const theme = createSignal<'light' | 'dark'>('light');
  ThemeContext.provide({
    getTheme: theme.get,
    setTheme: theme.set,
  });
  fdom.div({
    children() {
      // 提供 getter 函数
      Header(); // 在此调用栈中可获取到主题
    },
  });
}

function Header() {
  const { getTheme, setTheme } = ThemeContext.consume(); // 获取 getter 函数

  fdom.header({
    s_backgroundColor() {
      return getTheme() === 'dark' ? '#333' : '#f8f9fa'; // 调用获取值
    },
    children() {
      fdom.button({
        onClick() {
          setTheme(getTheme() == 'dark' ? 'light' : 'dark');
        },
        childrenType: 'text',
        children: getTheme,
      });
    },
  });
}

显然,由于只构造一次,并不是像 react 的 context 一样动态变化参数.如何动态变化的参数,一般需要传递 signal与事件,即函数.很少有传常量值。

其它

比如同一层级注入了两个相向的context,取用是向上寻找最新的一个。

基于 MVE 框架构建