javascript - 丹·阿布拉莫夫的主题变化逻辑
问题描述
你能解释一下这个window.__onThemeChange
函数是如何工作的吗?我试图实现 Dan Abramov 在 gatsby 应用程序中设置暗模式的方法,但我不明白上述功能是如何工作的。首先,它是从内部定义和调用的setTheme()
,newTheme
作为参数。
(function () {
window.__onThemeChange = function () { };
function setTheme (newTheme) {
window.__theme = newTheme;
preferredTheme = newTheme;
document.body.className = newTheme;
window.__onThemeChange(newTheme);
}
var preferredTheme;
try {
preferredTheme = localStorage.getItem('theme');
} catch (err) { }
window.__setPreferredTheme = function (newTheme) {
setTheme(newTheme);
try {
localStorage.setItem('theme', newTheme);
} catch (err) { }
}
var darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
darkQuery.addListener(function (e) {
window.__setPreferredTheme(e.matches ? 'dark' : 'light')
});
setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light'));
})();
然后在组件中使用这个函数来设置状态:
class Layout extends React.Component {
state = {
theme: null,
};
componentDidMount() {
this.setState({ theme: window.__theme });
window.__onThemeChange = () => {
this.setState({ theme: window.__theme });
};
}
这个window.__onThemeChange
函数是刚刚定义的,然后在没有主体的情况下调用,只使用一个参数,newTheme
然后在 Component 中重新定义,作为改变状态的一种方式。丹的回购链接:
定义的文件: https ://github.com/gaearon/overreacted.io/blob/master/src/html.js
组件: https ://github.com/gaearon/overreacted.io/blob/master/src/components/Layout.js
解决方案
我设法弄明白了。window.__onThemeChange
在没有正文的 html.js(这是全局文件)中定义,然后在 Layout 组件中定义此正文(以连接此组件的状态),然后从 html.js 再次调用。丹的方法令人惊叹。
推荐阅读
- mysql - MySQL左连接中的语法问题
- python-3.x - None appereance in a if statment
- python - 在 selenium 中使用“webdriver.Chrome()”时出错
- python - 将文本字符串转换为数据框 - 逗号分隔
- c# - 如何使用 ML.Net 执行具有许多特征的二元分类
- lua - 如果条件不满足,则在 Lua 上中断 while 循环
- angular - 如何将 ngbCarousel 箭头从图像中移开
- vue.js - 如何通过单击另一个 vue 组件中包含的按钮来获取 vue 组件的内容(模态窗口)?
- java - 使用“+”运算符的非字符串操作数后,结果字符串会进入字符串池吗?
- python - 连续训练模型和一次训练模型给出不同的结果