全局状态的 `createContext()` 和 `createSignal()` 之间的区别
Difference between `createContext()` and `createSignal()` for global state
在 solid-js 中,使用 context, when we can create a signal 并将其导入为 getter/setter/even 来自存储全局存储文件的记忆值有什么好处?:
// ./store/myValue.js
export const [value, setValue] = createSignal('');
据我了解,在多个组件中导入此 value
是完全可以的,并且反应性将在整个组件中保持不变。
我能想到的 store/global 的唯一用例是,如果您的状态变得如此复杂,那么您需要一种更加结构化的类似上下文的方法来提高可维护性、可读性等。
上下文的好处是能够将状态绑定到组件树。假设您有一个要重复使用的单选按钮组。全局状态意味着您只能在页面中使用它一次,以免下一次使用会覆盖上一次 - 将状态与具有上下文的组件绑定将使这项任务变得容易得多。
Solid 中的上下文是一个包裹其子范围的范围。上下文的主要好处是您可以 re-write 组件树的不同级别的上下文值。换句话说,你可以在不同的上下文中同时拥有不同的值。
检查下面的这个例子。当您深入组件树时,我们可以切换主题。全球商店将在每个级别为您提供相同的价值。
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'));
这将输出:
<div>
<div style="color: black;">Child Component</div>
<div style="color: red;">Child Component</div>
<div style="color: blue;">Child Component</div>
<div style="color: green;">Child Component</div>
</div>
在 solid-js 中,使用 context, when we can create a signal 并将其导入为 getter/setter/even 来自存储全局存储文件的记忆值有什么好处?:
// ./store/myValue.js
export const [value, setValue] = createSignal('');
据我了解,在多个组件中导入此 value
是完全可以的,并且反应性将在整个组件中保持不变。
我能想到的 store/global 的唯一用例是,如果您的状态变得如此复杂,那么您需要一种更加结构化的类似上下文的方法来提高可维护性、可读性等。
上下文的好处是能够将状态绑定到组件树。假设您有一个要重复使用的单选按钮组。全局状态意味着您只能在页面中使用它一次,以免下一次使用会覆盖上一次 - 将状态与具有上下文的组件绑定将使这项任务变得容易得多。
Solid 中的上下文是一个包裹其子范围的范围。上下文的主要好处是您可以 re-write 组件树的不同级别的上下文值。换句话说,你可以在不同的上下文中同时拥有不同的值。
检查下面的这个例子。当您深入组件树时,我们可以切换主题。全球商店将在每个级别为您提供相同的价值。
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'));
这将输出:
<div>
<div style="color: black;">Child Component</div>
<div style="color: red;">Child Component</div>
<div style="color: blue;">Child Component</div>
<div style="color: green;">Child Component</div>
</div>