React 类组件 State
ZGuangJu 4/3/2019 reactClass-State
# 类组件里的 State
- 如果数据需要修改,并且需要⻚页⾯同时响应改变,那就需要把变量 放在
state
⾥⾯,同时使⽤setState
修改 初始化状态state
; - 组件自己的数据 类组件里的
State
状态(只有class
组件有state
,函数组件需要用useSata
这个Hooks
来调用).
- 初始化状态
this.state = { count: 0 };
- 更新状态 更新状态使⽤setState,不能直接this.state.count=xxx
this.setState({ count: this.state.count + 1 });
// 定义类组件
class my extends Component{
constructor(){
// constructor构造函数不是必须写的,但是写了constructor函数,构造函数里必须用super,新版reactreact不用传props,框架内部已经传好了,直接使用就行。
super()
this.state={feeling:'不好'} // 定义初始化状态
}
// render负责渲染 想渲染什么通过render里面的 return 写jsx
render(){
return <>
<div>我今天心情{{this.state.feeling}}</div>
</>
}
}
render(<my/>,document.getElementById('rood'))
// <my></my> 可以单标签也可以双标签,
// 如果同时渲染两个组件,也要用一个标签包裹起来<><my/><you/></>
# 组件里使用事件
# 第一种写法
- (bind是最老的写法)
class My extends Component {
constructor() {
super()
this.state = { feeling: '不好' }
}
handleClick() { //定义的事件
alert(1)
}
render() {
return <>
<div>我今天心情{this.state.feeling}</div>
<button onClick={this.handleClick.bind(this)}>点击改变心情</button>
// 用bind防止丢失this
</>
}
}
render(<My></My>, document.getElementById('rood'))
# 第二种写法(通过es7解决this问题)
- 最方便,最优雅的写法(推荐使用)
class my extends Component {
constructor() {
super()
this.state = { feeling: '不好' }
}
handleClick = () => { //定义的事件(箭头函数将this指向上一级)
alert(1)
}
render() {
return <>
<div>我今天心情{this.state.feeling}</div>
<button onClick={this.handleClick}>点击改变心情</button>
</>
}
}
render(<my></my>, document.getElementById('rood'))
或者
import React from 'react';
import { render } from 'react-dom';
class Counter extends React.Component {
constructor() {
super()
this.state = { number: 1 }
}
add() {
// 事件
alert(1)
}
render() {
return <>
<div>{this.state.number}</div>
<button onClick={() => this.add()}>点击加1</button>
</>
}
}
render(<Counter></Counter>, window.root)
# 第三种写法(事件定义在构造函数里)
- 性能最好的写法
class My extends Component {
constructor() {
super()
this.state = { feeling: '不好' }
this.handleClick = function () { //定义的事件(在构造函数里赋值一次,构造函数this指向当前实例不会丢失)
alert(1)
}
}
render() {
return <>
<div>我今天心情{this.state.feeling}</div>
<button onClick={this.handleClick}>点击改变心情</button>
</>
}
}
render(<My></My>, document.getElementById('rood'))
# 修改state
- 改变
state
状态(setState({})
方法)
class Sul1 extends React.Component {
constructor(props) {
super(props);
this.state = { time: new Date().toLocaleString() }
}
//组件已经挂载
componentDidMount() {
setInterval(() => {
this.setState({
time: new Date().toLocaleString()
})
}, 1000);
}
render() {
return <div>
类组件显示 当前时间是{this.state.time}
</div>
}
}
例:
class My extends Component {
constructor() {
super()
this.state = { feeling: '不好' }
}
handleClick = () => { //箭头函数的方法
// react 类组件的 state 状态修改必须通过this.setState({})方法
this.setState({ feeling: '非常好' })
}
render() {
return <>
<div>我今天心情{this.state.feeling}</div>
<button onClick={this.handleClick}>做了XX事心情变{this.state.feeling}了</button>
</>
}
}
render(<My></My>, document.getElementById('rood'))
# State 异步语法
当执行以下代码时,并不能从1
增加到3
也就是两个函数,只执行了一个。
import React from 'react';
import { render } from 'react-dom';
class Counter extends React.Component {
constructor() {
super()
this.state = { number: 1 }
}
add() {
// 事件
// this.setState是异步的,
this.setState({ number: this.state.number + 1 })
this.setState({ number: this.state.number + 1 })
// this.forceUpdate() //不管数据有没有改变,都强制更新
console.log(this.state);
}
render() {
return <>
<div>{this.state.number}</div>
<button onClick={() => this.add()}>点击加1</button>
</>
}
}
render(<Counter></Counter>, window.root)
用上面的方法,因为setState()
方法时异步执行的,so 当第二个setState()
执行时,原值还是1
,并没有增加到2
。所以增加的值是2.
但是通过prevState
参数,加1
后,就可以从1
加到3
两个方法都执行了,所以是加到了3
.
setState
是异步的,底层设计同⼀个⽣命周期会批量操作更新 state
. setState
第⼆个参数是⼀个可选参数,传⼊⼀个回调函数可以获取到最新的state
,当修改的state
依赖上⼀次修改的state
的值时,可使⽤以下这种⽅法修改.
this.setState((prevState, prevProps)=>({
//prevState:上⼀次修改的状态state //prevProps:上⼀次修改的属性props count: prevState.count + 1
}), () => {
//这⾥可以获取到最新的state console.log(this.state.count);
});
import React from 'react';
import { render } from 'react-dom';
class Counter extends React.Component {
constructor() {
super()
this.state = { number: 1 }
}
add() {
// 事件
this.setState((prevState) => ({
number: prevState.number + 1
}), () => {
// 第二个回调函数能拿到state最新的值
console.log(this.state);
})
this.setState((prevState) => ({
number: prevState.number + 1
}))
// prevState表示的是上一次的状态
}
render() {
return <>
<div>{this.state.number}</div>
<button onClick={() => this.add()}>点击加1</button>
</>
}
}
render(<Counter></Counter>, window.root)
forceUpdate()
:强制更新状态(如果没有特殊情况,不建议使用)
this.state.number +=1
this.forceUpdate() //不管数据有没有改变 都进行强制更新
console.log(this.state)