【发布时间】:2021-08-25 15:28:16
【问题描述】:
所以场景是,一旦我单击 V 形按钮,放置在 V 形按钮正下方的手风琴组件就会打开并显示其子组件。
但是,我不希望其他 V 形按钮共享相同的状态,以便只有单击的带有相关手风琴的 V 形按钮会展开。
默认情况下,一旦模板组件刚刚挂载,手风琴展开显示其带有 V 形按钮的子元素已启动 ^
代码:
// useChevron hook
import { useState } from 'react';
const useChevron = () => {
const [isChevronUp, setIsChevronUp] = useState<Partial<any>>({});
const handleChevron = (id: string) => {
setIsChevronUp((previousState) => ({
...previousState,
[id]: !previousState[id],
}));
};
return { isChevronUp, setIsChevronUp, handleChevron };
};
export default useChevron;
// template
...
const { handleChevron, isChevronUp } = useChevron();
...
<div id="containerOne">
// when it has just been rendered isChevronUp is empty object so in case set isOpen as true which makes chevron looks like ^ and shows accordion's children
<ChevronButton
isOpen={_.isEmpty(isChevronUp) ? true : !!isChevronUp.containerOne}
id='containerOne'
onClick={() => handleChevron('containerOne')}
/>
</div>
<Accordion isOpen={_.isEmpty(isChevronUp) ? true : !!isChevronUp.containerOne}>
<ChildrenComponent1 />
<ChildrenComponent2 />
...
除了我必须在第一次单击两次 V 形按钮然后按预期正常切换之外,它似乎工作正常。
我在下面尝试过:
const [isChevronUp, setIsChevronUp] = useState<Partial<SomeType>>({
'default': true
});
...
<ChevronButton
isOpen={Object.keys(isChevronUp).length === 1 ? isChevronUp.default : !!isChevronUp.containerOne}
id='containerOne'
onClick={() => handleChevron('containerOne')}
/>
</div>
<Accordion isOpen={Object.keys(isChevronUp).length === 1 ? isChevronUp.default : !!isChevronUp.containerOne}>
但同样需要点击两次 V 形按钮。
在这种情况下设置默认人字形和手风琴展开并解决双击问题的最佳方法是什么?
提前致谢。
【问题讨论】:
-
尝试将条件更改为
Object.keys(isChevronUp).length > 0 ? !!isChevronUp.containerOne : isChevronUp.default或Object.keys(isChevronUp).length > 0 ? !!isChevronUp.containerOne : true -
只有一个手风琴还是动态的?
-
@Shyam 有多个手风琴必须是动态的
-
@footlessbird 那么手风琴的初始打开状态应该是什么?应该是真的还是假的?
-
@footlessbird 您还可以为 chevrons 钩子添加一个 初始化函数,您将在其中创建一个字段,其键等于 chevron id,默认值等于 true .然后你可以在没有条件的情况下获得人字形值
标签: reactjs typescript lodash