2017-12-30 67 views
2

반응이 새로 생기고 jquery를 사용하여 ul에 li를 동적으로 추가하려고합니다. 내 안쪽에 나는 onclick 방법으로 sapn을 가지고있다. 스팬을 클릭하면 특정 메서드가 실행되기를 원하지만 얻을 수 있습니다. - 잡히지 않은 ReferenceError : deleteMsg가 HTMLSpanElement.onclick에 정의되어 있지 않습니다. 나는 해결책을 찾았지만 아무 것도 효과가 없었다. 나는 Jquery onClick 함수가 React에서 정의되지 않았습니다.

내 코드는 ... 문제가 무엇인지 이해가 안 :

class CoachPage extends React.Component { 

     constructor(props, context) { 
     super(props, context); 

     this.state={ 
      val: [] 
     } 
     } 

     handleSend(msg){ 

     this.state.val.push(msg); 
     this.setState({val: []}); 
    } 

    // get all data from db and put in the list 
    componentWillMount(){ 
     fetch('http://localhost:3003/api/msgs/') 
     .then(function(res) { 
      return res.json(); 
      }).then(function(data){ 
      var msgs = [data]; 
      msgs[0].map(function(msg){ 
       console.log(msg.msgdata); 

//Here i add the li's with a sapn and onclick method called "deleteMsg" 
       $('#coach-panel-content').append( 
        (`<li class=myli>${msg.msgdata}<span onclick=deleteMsg('${msg._id}')>X</span></li><hr>`)); 
      }) 
      }) 
     .catch(function(error) { 
      console.log(error) 
     }); 
    } 

    deleteMsg(item){ 
     return fetch('http://localhost:3003/api/msgs/' + item, { 
      method: 'delete' 
     }).then(response => 
      response.json().then(json => { 
      return json; 
      }) 
     ); 

     } 

     render() { 
     return (
      <div className="container" style={{color: '#FFF', textAlign: 'right'}}> 
      <h1>Coach Page</h1> 
      <AddMsg onSend={this.handleSend.bind(this)} /> 
      <Panel header="עדכונים" bsStyle="info" style={{float: 'left', textAlign: 'right', width: '40em'}}> 
       <ul id="coach-panel-content"> 


       </ul> 
      </Panel> 
      </div> 
     ); 
     } 
    } 

    export default CoachPage; 

UPDATE : vasas 말했다 내가하지 않았다 @sandor 나는 모든 변경을

지금까지 주목했지만 새로운 msg를 추가하려고 할 때이 오류가 발생합니다 : "잡히지 않은 ReferenceError : val이 정의되지 않았습니다". 나는 그런 일이 왜 이해가 잘 모르겠어요 .. 이 내 업데이트 된 코드는 다음과 같습니다

class CoachPage extends React.Component { 

    constructor(props, context) { 
    super(props, context); 

    this.state={ 
     val: [] 
    } 
    } 

    handleSend(msg){ 
    this.state.val.push(msg); 
    this.setState({val}); 
} 


// get all data from db and put in the list 
componentDidMount(){ 
    fetch('http://localhost:3003/api/msgs/') 
    .then(res => res.json()) 
    .then(data => this.setState({ val: data })) 
    .catch(console.error); 
} 

deleteMsg(item){ 
    return fetch('http://localhost:3003/api/msgs/' + item, { 
     method: 'DELETE' 
    }).then(response => 
     response.json() 
     .then(json => { 
     return json; 

     }) 
    ); 

    } 

    render() { 
    return (
     <div className="container" style={{color: '#FFF', textAlign: 'right'}}> 
     <h1>Coach Page</h1> 
     <AddMsg onSend={this.handleSend.bind(this)}/> 
     <Panel header="עדכונים" bsStyle="info" style={{float: 'left', textAlign: 'right', width: '40em'}}> 
     <ul id="coach-panel-content"> 
     { 
      this.state.val.map((msg, index) => 
      <li key={index} className='myli'> 
       {msg.msgdata} 
       <span onClick={() => this.deleteMsg(msg._id)}>X</span> 
       <hr/> 
      </li> 
     ) 
     } 
     </ul> 
     </Panel> 
     </div> 
    ); 
    } 
} 

export default CoachPage; 

답변

2

내가이 사용 사례에 대한 jQuery를 피하는 것이 좋습니다 수 있는가?

뷰 라이브러리로의 반응은 상태 변경만큼 간단한 것을 사용하여 들어오는 데이터의 표시를 처리하기에 충분합니다. 여기에 당신이 시작하는 일부 의사 코드 : 데이터의 성공을

class CoachPage extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { data: [] }; 
    } 

    componentDidMount() { 
    fetchYourData.then(data => { 
     this.setState({ data: data }); 
    }); 
    } 

    listItems() { 
    return this.state.data.map(msg => { 
     return (
     <li class="someClass"> 
      {msg.msgdata} 
      <span onClick={() => (deleteMsg(msg._id)})>X</span> 
      <hr /> 
     </li> 
    ); 
    }); 
    } 

    render() { 
    return (
     // your other code 
     <ul id="coach-panel-content"> 
     {this.state.data.length ? this.listItems() : null} 
     </ul> 
    ); 
    } 
} 

이 가져올 우리가 setState 전화 - 이것은 새로운 데이터가 목록 항목의 주입을 트리거와 구성 요소의 재 렌더링의 원인이됩니다은

0

이렇게하려면 jQuery가 필요하지 않습니다. 실제로, 당신은 React 상태 만 사용해야합니다. 당신은 따라서 모든 것을 삭제, 배열에 요소를 밀어하지만, 빈 배열 상태를 업데이트했다

handleSend(msg){ 
    this.state.val.push(msg); 
    this.setState({ val : this.state.val }); 
} 

먼저

handleSend(msg){ 
    this.state.val.push(msg); 
    this.setState({val: []}); 
} 

해야한다. setState({ val: val }) 또는 setState({ val }) (줄임표)을 호출하면 동일한 어레이 참조 및 트리거 재 렌더링으로 상태를 업데이트 할 수 있습니다.

API가 배열을 반환한다고 가정하면 jQuery를 필요로하지 않고 배열을 직접 업데이트하거나 다른 배열을 만들 수 있습니다.

componentWillMount(){ 
    fetch('http://localhost:3003/api/msgs/') 
     .then(res => res.json()) 
     .then(data => this.setState({ val: data })) 
     .catch(console.error); 
} 

에서 렌더링하면 출력 상태의 발 배열 :

render() { 
    return (
     <div className="container" style={{color: '#FFF', textAlign: 'right'}}> 
     <h1>Coach Page</h1> 
     <AddMsg onSend={this.handleSend.bind(this)} /> 
     <Panel header="עדכונים" bsStyle="info" style={{float: 'left', textAlign: 'right', width: '40em'}}> 
      <ul id="coach-panel-content"> 
      { 
      this.state.val.map(msg => 
       <li class='myli'> 
       {msg.msgdata} 
       <span onClick={() => this.deleteMsg(msg._id)}>X</span> 
       </li> 
      ) 
      } 
      </ul> 
     </Panel> 
     </div> 
    ); 
    }