javascript - 如何处理折叠菜单中常用功能的切换状态?
问题描述
我创建了一个折叠菜单并映射到渲染中的数据我还处理了折叠菜单,该菜单根据其特定的 ID 折叠和展开。但是,当我单击下一个折叠菜单时,它们上一个已关闭,再次单击下一个折叠菜单后,它将打开。我想编写一个功能,当我单击下一个折叠菜单时,前一个折叠菜单关闭,下一个同时打开。例如 lenskart 抽屉但我无法做到这一点
这是我的代码:
const SideMenu = (props) => {
const {signOut} = useContext(AuthContext);
const [Routes, setRoutes] = useState([]);
const [expanded, setCollapse] = useState(false);
const [colId, setColID] = useState('');
const [colorId, setColorID] = useState('');
const [reflink, setRefLink] = useState(false);
useEffect(() => {
getData();
}, []);
const getData = () => {
setRoutes(api.getNavigation());
};
const toggleExpand = (id) => {
setColorID(id);
setRefLink(true);
setColID(id);
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
setCollapse(!expanded);
};
const changeColor = (id) => {
setColorID(id);
setRefLink(true);
};
console.log('expanded', expanded);
return (
<StrictMode>
<ScrollView contentContainerStyle={styles.scroll}>
<View>
{Routes.map((o, i) =>
o.subarr.length > 0 ? (
<View>
<TouchableOpacity onPress={() => toggleExpand(o.id)}>
<View style={styles.mainContainer}>
<View style={[styles.sidebarDesign]}>
<View style={styles.barIcon}>
<Icon.SimpleLineIcons
name={o.icon}
size={20}
color={
colorId === o.id ? Color.linkColor : Color.gray
}
/>
</View>
<View style={styles.barLabel}>
<Text
style={[
styles.labelStyle,
colorId === o.id
? styles.linkText
: styles.normalText,
]}>
{o.title.toUpperCase()}
</Text>
</View>
<View style={styles.barIcon}>
<Icon.SimpleLineIcons
name={
colId === o.id
? expanded
? 'arrow-up'
: 'arrow-down'
: 'arrow-down'
}
size={20}
color={Color.grayDark}
/>
</View>
</View>
</View>
</TouchableOpacity>
{o.subarr.map((r, j) => (
<View>
{colId === o.id
? expanded && (
<TouchableOpacity
onPress={() => {
props.navigation.navigate(r.label);
changeColor(r.id);
}}>
<View style={[styles.sidebarDesign]}>
<View style={styles.barIcon}>
{/* <Icon.FontAwesome
name={r.icon}
size={20}
color={Color.gray}
/> */}
</View>
<View style={styles.barLabel}>
<Text
style={[
styles.labelStyle,
colorId === r.id
? styles.linkText
: styles.normalText,
]}>
{r.label.toUpperCase()}
</Text>
</View>
<View style={styles.barIcon}>
{/* <Text>icon</Text> */}
</View>
</View>
</TouchableOpacity>
)
: null}
</View>
))}
</View>
) : (
<View>
<TouchableOpacity
onPress={() => {
props.navigation.navigate(o.label);
changeColor(o.id);
}}>
<View style={[styles.sidebarDesign]}>
<View style={styles.barIcon}>
<Icon.SimpleLineIcons
name={o.icon}
size={20}
color={
colorId === o.id ? Color.linkColor : Color.gray
}
/>
</View>
<View style={styles.barLabel}>
<Text
style={[
styles.labelStyle,
colorId === o.id
? styles.linkText
: styles.normalText,
]}>
{o.title.toUpperCase()}
</Text>
</View>
<View style={styles.barIcon}>
{/* <Text>icon</Text> */}
</View>
</View>
</TouchableOpacity>
</View>
),
)}
</View>
</View>
{/* <Divider style={styles.parentHr} /> */}
<View style={styles.containerThree}>
<View style={styles.bottomPart}>
<View>
<TouchableOpacity
onPress={() => {
signOut();
}}>
</StrictMode>
);
};
解决方案
我不确定您以哪种形式获取数据,但我创建了相同的场景,其中有三个按钮,每个按钮的 onClick 上一条消息被隐藏,下一条消息同时显示。如果这对您有用,我已经创建了与您要求的相同的切换功能。
export default function Toggle() {
const [toggleOne, settoggleOne] = useState(true);
const [toggleTwo, settoggleTwo] = useState(false);
const [toggleThree, settoggleThree] = useState(false);
const toggleOnefn = () => {
if(toggleOne == true){
settoggleOne(false)
settoggleTwo(true)
}else{
settoggleOne(true)
settoggleTwo(false)
settoggleThree(false)
}
}
const toggleTwofn = () => {
if(toggleTwo == true){
settoggleTwo(false)
settoggleThree(true)
}else{
settoggleTwo(true)
settoggleOne(false)
settoggleThree(false)
}
}
const toggleThreefn = () => {
if(toggleThree == true){
settoggleThree(false)
settoggleOne(true)
}else{
settoggleThree(true)
settoggleTwo(false)
settoggleOne(false)
}
}
return (
<div>
<button onClick={toggleOnefn}>One</button>
{
toggleOne == true ? <p>Data One</p> : ''
}
<br />
<button onClick={toggleTwofn}>One</button>
{
toggleTwo == true ? <p>Data One</p> : ''
}
<br />
<button onClick={toggleThreefn}>One</button>
{
toggleThree == true ? <p>Data One</p> : ''
}
<br />
</div>
);
}
推荐阅读
- windows - Win32_Product 响应中的奇怪差距
- r - 如果验证功能未验证,则默认返回
- python - Elasticsearch 按字段分组以获取第一次出现的值
- python - 是否可以从 Django 信号中的请求中访问非 db 密钥?
- mysql - 如何获得等于周、月和年/生命周期的今天的日期?
- jruby - 如何在 JRuby 中记录堆内存使用情况?
- excel - VBA下标超出范围和Excel的默认变量
- c++ - 已知插入顺序时填充 Eigen3 稀疏矩阵的策略
- vscode-remote - Remote SSH 在远程机器上安装了什么?
- php - 接受并记录收到的 HTML 电子邮件表单中的条件值