ecz*_*czn 47 default-value typescript reactjs react-hooks
是否可以使用 afunction作为我的 React 组件的状态?
示例代码在这里:
// typescript
type OoopsFunction = () => void;
export function App() {
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => console.log('default ooops')
);
return (
<div>
<div onClick={ ooops }>
Show Ooops
</div>
<div onClick={() => {
setOoops(() => console.log('other ooops'))
}}>
change oops
</div>
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用......defaultOoops将在最开始时调用,当单击时change oops,otrher ooops将立即记录到控制台,Show Ooops再次单击后不会记录。
为什么 ?
我可以使用函数作为组件的状态吗?
或者 React 有其特殊的处理方式the function state?
Tho*_*lle 74
可以使用钩子将函数设置为状态,但是由于可以使用返回初始状态或更新状态的函数来初始化和更新状态,因此您需要提供一个函数,该函数又返回您想要放入的函数状态。
const { useState } = React;
function App() {
const [ooops, setOoops] = useState(() => () => console.log("default ooops"));
return (
<div>
<button onClick={ooops}>Show Ooops</button>
<button
onClick={() => {
setOoops(() => () => console.log("other ooops"));
}}
>
change oops
</button>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>Run Code Online (Sandbox Code Playgroud)
Pet*_*rdt 16
是的,可以使用函数作为 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
);
Run Code Online (Sandbox Code Playgroud)
要更新您的函数,您还必须使用返回函数的函数:
setOoops(() => () => console.log("other ooops"));
// or
const otherFunction = () => console.log("other ooops");
setOoops(() => otherFunction);
Run Code Online (Sandbox Code Playgroud)
React.useStateuseState在带有类型的 React 中的签名是
function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
Run Code Online (Sandbox Code Playgroud)
它表明,有两种方法可以在您的状态中设置初始值:
React.useState(0)- 初始值0),React.useState(() => 0)- 初始值也0)。需要注意的重要事项:如果你在 中提供了一个函数React.useState,那么这个函数就会被执行,whenReact.useState被执行并且返回值被存储为初始状态。
这里的问题是,如果您想将函数存储为状态,则不能按原样提供它作为初始状态,因为这会导致函数被执行并且其返回值存储为状态而不是函数本身。因此当你写
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => console.log('default ooops')
);
Run Code Online (Sandbox Code Playgroud)
'default ooops'被React.useState调用时立即记录并undefined存储返回值(在本例中)。
这可以通过提供一个高阶函数返回您要存储的函数来避免:
const [ooops, setOoops] = React.useState<OoopsFunction>(
() => () => console.log('default ooops')
);
Run Code Online (Sandbox Code Playgroud)
这样外部函数在第一次运行时肯定会被执行,React.useState并且它的返回值将被存储。由于此返回值现在是您需要的函数,因此将存储此函数。
状态设置器函数的(此处setOoops)签名为
Dispatch<SetStateAction<S>>
Run Code Online (Sandbox Code Playgroud)
和
type Dispatch<A> = (value: A) => void;
type SetStateAction<S> = S | ((prevState: S) => S);
Run Code Online (Sandbox Code Playgroud)
就像在React.useState里面一样,也有可能用一个值或一个返回值的函数来更新状态。因此,为了更新状态,还必须使用上面的高阶函数。
| 归档时间: |
|
| 查看次数: |
20327 次 |
| 最近记录: |