07组件中的state属性

以前没有组件化的时候重新渲染数据要写一个render函数,然后每次渲染都是执行这个函数,渲染新的模板。

组件化之后:state属性是一个对象,类似Vue中的data属性一样存值,当state中的数据改变就会重新渲染页面。

初始代码:

class Count extends React.Component {
    handleAddOne() {
        console.log("+1")
        console.log(this)
    }
    handleMinusOne() {
        console.log("-1")
    }
    handleReset() {
        console.log("重置")
    }
    render() {
        return (
            <div>
                <h1>Count: </h1>
                <button onClick={this.handleAddOne}>+</button>
                <button onClick={this.handleMinusOne}>-</button>
                <button onClick={this.handleReset}>重置</button>
            </div>
        )
    }
}
ReactDOM.render(<Count />, document.getElementById("app"));

在事件中的this指向有问题,因为经过babel编译后都是严格模式,this指向undefined。
在这里插入图片描述
使用constructor修正后:

class Count extends React.Component {
    constructor(props) {
        super(props);
        this.handleAddOne = this.handleAddOne.bind(this);
        this.handleMinusOne = this.handleMinusOne.bind(this);
        this.handleReset = this.handleReset.bind(this);
    }
    handleAddOne() {
        console.log("+1")
        console.log(this)
    }
    handleMinusOne() {
        console.log("-1")
    }
    handleReset() {
        console.log("重置")
    }
    render() {
        return (
            <div>
                <h1>Count: </h1>
                <button onClick={this.handleAddOne}>+</button>
                <button onClick={this.handleMinusOne}>-</button>
                <button onClick={this.handleReset}>重置</button>
            </div>
        )
    }
}
ReactDOM.render(<Count />, document.getElementById("app"));

在这里插入图片描述
指向Count实例。

state的首次使用:

class Count extends React.Component {
    constructor(props) {
        super(props);
        this.handleAddOne = this.handleAddOne.bind(this);
        this.handleMinusOne = this.handleMinusOne.bind(this);
        this.handleReset = this.handleReset.bind(this);
        this.state = {
            count:0
        }
    }
    handleAddOne() {
        console.log("+1")
        console.log(this)
    }
    handleMinusOne() {
        console.log("-1")
    }
    handleReset() {
        console.log("重置")
    }
    render() {
        return (
            <div>
                <h1>Count: {this.state.count}</h1>
                <button onClick={this.handleAddOne}>+</button>
                <button onClick={this.handleMinusOne}>-</button>
                <button onClick={this.handleReset}>重置</button>
            </div>
        )
    }
}
ReactDOM.render(<Count />, document.getElementById("app"));

在这里插入图片描述
改变state的值
在事件中可以使用this.setState方法修改state的内容。方法中写一个函数,函数中return对象。return中的对象只会改变对应的值,不会改变其他数据。

handleAddOne() {
        this.setState((prevState) => {
            return {
                count: prevState.count + 1
            }
        })
        console.log(this.state)
    }

默认事件参数prevState可以把上一个state的内容存入,修改即可。
在这里插入图片描述
其他用法:
以前可以在setState中直接传一个对象,但是不推介。
setState是一个异步,如果直接传对象容易出问题,数据还没回来就执行了下面的内容。如果用函数,数据还没有回来可以穿到默认的prevState中。

handleReset() {
        this.setState({
            count: 0
        })
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值