useState
是0.16.7
版本中提供的内置react挂钩之一。
useState
只能在功能组件内部使用。useState
这是我们需要内部状态并且不需要实现更复杂的逻辑(例如生命周期方法)的方式。
const [state, setState] = useState(initialState);
返回一个有状态值,以及一个更新它的函数。
在初始渲染期间,返回的状态(状态)与作为第一个参数(initialState)传递的值相同。
setState函数用于更新状态。它接受一个新的状态值并排队重新呈现组件。
请注意,useState
用于更新状态的挂钩回调的行为与组件不同this.setState
。为了显示差异,我准备了两个示例。
class UserInfoClass extends React.Component {
state = { firstName: 'John', lastName: 'Doe' };
render() {
return <div>
<p>userInfo: {JSON.stringify(this.state)}</p>
<button onClick={() => this.setState({
firstName: 'Jason'
})}>Update name to Jason</button>
</div>;
}
}
// Please note that new object is created when setUserInfo callback is used
function UserInfoFunction() {
const [userInfo, setUserInfo] = React.useState({
firstName: 'John', lastName: 'Doe',
});
return (
<div>
<p>userInfo: {JSON.stringify(userInfo)}</p>
<button onClick={() => setUserInfo({ firstName: 'Jason' })}>Update name to Jason</button>
</div>
);
}
ReactDOM.render(
<div>
<UserInfoClass />
<UserInfoFunction />
</div>
, document.querySelector('#app'));
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>
setUserInfo
使用回调时将创建新对象。请注意,我们丢失了lastName
键值。为了解决这个问题,我们可以在内部传递函数useState
。
setUserInfo(prevState => ({ ...prevState, firstName: 'Jason' })
参见示例:
// Please note that new object is created when setUserInfo callback is used
function UserInfoFunction() {
const [userInfo, setUserInfo] = React.useState({
firstName: 'John', lastName: 'Doe',
});
return (
<div>
<p>userInfo: {JSON.stringify(userInfo)}</p>
<button onClick={() => setUserInfo(prevState => ({
...prevState, firstName: 'Jason' }))}>
Update name to Jason
</button>
</div>
);
}
ReactDOM.render(
<UserInfoFunction />
, document.querySelector('#app'));
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>
<div id="app"></div>
与类组件中的setState方法不同,useState不会自动合并更新对象。您可以通过将函数更新程序形式与对象传播语法结合使用来复制此行为:
setState(prevState => {
// Object.assign would also work
return {...prevState, ...updatedValues};
});
有关更多信息,useState
请参见官方文档。
useState
实现。这是16.9版的定义。