全局状态的`createContext()`和`createSignal()`之间的区别

idk*_*gon 5 solid-js

在solid-js中,当我们可以创建一个信号并导入它的getter/setter/甚至是来自存储全局存储类文件的记忆值时,使用context有什么好处?:

// ./store/myValue.js
export const [value, setValue] = createSignal('');
Run Code Online (Sandbox Code Playgroud)

据我了解,将其导入value多个组件中是完全可以的,并且在整个组件中都可以保持反应性。

我能想到的存储/全局的唯一用例是,如果您的状态变得如此复杂,那么您需要一种更加结构化的类似上下文的方法来提高可维护性、可读性等。

snn*_*snn 9

Solid 中的上下文是一个包装其子作用域的作用域对象。上下文的主要好处是您可以在组件树的不同级别重写上下文值。换句话说,你可以同时在不同的环境中拥有不同的价值观。

检查下面这个例子。当您深入组件树时,我们可以切换主题。全球商店将在各个级别为您提供相同的价值。

const ThemeContext = createContext<string>('black');

const Child = () => {
  const theme = useContext(ThemeContext);
  return (
    <div style={{ color: theme }}>Child Component</div>
  );
};

const App = () => {
  return (
    <div>
      <Child />
      <ThemeContext.Provider value='red'>
        <Child />
        <ThemeContext.Provider value='blue'>
          <Child />
        </ThemeContext.Provider>
      </ThemeContext.Provider>
    </div>
  );
}

render(App, document.querySelector('#app'));
Run Code Online (Sandbox Code Playgroud)

这将输出:

<div>
  <div style="color: black;">Child Component</div>
  <div style="color: red;">Child Component</div>
  <div style="color: blue;">Child Component</div>
</div>
Run Code Online (Sandbox Code Playgroud)


小智 5

上下文的好处是能够将状态绑定到组件树。假设您有一个想要重复使用的单选按钮组。全局状态意味着您只能在页面中使用它一次,以免下一次使用会覆盖前一次 - 通过上下文将状态与组件绑定将使此任务变得更加容易。