state 的用法
约 625 字
state 的用法
基本用法
// 1. 创建组件
class Weather extends React.Component {
constructor(props) {
super(props)
// 初始化状态
this.state = {
isHot: true
}
}
render() {
// 读取状态
const {isHot} = this.state
return <h1>今天天气很{isHot ? '炎热' : '凉爽'}</h1>
}
}
// 2. 渲染组件到页面
ReactDOM.render(<Weather/>, document.getElementById('test'))
简写形式
// 1. 创建组件
class Weather extends React.Component {
// 初始化状态
state = {isHot: false, wind: '微风'}
render() {
const {isHot} = this.state
return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'}, {wind}</h1>
}
// 自定义方法——要用赋值语句形式+箭头函数
changeWeather = () => {
const isHot = this.state.isHot
this.setState({isHot: !isHot})
}
}
// 2. 渲染组件到页面
ReactDOM.render(<Weather/>, document.getElementById('test'))
setState 用法
// 1. 创建组件
class Weather extends React.Component {
constructor(props) {
// 构造器调用了1次
super(props)
// 初始化状态
this.state = {
isHot: true,
wind: '微风'
}
// 解决changeWeather中this指向问题
this.changeWeather = this.changeWeather.bind(this)
}
// render调用1+n次,1是初始化的那次,n是状态更新的次数
render() {
// 读取状态
const {isHot} = this.state
return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'}, {wind}</h1>
}
// changeWeather点击了几次调用几次
changeWeather() {
// changeWeather位于Weather的原型对象上,供实例使用
// 由于changeWeather是作为onClick的回调,所以不是通过实例调用,是直接调用
// 类中的方法默认开启了局部的严格模式,所以changeWeather中的this=undefined
// 获取原来的isHot值
const isHot = this.state.isHot
// 状态(state)不可直接修改: this.state.isHot = !isHot
// 状态(state)必须通过setState进行更新,且更新是一种合并,不是替换
this.setState({isHot: !isHot})
}
}
// 2. 渲染组件到页面
ReactDOM.render(<Weather/>, document.getElementById('test'))
使用 setState 更新状态
对象式写法
setState(stateChange, [callback])
stateChange 表示状态改变对象(该对象可以体现出状态的更改)
callback 是可选的回调函数,它在状态更新完毕、界面也更新后(render调用后)才被调用
add = ()=>{
const {count} = this.state;
this.setState({count: count + 1}, ()=>{
console.log(this.state.count);
});
}
函数式写法
setState(updater, [callback])
updater 为返回 stateChange 对象的函数,该函数的第一个参数为原本的 state,第二个参数为 props
callback 是可选的回调函数,它在状态更新、界面也更新后(render调用后)才被调用
add = ()=>{
this.setState(state => ({count: state.count + 1}), ()=>{
console.log(this.state.count);
});
}
使用原则
- 如果新状态不依赖于原状态——使用对象式
- 如果新状态依赖于原状态——使用函数式
- 如果需要在setState()执行后获取最新的状态数据,要在第二个callback函数中读取