使用state设置类if else使用react获取未定义错误的状态

时间:2017-05-05 12:06:24

标签: javascript reactjs state

我正在尝试根据发送给组件的专业人员动态设置一个类。不知怎的,我得到错误“无法读取未定义的属性'状态”。 我想当我尝试将状态类设置为类时,这不存在?在我在组件的渲染中使用它之前,我是否必须重新绑定它?

var ReactDOM = require('react-dom');
var React = require('react');

class Button extends React.Component {
    constructor(props) {
        super(props);
        console.log("BUTTON")
        console.log(props);

        this.state = {
            class: "small-button"
        };

        props.options.map(function (option) {
            if (option.Description > 10) {
                this.setState({
                    class: "big-button"
                });
            }
        });
        console.log("STATE: " + this.state.class);
    }

    render() {
        if (this.props.options) {
            return (<div> {
                this.props.options.map(function (option) {
                    return <div className={ this.state.class === 'big-button' ? 'option-button big-button' : 'option-button small-button'} key={option.Id}> {option.Description}</div>
                })
            }
            </div>
            )
        } else {
            return <div>No options defined</div>
        }
    }
}

module.exports = Button;

1 个答案:

答案 0 :(得分:1)

这是一个绑定问题,您需要bind函数在其中使用this关键字(正确的上下文)。

使用此:

render() {
        if (this.props.options) {
            return (<div> {
                this.props.options.map((option) => {
                    return <div className={ this.state.class === 'big-button' ? 'option-button big-button' : 'option-button small-button'} key={option.Id}> {option.Description}</div>
                })
            }
            </div> )
        } else {
            return <div>No options defined</div>
        }
    }

查看此答案以获取有关arrow function and this keyword

的更多详细信息

一个建议:不要将逻辑放在constructor内,也不要setState,请使用生命周期方法。将该逻辑放在componentDidMount方法或componentWillMount方法中。

像这样:

class Button extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            class: "small-button"
        };
    }

    componentDidMount(){
        this.props.options.forEach((option) => {
            if (option.Description > 10) {
                this.setState({
                    class: "big-button"
                });
            }
        });
    }

    render() {
        if (this.props.options) {
            return (
                <div> 
                {
                    this.props.options.map((option) => {
                        return <div className={ this.state.class === 'big-button' ? 'option-button big-button' : 'option-button small-button'} key={option.Id}> {option.Description}</div>
                    })
                }
                </div>
            )
        }else{
            return <div>No options defined</div>
        }
    }
}