reactjs - 避免在类似的布尔状态中重复
问题描述
在我的应用程序中,我有两个具有相似行为的可点击文本,它们正在管理状态,这些状态包含一个布尔值以显示或不显示 React Native 中的模态。
<View style={styles.resultContainer}>
<View style={styles.teamContainer}>
<TouchableOpacity style={styles.teamNameContainer} onPress={toggleIsVisibleTeamA}>
<Text style={styles.teamNameText}>Team A</Text>
</TouchableOpacity>
<View style={styles.teamResultContainer}>
<Text style={styles.teamResultText}>0</Text>
</View>
</View>
<Text style={styles.resultDivider}>x</Text>
<View style={styles.teamContainer}>
<TouchableOpacity style={styles.teamNameContainer} onPress={toggleIsVisibleTeamB}>
<Text style={styles.teamNameText}>Team B</Text>
</TouchableOpacity>
<View style={styles.teamResultContainer}>
<Text style={styles.teamResultText}>0</Text>
</View>
</View>
</View>
我有相同的逻辑来管理这些状态,只有两个我可以内联编写的函数,但我为组织拼接了它
function toggleIsVisibleTeamA() {
setIsVisibleTeamA(!isVisibleTeamA);
}
function toggleIsVisibleTeamB() {
setIsVisibleTeamB(!isVisibleTeamB);
}
我知道这不遵循 DRY 原则,我想不出重构这段代码的方法有什么建议吗?我想把状态变成一个对象,但这会使我猜到的逻辑更加复杂。欣赏它!
解决方案
不是使用两个单独的状态,而是使用单个状态作为对象并将要更新的键传递给 toggleIsVisibleFunction
const [isVisible, setIsVisible] = useState({A: false, B: false});
...
function toggleIsVisibleTeam(team) {
setIsVisible(prev=> ({
...prev,
[team]: !prev[team]
}));
}
...
<View style={styles.resultContainer}>
<View style={styles.teamContainer}>
<TouchableOpacity style={styles.teamNameContainer} onPress={()=> toggleIsVisibleTeam('A')}>
<Text style={styles.teamNameText}>Team A</Text>
</TouchableOpacity>
<View style={styles.teamResultContainer}>
<Text style={styles.teamResultText}>0</Text>
</View>
</View>
<Text style={styles.resultDivider}>x</Text>
<View style={styles.teamContainer}>
<TouchableOpacity style={styles.teamNameContainer} onPress={()=> toggleIsVisibleTeam('B')}>
<Text style={styles.teamNameText}>Team B</Text>
</TouchableOpacity>
<View style={styles.teamResultContainer}>
<Text style={styles.teamResultText}>0</Text>
</View>
</View>
</View>
无论你使用isVisibleTeamA
什么,你现在都会使用isVisible.A
PS您可以通过映射数组来渲染JSX元素来进一步改进
推荐阅读
- python - 拆分后为什么要在此处添加 \t 和 \x08?如何避免这种转换?
- jupyter - JupyterHub Helm 安装:未定义功能“挖掘”
- javascript - 如何有效地映射嵌套对象?
- security - 可以在我的网站中覆盖 applicationhost.config 中 http 动词的 RequestFiltering 值吗?
- visual-studio - Matlab:无法加载文件或程序集
- html - 悬停时菜单在导航栏中向左移动
- lorawan - 无法使 AT Master 应用程序在 NUCLEO-LRWAN1/NUCLEO-L073RZ 对上工作
- android - 我正在尝试调用 DisplayMatch 给 listviewMatch.setAdapter(adapter) 中的错误,如果可能的话,请帮助我提供任何替代方案
- reactjs - 如何在材质 UI 按钮组件上传递数据
- angular - 子组件引用父组件时出现 Angular NG3003 错误