2016-09-15 41 views
1

因此,我開始將我的應用程序從ES2015轉換爲使用React的ES6。Uncaught TypeError:無法讀取未定義的屬性「狀態或道具」

我有一個父類和子類,像這樣,

export default class Parent extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      code: '' 
     }; 
    } 

    setCodeChange(newCode) { 
     this.setState({code: newCode}); 
    } 


    login() { 
     if (this.state.code == "") { 
      // Some functionality 
     } 
    } 

    render() { 
     return (
      <div> 
       <Child onCodeChange={this.setCodeChange} onLogin={this.login} /> 
      </div> 
     ); 
    } 
} 

兒童類,

export default class Child extends Component { 
    constructor(props) { 
     super(props); 
    } 

    handleCodeChange(e) { 
     this.props.onCodeChange(e.target.value); 
    } 

    login() { 
     this.props.onLogin(); 
    } 

    render() { 
     return (
      <div> 
       <input name="code" onChange={this.handleCodeChange.bind(this)}/> 
      </div> 
      <button id="login" onClick={this.login.bind(this)}> 
     ); 
    } 
} 

Child.propTypes = { 
    onCodeChange: React.PropTypes.func, 
    onLogin: React.PropTypes.func 
}; 

然而,這將導致以下錯誤,

this.state是未定義

它指的是,

if (this.state.code == "") { 
    // Some functionality 
} 

任何想法可能導致這種情況?

+1

的可能的複製[無法訪問做出反應的實例(本)事件處理中(HTTP://計算器。 com/questions/29577977 /無法訪問反應實例這裏面事件處理程序) – ivarni

+0

你綁定你的孩子的'登錄'功能,但不是你的父母的。 – ivarni

回答

3

您可以使用箭頭功能綁定您的功能。你需要在子組件和父組件中綁定你的函數。

家長:

export default class Parent extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      code: '' 
     }; 
    } 

    setCodeChange = (newCode) => { 
     this.setState({code: newCode}); 
    } 


    login =() => { 
     if (this.state.code == "") { 
      // Some functionality 
     } 
    } 

    render() { 
     return (
      <div> 
       <Child onCodeChange={this.setCodeChange} onLogin={this.login} /> 
      </div> 
     ); 
    } 
} 

兒童

export default class Child extends Component { 
    constructor(props) { 
     super(props); 
    } 

    handleCodeChange = (e) => { 
     this.props.onCodeChange(e.target.value); 
    } 

    login =() => { 
     this.props.onLogin(); 
    } 

    render() { 
     return (
      <div> 
       <input name="code" onChange={this.handleCodeChange}/> 
      </div> 
      <button id="login" onClick={this.login}> 
     ); 
    } 
} 

Child.propTypes = { 
    onCodeChange: React.PropTypes.func, 
    onLogin: React.PropTypes.func 
}; 

有綁定的功能,以及如您使用的是另外一個方法,但你需要做的是對父母組件也如<Child onCodeChange={this.setCodeChange.bind(this)} onLogin={this.login.bind(this)} />

或者您可以指定第Ë構造函數

家長:

constructor(props) { 
    super(props); 
    this.state = { 
     code: '' 
    }; 
this.setCodeChange = this.setCodeChange.bind(this); 
this.login = this.login.bind(this); 
} 

兒童

constructor(props) { 
    super(props); 
    this.handleCodeChange = this.handleCodeChange.bind(this); 
    this.login = this.login.bind(this); 
} 
+1

我已經評論過一個解釋綁定函數的複製鏈接,爲什麼添加另一個基本上說完全一樣的答案? – ivarni

+0

@ivarni我之前沒有看到您的評論。我讀了這個問題,我回答了。 –

+0

@ivarni是的,你可能是正確的這是一個重複,但綁定我已經嘗試對父母和孩子沒有工作。因此,爲什麼我提出看看是否有更好的方法。正如我認爲箭頭功能工作的一種享受。 – nixgadgets

相關問題