2017-05-05 18 views
0

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

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; 
+0

其的结合问题,使用'箭头function':'this.props.options.map((选项)=> {.....'**一个建议:**不要将逻辑放入'constructor'中,也不要使用'setState',使用生命周期方法。将该逻辑放在'componentDidMount'方法或'componentWillMount'方法内:) –

+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> 
     } 
    } 
} 
+0

所以this.props.options.map((选项)=> {而不是this.props.options.map(函数(选项){0}绑定新的状态? –

+0

@DanielGustafsson它不会'绑定'状态',''绑定'context'意味着如果你不绑定,'this'关键字不会引用'react class component'并且'this.state'将会是undefined,你的代码也可以工作只需删除映射体内的'this'关键字,只需返回一个跨度就不会抛出错误 –

+0

@DanielGustafsson检查更新的答案,附上一个非常有用的链接,它将帮助您了解此关键字的作用。 –

相关问题