javascript - 请解释 react.js 应用中上下文的使用
问题描述
我正在研究下面的 nomadgram 应用程序的前端代码。. .
https://github.com/nomadcoders/nomadgram.git
frontend/src/components/footer/index.js
下面列出了来自的代码,其中包含以下几行:
<li className={styles.listItem}>{context.t("About Us")}</li>
我不明白context.t("About Us")
代码的用法。这种风格的上下文使用在这个应用程序中无处不在,我似乎无法理解它。
一些帮助将不胜感激!
import React from "react";
import PropTypes from "prop-types";
import styles from "./styles.scss";
const Footer = (props, context) => (
<footer className={styles.footer}>
<div className={styles.column}>
<nav className={styles.nav}>
<ul className={styles.list}>
<li className={styles.listItem}>{context.t("About Us")}</li>
<li className={styles.listItem}>{context.t("Support")}</li>
<li className={styles.listItem}>{context.t("Blog")}</li>
<li className={styles.listItem}>{context.t("Press")}</li>
<li className={styles.listItem}>{context.t("API")}</li>
<li className={styles.listItem}>{context.t("Jobs")}</li>
<li className={styles.listItem}>{context.t("Privacy")}</li>
<li className={styles.listItem}>{context.t("Terms")}</li>
<li className={styles.listItem}>{context.t("Directory")}</li>
<li className={styles.listItem}>{context.t("Language")}</li>
</ul>
</nav>
</div>
<div className={styles.column}>
<span className={styles.copyright}>© 2017 Nomadgram</span>
</div>
</footer>
);
Footer.contextTypes = {
t: PropTypes.func.isRequired
};
export default Footer;
解决方案
组件由两个主要驱动因素:状态和道具。state 在组件内部,props 由父组件向下传递。
但有时通过一长串组件向下传递 props 可能会很麻烦,因此可以使用第三个东西:上下文。上下文允许组件为其后代提供一些数据,而无需确切知道哪些后代需要它。
所以在组件树更高的地方,有一个看起来像这样的组件,并且正在t
与任何想要它的后代共享一个命名的函数:
class MyProviderComponent extends React.Component {
getChildContext() {
return {
t: function (key) {
return 'something something';
}
}
}
}
MyProviderComponent.childContextTypes = {
t: PropTypes.func.isRequired
};
如果我不得不猜测,真正的t
函数可能会进行字符串翻译。
请注意,您的代码和我添加的代码使用的是旧的上下文 api。在 React 16 中,他们引入了一个新的上下文 api。您可以在此处阅读有关当前上下文 api和旧 api的更多信息
推荐阅读
- java - 从一个对象到另一个对象的Java条件映射?
- asp.net-core - 我们如何在asp.net 2.1核心应用程序的启动类中注册IHttpContextAccessor?
- r - 如何在 R 中查找
- python - 更改散点图中的标记大小
- python-asyncio - asyncio 的 call_soon 失败,而 create_task 没有
- javascript - 在 Xamarin.Forms WebView 中执行 Javascript
- c# - WPF C#设置为自动后获取网格高度
- ios - 在 xCode 存档的导出中,如何从命令行禁用目标签名
- vba - 使用书签访问 Word,如果书签留空,如何执行操作
- php - 如何在 div 标签中添加占位符