在这篇文章中,我们简单实践一下 react hooks,这个新特性从 React 16.8 中引入。
如下的代码实现了,一个文本框,让用户输入一个字符串并且输入回车后,存如了 SessionStorage
import React, { Component } from 'react';
import PropTypes from "prop-types"
export default class TokenForm extends React.Component {
static propTypes = {
setToken: PropTypes.func.isRequired
};
constructor(props) {
super(props);
this.state = { value: '' }
}
handleSubmit = event => {
event.preventDefault();
const { setToken } = this.props;
const token = this.state.value;
if (token) {
setToken(token);
}
}
handleChange = (event) => {
this.setState({ value: event.target.value });
}
render() {
return (
<form onSubmit={this.handleSubmit} onChange={this.handleChange}>
<input type="text" value={this.state.value}></input>
</form>
)
}
}
以下的代码,仅仅显示用户输入的字符串,并在适当的时候保存用户输入的字符串:
import React, { Component } from 'react';
import './App.css';
import TokenForm from './TokenForm'
export default class App extends Component {
state = {
token: null
};
componentDidMount() {
this.setState({ token: sessionStorage.getItem("token") });
}
setToken = token => {
sessionStorage.setItem("token", token);
this.setState({ token });
}
render() {
const { token } = this.state;
return (
<div>
<h1>Starrry Eyed</h1>
{token ? token : <TokenForm setToken={this.setToken} />}
</div>
)
}
};
我们可以使用 React Hook 来重构上面的 App 类,首先引入了 useState
, useState
会返回一个状态,以及一个更改状态的函数,另外我们使用useEffect
来定义setToken
发生时的动作,此时把字符串保存到 SessionStorage
import React, { useState, useEffect } from 'react';
import './App.css';
import TokenForm from './TokenForm'
export default function App() {
const [token, setToken] = useState(sessionStorage.getItem("token"));
useEffect(()=> {
sessionStorage.setItem("token", token);
})
return (
<div>
<h1>Starrry Eyed</h1>
{token ? token : <TokenForm setToken={setToken} />}
</div>
)
}
effect 函数,在每次 Render 运行结束后运行
代码: https://github.com/ZhuBicen/my-app-react-hook
More about effect: https://reactjs.org/docs/hooks-effect.html