Поскольку этот вызов useState
фактически вызывается в функции компонента приложения:
const [isOpen,setIsOpen] = useState(true);
Таким образом, он становится частью состояния App
, а не состояния обернутого компонента.
Компонент перерисовывается, потому что каждый раз, когда приложение перерисовывается, функция WrappedComponent
создается заново. Это другая функция с другим адресом в памяти, и поэтому дерево компонентов перерисовывается с нуля.
Это действительно странный шаблон, который вы используете. Вы действительно усложняете вещи. Почему бы просто не передать функцию рендеринга компоненту-оболочке?
const TogglableComponent = ({ renderWrappedComponent, isOpen, onClick }) => {
return (
<Collapse isOpen={isOpen} >
<button onClick={onClick} />
{ renderWrappedComponent() }
</Collapse>
)
};
Затем вы управляете состоянием переключения каждого компонента из его родительского элемента через подпорки. Или, если вам не нужно передавать состояние переключения родительскому компоненту, просто сохраните его в оболочке:
const TogglableComponent = ({ renderWrappedComponent }) => {
const [isOpen, setIsOpen] = React.useState(false);
return (
<Collapse isOpen={isOpen} >
<button onClick={() => setIsOpen(!isOpen)} />
{ renderWrappedComponent() }
</Collapse>
)
};