2017-06-20 3 views
0

Ich habe angefangen zu lernen zu lernen reagieren und habe in ein Problem geraten, das ich nicht scheinen kann, herauszufinden. Wenn man durch ein Tutorial einen einfachen Kommentar machen Web-App Bearbeitung und ich erhalte diese Störung, wenn ich versuche, um einen Kommentar zu aktualisieren „Typeerror: _this3 ist nicht definiert“, speziell auf diesen Linien:React.js TypeError this.props ist undefined

this.props.updateCommentText(this.refs.newText.value, this.props.index); 

und diese ein:

Hier
updateCommentText={()=>this.updateComment} 

ist die volle JavaScript-Code:

class Comment extends React.Component{ 

    constructor(){ 
    super(); 
    this.state = { 
     editing: false, 
    }; 

    this.edit = this.edit.bind(this); 
    this.save = this.save.bind(this); 
    } 

    edit(){ 
    this.setState({ 
     editing: true, 
    }); 
    } 

    save(){ 
    this.props.updateCommentText(this.refs.newText.value, this.props.index); 
    this.setState({ 
     editing: false, 
    }); 
    } 
    remove(){ 
    console.log('Removing comment'); 
    this.props.deleteFromBoard(this.props.index) 
    } 

    renderNormal(){ 
    return (
     <div className="commentContainer"> 
      <div className="commentText">{this.props.children}</div> 
      <button onClick={this.edit} className="button-primary">Edit</button> 
      <button onClick={this.remove} className="button-danger">Remove</button> 
     </div> 

    ); 
    } 

    renderForm(){ 
    return (
     <div className="commentContainer"> 
      <textarea ref="newText" defaultValue={this.props.children}></textarea> 
      <button onClick={this.save} className="button-success">Save</button> 
     </div> 

    ); 
    } 

    render(){ 
    if(this.state.editing){ 

     return this.renderForm(); 

    } else { 

     return this.renderNormal(); 

    } 
    } 
} 

class Board extends React.Component{ 

    constructor(){ 
    super(); 
    this.state = { 
     comments: [ 
     "Hiya", 
     "Awk well", 
     "Boo-urns" 
     ], 
    } 
    } 

    removeComment(i){ 
    console.log("Removing comment: " + i); 
    var arr = this.state.comments; 
    arr.splice(i, 1); 
    this.setState({ 
     comments: arr 
    }); 
    } 

    updateComment(newText, i){ 
    console.log("Updating comment: " + i); 
    var arr = this.state.comments; 
    arr[i] = newText; 
    this.setState({ 
     comments: arr, 
    }); 

    } 

    eachComment(text, i){ 
    return (
     <Comment key={i} index={i} 
     updateCommentText={()=>this.updateComment} 
     deleteFromBoard={()=>this.removeComment}> 

     {text} 

     </Comment> 
    ); 
    } 

    render(){ 
    return (
     <div className="board"> 
      { 
      this.state.comments.map(this.eachComment) 
      } 
     </div> 

    ); 
    } 
} 



// ======================================== 

ReactDOM.render(
    <Board />, 
    document.getElementById('container') 
); 

ich etwas gehe davon hat den Gültigkeitsbereich ging, aber ich bin nicht sicher, wo.

+0

Mögliche Duplikat [Typeerror: kann Eigenschaft lesen undefinierter beim Binden onClick] (https://stackoverflow.com/questions/43568344/typeerror-cannot-read-property-function-name-of-undefined-when-binding-onclic) –

+0

Übergeben Sie eine Komponente mit 'ref =" newText "' als ein Kind zu deinem Behälter, du hast es hier beschrieben? Siehe: https://stackoverflow.com/questions/34678340/react-how-to-access-refs-in-this-props-children –

+1

Änderungen ** 1. **: binden Sie den Kontext, um diese innere Karte zu verwenden body, 'this.state.comments.map (this.eachComment, this) '** 2. ** Übergeben Sie den Parameter' updateCommentText = {(a, b) => this.updateComment (a, b)} deleteFromBoard = {(a, b) => this.removeComment (a, b)} '** 3. ** bind' remove' Methode im Konstruktor. –

Antwort

1

Dies ist ein Problem, aber es kann mehr :)

In diesem Code sein:

updateCommentText={()=>this.updateComment} 

Pfeil Funktion gibt eine Funktionsreferenz, aber nicht Aufruf die Funktion, wenn updateCommentText ist aufgerufen.

Versuchen Sie stattdessen:

updateCommentText={(value, index)=>this.updateComment(value, index)} 

BTW, Sie haben ein ähnliches Problem hier:

deleteFromBoard={()=>this.removeComment} 
+1

Dies ist nicht das einzige Problem, bindendes Problem mit Karte auch, überprüfen Sie dies: https://stackoverflow.com/questions/44649990/react-js-typeerror-this-props-is-undefined#comment76285316_44649990 –

+0

Das löste mein Problem! Vielen Dank. Aber ja, wie Mayank sagte, gab es auch ein Problem mit der Kartenanbindung, das ich nicht erkannte –

Verwandte Themen