javascript - 如何避免 React 中 3 个类似按钮的代码重复?
问题描述
我有 3 个用于 3 种不同语言的按钮,
用户可以选择显示哪种语言文本:
“德国德语”
“法国法语”
“英语”
// This is state of component:
state = {
translationOptions: {
german: false,
french: false,
english: true
}
};
// This is function which change the language
<button
className={`doc-translation-btn ${german ? 'active-background-color' : ''}`}
onClick={() => this.changeDocumentLanguage('german')}
>
DE
</button>
<button
className={`doc-translation-btn ${french ? 'active-background-color' : ''}`}
onClick={() => this.changeDocumentLanguage('french')}
>
FR
</button>
<button
className={`doc-translation-btn ${english ? 'active-background-color' : '' }`}
onClick={() => this.changeDocumentLanguage('english')}>
EN
</button>
如何优化这段代码?
解决方案
const langs = [{name: 'German', abbr: 'GE'}, {name: 'French', abbr: 'FR'},
{name: 'English', abbr: 'EN'}]
//// Assuming React Stateful Component
state = {
translationOption: '' //Will be of of German, French, or English on state change
}
////
render() {
return (
<div>
{langs.map(({ name, abbr }) => (
<button
className={`doc-translation-btn ${name ===
this.state.translationOption ? 'active-background-color' : '' }`}
onClick={() => this.setState({ translationOption: name })>
{abbr}
</button>
)}
</div>
)
}
注意:如果您想用单独的布尔属性处理适用的翻译语言——无论是嵌套的还是其他的——你需要考虑在你的状态处理程序方法中将另一个属性设置为 true 时将其他属性切换为 false (假设一次只能应用一种翻译)。像这样的方法可以工作:
handleLangChange = selectedLang => {
const { translationOptions: oldOpts } = this.state;
const translationOptions = Object.keys(oldOpts).reduce((acc, cur) => {
return { ...acc, [cur]: cur === selectedLang };
}, {})
this.setState({ ...this.state, translationOptions });
}
推荐阅读
- javascript - JS - Cookie 管理
- c++ - 为我的链表实现一个迭代器类。使用关键字是什么?
- bash - 如何在 Bash shell 的减号和小数位之间打印“零”
- php - 将一个字符串乘以一个整数
- javascript - 如何在Javascript和逻辑公式中获得一个月中有多少周和多少天
- python - 使用日期标题计算数据帧中数据行的平均值,由“日期时间”列指示
- ionic-framework - 如何在某些选项卡中创建身份验证
- r - 如何在 R 的函数中使用 colnames() 而不将数字输出转换为字符?
- ansible - 在 Ansible playbook 中针对特定主机执行特定任务
- c# - 当我在循环中使用 gridview 时,导出返回空