2017-02-07 2 views
0

새로운 반응이 있습니다. 나는 단지 코멘트 박스를 만들고 여러 코멘트를 포함하는 코멘트 보드를 만들려고 노력 중이다.루프에서 자식에게 전달 된 소품 기능을 호출 할 수 없습니다.

각 의견에는 하나의 inputbox, 버튼 (저장, 편집) 및 버튼 (제거)이 있습니다. 나는 component에 updateComment라는 이름의 보드에서 만든 함수를 소품으로 전달했습니다.

Now this.props.updateComment를 사용하여 부모 함수 updateComment를 호출 한 하위 함수 저장을 실행하려고하면 오류가 발생하여 정의되지 않은 속성을 읽을 수 없습니다.

stackoverflow에서 비슷한 질문을 검색했지만이 방법을 해결할 수 없습니다.

내 app.js 코드는 다음과 같습니다.

import React from 'react'; 
import { Home } from './home.jsx'; 

class App extends React.Component { 
    render() { 
     return (
     <div> 
      <Header/> 
      <Board /> 
     </div> 
    ); 
    } 
} 

class Header extends React.Component { 
    render() { 
     return (
     <div> 
      <h1>Header</h1> 
     </div> 
    ); 
    } 
} 

class Board extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      comments:[ 
      "My name is brijesh", 
      "My name is santosh", 
      "My name is manoj" 
     ]} 
    }; 
    removeComment(i) { 
     console.log("going to remove element i",i); 
     var arr = this.state.comments; 
     arr.splice(i,1); 
     this.setState({comments:arr}); 
    }; 
    updateComment(newComment, i) { 
     var arr = this.state.comments; 
     arr[i] = newComment; 
     this.setState({comments:arr}); 
    }; 
    render() { 
     return (
      <div className="board"> 
       { 
        this.state.comments.map(function(text,i) { 
         return (
          <Comment key ={i} index = {i} 
           updateComment={() => {this.updateComment}} 
           removeComment={() => {this.removeComment}}> 
            {text} 
          </Comment> 
         ) 
        }) 
       } 
      </div> 
     ) 
    } 
} 

class Comment extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      edit: false 
     }; 
    }; 
    edit(){ 
     this.setState({edit:true}); 
     console.log("you clickced on edit0"); 
    }; 
    save(){ 
     this.setState({edit:false}); 
     var newText = this.refs.newText.value; 
     this.props.updateComment(newText, this.props.index); 
     console.log("you clickced on edit0",newText); 
    }; 
    handleChange(event) { 
     this.setState({value: event.target.value}); 
    } 
    render() { 
      if(this.state.edit) { 
       return (
       <div> 
        <div className="comment"> 
         <input type="text" ref="newText" defaultValue={this.props.children} onChange={ this.handleChange.bind(this) } /> 
         <button onClick={this.save.bind(this)}>Save</button> 
        </div> 
       </div> 
      ) 
     } 
     else { 
      return (
       <div> 
        <div className="comment"> 
         <div>{ this.props.children }</div> 
         <button onClick={this.edit.bind(this)}>Edit</button> 
        </div> 
       </div> 
      ) 
     } 
    } 
} 

export default App 

내 main.js는 다음과 같습니다.

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import App from './App.jsx'; 


ReactDOM.render(
    (< App/>), document.getElementById('app')); 

나는 또한 피들을 만들었습니다. 그것은 "이"당신이 그렇게 생성자에서 그 바인딩을 수행 할 수 있습니다

render() { 
    return (
     <div className="board"> 
      { 
       this.state.comments.map(function(text,i) { 
        return (
         <Comment key ={i} index = {i} 
          updateComment={this.updateComment.bind(this)} 
          removeComment={this.removeComment.bind(this)}> 
           {text} 
         </Comment> 
        ) 
       }) 
      } 
     </div> 
    ) 
} 

주 무엇인지 알 수 있도록

https://jsfiddle.net/aubrijesh/k3h2pcnj/#&togetherjs=uEI7TFnJD1

답변

1

DOMZE가 올바른 경로에 있다고 생각하지만 맵 문에서 함수를 바인딩해야합니다. 내 의견으로는 화살표 기능을 사용하면 이 무엇을 의미하는지 쉽게 추적 할 수 있습니다.

class Board extends React.Component { 
 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
      comments:[ 
 
      "My name is brijesh", 
 
      "My name is santosh", 
 
      "My name is manoj" 
 
     ]} 
 
    }; 
 
    removeCommment(i) { 
 
     console.log("going to remove element i",i); 
 
     var arr = this.state.comments; 
 
     arr.splice(i,1); 
 
     this.setState({comments:arr}); 
 
    }; 
 
    updateComment(newComment, i) { 
 
     var arr = this.state.comments; 
 
       console.log("new Comment"); 
 
     arr[i] = newComment; 
 
     this.setState({comments:arr}); 
 
    }; 
 
    render() { 
 
     return (
 
      <div className="board"> 
 
       { 
 
        this.state.comments.map((text,i) => { 
 
         return (
 
          <Comment key ={i} index = {i} 
 
           updateComment={() => {this.updateComment}} 
 
           removeComment={() => {this.removeComment}}> 
 
            {text} 
 
          </Comment> 
 
         ) 
 
        }) 
 
       } 
 
      </div> 
 
     ) 
 
    } 
 
} 
 

 
class Comment extends React.Component { 
 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
      edit: false 
 
     }; 
 
    }; 
 
    edit(){ 
 
     this.setState({edit:true}); 
 
     console.log("you clickced on edit0"); 
 
    }; 
 
    save(){ 
 
     this.setState({edit:false}); 
 
     var newText = this.refs.newText.value; 
 
     this.props.updateComment(newText, this.props.index); 
 
     console.log("you clickced on edit0",newText); 
 
    }; 
 
    handleChange(event) { 
 
     this.setState({value: event.target.value}); 
 
    } 
 
    render() { 
 
      if(this.state.edit) { 
 
       return (
 
       <div> 
 
        <div className="comment"> 
 
         <input type="text" ref="newText" defaultValue={this.props.children} onChange={ this.handleChange} /> 
 
         <button onClick={this.save.bind(this)}>Save</button> 
 
        </div> 
 
       </div> 
 
      ) 
 
     } 
 
     else { 
 
      return (
 
       <div> 
 
        <div className="comment"> 
 
         <div>{ this.props.children }</div> 
 
        <button onClick={this.edit.bind(this)}>Edit</button> 
 
        </div> 
 
       </div> 
 
      ) 
 
     } 
 
    } 
 
} 
 

 
ReactDOM.render(<Board />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"></div>

+0

답장을 보내 주셔서 감사합니다. @LPL,하지만 동일한 오류가 발생했습니다. "저장되지 않은"updateComment '속성을 읽을 수 없습니다. 저장 단추를 클릭하십시오. 전체 코드도 업데이트했습니다. –

+0

@BrijeshVishwakarma 새 코드를 보여줄 수 있습니까? 제출 한 코드 스 니펫을 실행했는지 알 수 있듯이 저장시 오류가 없으므로 업데이트를 보지 않으면 도움이되지 않습니다. – LPL

+0

위의 업데이트 코드가 있습니다. –

0

당신은, 함수에 클래스를 바인드해야 각각의 모든 렌더링에서 바인딩하지 않는다는 것입니다.

+0

감사를 렌더링하지만 같은 오류를 제공 작동하지 않습니다. 나는 이와 같은 맵 함수에서 'this'를 전달하려고 시도했다. this.state.comments.map (기능 (텍스트, ⅰ) { 창 ( <코멘트 키 = {I} 지수 = {I} = { updateComment this.updateComment.bind (이)} = { removeComment this.removeComment.bind (이)}> {텍스트} ) }이) 그러나이 또한 작동하지 않습니다. –

1

갱신하여, 초기 응답 @DOMZE에 대한 을 방법

let self = this; 
    return (
       <div className="board"> 
        { 
         self.state.comments.map(function(text,i) { 
          return (
           <Comment key ={i} index = {i} 
            updateComment={() => {self.updateComment}} 
            removeComment={() => {self.removeComment}}> 
             {text} 
           </Comment> 
          ) 
         }) 
        } 
       </div> 
    ) 
+0

@Ravi Teja 감사합니다. 그게 효과가있다. 왜 exjactly 설명 할 수 있습니까 ?? –

관련 문제