简述
可以使用一个函数作为React组件的状态。为了做到这一点,您必须在React.useState
中使用返回函数的函数:
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => () => console.log('default ooops')
);
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
的注意事项
React
中 useState
带类型的签名为:
function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>]
这显示,您有两种方法设置状态的初始值:
- 将初始值直接提供给状态(
React.useState(0)
- 初始值为 0
)
- 提供一个返回初始值的函数(
React.useState(() => 0)
- 初始值也是 0
)。
需要注意的是:如果在 React.useState
中提供了一个函数,则该函数将在 React.useState
执行时被执行,并将其返回值存储为初始状态。
如何实际存储函数
问题在于如果您想将一个函数作为状态存储,您不能像直接提供初始值那样提供它,因为这会导致该函数被执行并将其返回值存储为状态,而不是将函数本身存储为状态。因此,当您编写以下代码时:
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => console.log('default ooops')
);
当调用React.useState
并存储返回值(在本例中为undefined
)时,会立即记录'default ooops'
。
您可以通过提供返回要存储的函数的高阶函数来避免此问题:
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
中一样,更新状态的方式可以是使用值或返回值的函数。因此,为了更新状态,还必须使用上面的高阶函数。
prevState
。我还发现这篇文章很有帮助:https://medium.com/swlh/how-to-store-a-function-with-the-usestate-hook-in-react-8a88dd4eede1。 - Tyler Collier