#reactjs #react-hooks #antd
Вопрос:
Итак, у меня есть это Custom Collapse
, и каждый раз, когда я переключаю 1 панель, все 4 из них открываются одновременно.
Вот как я меняю состояние между parent component
и child component
:
//Parent Component
const [show, setShow] = useState(false)
const handleShow = (idx) => {
setFollowed(prev => !prev)
}
<AntCollapse isFollowed={followed[1]} show={show} keys="1" setShow={setShow} header="Follow XXX on Telegram">
//some code
<Row type='flex' align='middle' justify='center'>
<Button onClick={() => {handleFollow(1); handleShow(); }} style={buttonStyle2} disabled={clicked}>Continue</Button>
<Button type='text' style={{color:'#EB7B59', border:'#f7f7f7', background:'#f7f7f7',height: "2em", fontSize:'16px', margin:'10px 0 0 10px'}}>Cancel</Button>
</Row>
</AntCollapse>
//-------------------------------------------------------------------
//Child Component
const [key, setKey] = useState([props.keys]);
const handlePanelClose = () => props.setShow(prev => !prev);
<StyledCollapse accordian activeKey={props.show ? key : []} onChange={combineFunc}>
<AntCollapse.Panel
{...props}
header={props.header}
showArrow={false}
bordered={false}
key={props.keys}
extra={
//some code
}
>
{props.children}
</AntCollapse.Panel>
</StyledCollapse>
Как мне установить состояние для каждой панели по отдельности?
Ответ №1:
setShow
это единственный флаг, который вы держите, чтобы решить, сворачивать панель или нет.
Если у вас несколько панелей, и вы хотите, чтобы каждая панель имела индивидуальный элемент управления, вы должны содержать объект флагов { panel1 : true, panel2: false ...}
или список флагов [true, false, true ..]
в зависимости от вашей реализации.
Вы можете отображать эти панели, например, в цикле, таким образом, чтобы у каждой из них был уникальный идентификатор, который каждый дочерний компонент получит от родительского компонента.
Таким образом, при вызове handleShow
из дочернего компонента вы можете вызвать его с идентификатором, handleShow(key)
и родительский компонент будет знать, какую из панелей свернуть.
Родительский —
const [show, setShow] = useState({})
const handleShow = (panelId) => {
setShowArray({...show, panelId: !show[panelId})
}
Комментарии:
1. Итак, я добавил объект флагов в свои родительские компоненты, которые
{1: false, 2: false ...}
затем я передалshow[1]
(возьмите первую панель в качестве примера) в пользовательский collapse. Почему панель не расширяется, даже если для параметраprops.show
установлено значение true, аkey
массив не пуст. Вот ссылка на мой последний код: здесь2. Возможно, добавьте свой код в какой-нибудь онлайн-редактор, где я мог бы запустить код. В любом случае, у этой функции есть 2 проблемы — « const handleShowPanel = (id) => { const val = !props.show props.setShow({[id] : val}) } « props.show является объектом, поэтому назначение val= !props.show всегда будетзначение false (поскольку props.show существует, оно всегда возвращает true), поэтому вы должны получить значение из!props.show[id] Кроме того, при настройке нового объекта show вы хотели бы сохранить предыдущее состояние и обновить определенное, поэтому используйте оператор распространения — props.setShow({…props.show, id: val})