在现有状态转换期间(例如在`render`中)无法更新

时间:2018-11-19 01:25:24

标签: javascript reactjs material-ui

我知道这个问题已经被问过多次了, 但我仍然不知道如何解决我的代码。似乎我不应该这样调用setState。但是我从material-ui网站上获取了示例代码,这应该很简单吗?

class Dashboard extends React.Component {

    constructor(props){
        super(props);
        this.state = {
            activeStep: 0,
        }
        this.handleStep = this.handleStep.bind(this);
    }

    handleStep(step) {
        this.setState({activeStep: step});
    };

    render(){
        const { classes, match } = this.props;
        const sprints = ['sprint 1', 'sprint 2', 'sprint 3'];
        const { activeStep } = this.state;

        return (
            <div className= {classes.root}>
                <div className = {classes.container} > 
                    <Stepper nonLinear activeStep={activeStep} alternativeLabel>
                        {sprints.map((label,index)=>
                            {
                                return (
                                    <Step key={label}>
                                        <StepButton
                                            onClick= {this.handleStep(index)}
                                        >
                                            {label}
                                        </StepButton>
                                    </Step>   
                                )
                            })
                        }
                    </Stepper>
                </div>
            </div>
        )
    }
}

2 个答案:

答案 0 :(得分:2)

首先,如果没有index参数,则使用bind的方式就可以了。像这样:

this.handleStep = this.handleStep.bind(this);
onClick= {this.handleStep}

第二,如果在onClick方法中有参数,则需要匿名函数来传递数据。匿名函数是()=>。

因此,使用箭头功能,您无需在构造函数内部进行绑定。并且有很多选择:

//1
onClick={() => this.handleClick(index)}
//2
onClick={this.handleClick.bind(this, index)}

答案 1 :(得分:1)

onClick中的StepButton应该是onClick={() => this.handleStep(index)}。注意箭头功能。这传递了一个回调函数,该函数将在触发onClick时运行,而您的代码在this.handleStep期间调用render。否则,您处理状态更新的方式就很好。