#reactjs #typescript
Вопрос:
Я немного запутался в том, как обновить состояние между родительским и дочерним компонентами. Я знаю, что состояние должно быть поднято, поэтому я добавил его в родительский компонент. Поэтому я хочу обновить логическое значение в дочернем компоненте(можно ли это сделать?). Я попробовал, как показано ниже, но получил ошибку: Cannot invoke an object which is possibly 'undefined'. This expression is not callable.Type 'Boolean' has no call signatures.
Пример Стакблица: https://stackblitz.com/edit/react-ts-hzssfh?file=Child.tsx
Родитель
import React from 'react';
import Child from '../components/Child';
const Parent: React.FunctionComponent = () => {
const [visible, setVisible] = React.useState<boolean>(false);
const toggle = () => {
setVisible(!visible);
};
return (
<button onClick={toggle}>toggle</button>
<Child visible={visible} />
)
};
export default Parent;
Ребенок
import React from 'react';
interface Icomments {
visible?: boolean;
}
const Child: React.FunctionComponent<Icomments> = (props: Icomments) => {
const handleClick = () => {
props.visible(false);
};
return (
<button onClick={handleClick}>Hide</button>
)
}
export default Child;
Комментарии:
1. Отображается логическое значение. Вы хотели передать
setVisible
это ребенку?2. Да, это правильно
Ответ №1:
Ребенку нужна функция, которая задает состояние, а не значение состояния. Поэтому вам нужно передать Ребенку setVisible
функцию опоры.
<Child setVisible={setVisible} />
const Child = ({ setVisible }) => (
<button onClick={() => { setVisible(false); }}>Hide</button>
);
Комментарии:
1. Похоже, вы все еще путаете штат и сеттера штата — убедитесь, что вы передаете и ссылаетесь только на сеттера штата (the
setVisible
), а не на штат, который вас не волнует.2. Я не думаю, что вы правильно скопировали код из моего ответа — он не выдает ошибку, которую вы описываете.
3. Да, я знаю — и правильная передача установщика состояния и вызов его с
false
помощью не приводит к ошибке. Ошибка может возникнуть только в том случае, если вы все еще путаете состояние и задатчик состояния, например, если вы делаете<Child setVisible={visible} />
вместо этого. (передайте сеттеру штата, а не государству)4. Да, ваш интерфейс также должен совпадать — опять же, вам нужно передать только задатчик состояния , а не состояние, и ссылаться на этот задатчик состояния (the
Dispatch<SetStateAction<boolean>>
) везде, где он используется — не состояние, логическое значение, которое вас не волнует.5. Вы все еще говорите TypeScript, что передаете логическое значение, а не задатчик состояния:
setVisible?: boolean;
передайте и везде указывайте задатчик состояния вместо состояния. Задатчиком состояния может быть либо(newVisible: boolean) => void
илиDispatch<SetStateAction<boolean>>