TL;DR
Да, можно использовать функцию в качестве состояния компонента React. Для этого вы должны использовать функцию, возвращающую вашу функцию в React.useState
:
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => () => console.log('default ooops')
);
// or
const yourFunction = () => console.log('default ooops');
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => yourFunction
);
Чтобы обновить функцию, вы также должны использовать функцию, возвращающую вашу функцию:
setOoops(() => () => console.log("other ooops"));
// or
const otherFunction = () => console.log("other ooops");
setOoops(() => otherFunction);
Подробный ответ
Примечания о React.useState
Подпись useState
в React с типами:
function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
Он показывает, что есть два способа установить начальное значение в вашем состоянии:
- Укажите начальное значение как есть (
React.useState(0)
- начальное значение 0
),
- Предоставьте функцию, которая возвращает начальное значение, которое нужно установить (
React.useState(() => 0)
- начальное значение также 0
).
Важное примечание: если вы предоставляете функцию в React.useState
, то эта функция выполняется, когда выполняется React.useState
, а возвращаемое значение сохраняется как начальное состояние.
Как на самом деле хранить функции
Проблема здесь в том, что если вы хотите сохранить функцию как состояние, вы не можете предоставить ее как начальное состояние, поскольку это приводит к тому, что выполняемая функция и ее возвращаемое значение сохраняется как состояние, а не сама функция strong >. Поэтому, когда вы пишете
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => console.log('default ooops')
);
'default ooops'
регистрируется немедленно, когда вызывается React.useState
, и сохраняется возвращаемое значение (в данном случае undefined
).
Этого можно избежать, предоставив функцию более высокого порядка, возвращающую вашу функцию, которую вы хотите сохранить:
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => () => console.log('default ooops')
);
Таким образом, внешняя функция будет определенно выполняться при первом запуске React.useState
и ее возвращаемое значение будет сохранено. Поскольку это возвращаемое значение теперь является вашей обязательной функцией, эта функция будет сохранена.
Примечания о функции установки состояния
Сигнатура функции установки состояния (здесь setOoops
) задается как
Dispatch<SetStateAction<S>>
с участием
type Dispatch<A> = (value: A) => void;
type SetStateAction<S> = S | ((prevState: S) => S);
Как и в React.useState
, есть также возможность обновить состояние с помощью значения или функции, возвращающей значение. Таким образом, для обновления состояния также должна использоваться функция более высокого порядка, указанная выше.
person
Peter Lehnhardt
schedule
10.04.2019