2016-07-27 4 views
1

나는 공식적인 React 튜토리얼을 작성 중이며 조금 문제가 있습니다. 주석을 추가 할 때 주석이보기에 나타나기를 기대하며, 잠깐 동안은 페이지가 새로 고쳐 지지만 페이지가 새로 고침되고 주석이 사라집니다.React Tutorial - 덧글 추가 후 덧글 추가

관련된 문제 (그리고 실제로 AJAX를 배우는 중이므로 약간의 FYI 요청)에서 코드는 JSON에 주석을 추가해야합니다. 나는 이것이 Plunker에서 작동하지 않을 것이라고 추정하지만, 페이지가 실제로 존재한다면 실제로 JSON을 업데이트하기에 충분한 코드가 있습니까?

도움 주셔서 감사합니다. Plunker 링크 및 코드는 다음과 같습니다

https://plnkr.co/edit/p76jB1W4Pizo0rDFYIwq?p=preview

<script type="text/babel"> 
    // To get started with this tutorial running your own code, simply remove 
    // the script tag loading scripts/example.js and start writing code here. 
    var CommentBox = React.createClass({ 
    loadCommentsFromServer: function() { 
     $.ajax({ 
     url: this.props.url, 
     dataType: 'json', 
     cache: false, 
     success: function(data) { 
      this.setState({data: data}); 
     }.bind(this), 
     error: function(xhr, status, err) { 
      console.error(this.props.url, status, err.toString()); 
     }.bind(this) 
     }); 
    }, 
    handleCommentSubmit: function(comment) { 
     var comments = this.state.data; 
     // Optimistically set an id on the new comment. It will be replaced by an 
     // id generated by the server. In a production application you would likely 
     // not use Date.now() for this and would have a more robust system in place. 
     comment.id = Date.now(); 
     var newComments = comments.concat([comment]); 
     this.setState({data: newComments}); 
     $.ajax({ 
     url: this.props.url, 
     dataType: 'json', 
     type: 'POST', 
     data: comment, 
     success: function(data) { 
      this.setState({data: data}); 
     }.bind(this), 
     error: function(xhr, status, err) { 
      this.setState({data: comments}); 
      console.error(this.props.url, status, err.toString()); 
     }.bind(this) 
     }); 
    }, 
    getInitialState: function() { 
     return {data: []}; 
    }, 
    componentDidMount: function() { 
     this.loadCommentsFromServer(); 
     setInterval(this.loadCommentsFromServer, this.props.pollInterval); 
    }, 
    render: function() { 
     return (
     <div className="commentBox"> 
      <h1>Comments</h1> 
      <CommentList data={this.state.data} /> 
      <CommentForm onCommentSubmit={this.handleCommentSubmit} /> 
     </div> 
    ); 
    } 
    }); 

    var CommentList = React.createClass({ 
    render: function() { 
     var commentNodes = this.props.data.map(function(comment) { 
     return (
      <Comment author={comment.author} key={comment.id}> 
      {comment.text} 
      </Comment> 
     ); 
     }); 
     return (
     <div className="commentList"> 
      {commentNodes} 
     </div> 
    ); 
    } 
    }); 

    var CommentForm = React.createClass({ 
    getInitialState: function() { 
     return {author: '', text: ''}; 
    }, 
    handleAuthorChange: function(e) { 
     this.setState({author: e.target.value}); 
    }, 
    handleTextChange: function(e) { 
     this.setState({text: e.target.value}); 
    }, 
    handleSubmit: function(e) { 
     e.preventDefault(); 
     var author = this.state.author.trim(); 
     var text = this.state.text.trim(); 
     if (!text || !author) { 
     return; 
     } 
     this.props.onCommentSubmit({author: author, text: text}); 
     this.setState({author: '', text: ''}); 
    }, 
    render: function() { 
     return (
     <form className="commentForm" onSubmit={this.handleSubmit}> 
      <input 
      type="text" 
      placeholder="Your name" 
      value={this.state.author} 
      onChange={this.handleAuthorChange} 
      /> 
      <input 
      type="text" 
      placeholder="Say something..." 
      value={this.state.text} 
      onChange={this.handleTextChange} 
      /> 
      <input type="submit" value="Post" /> 
     </form> 
    ); 
    } 
    }); 

    var Comment = React.createClass({ 
    rawMarkup: function() { 
     var md = new Remarkable(); 
     var rawMarkup = md.render(this.props.children.toString()); 
     return { __html: rawMarkup }; 
    }, 

    render: function() { 
     return (
     <div className="comment"> 
      <h2 className="commentAuthor"> 
      {this.props.author} 
      </h2> 
      <span dangerouslySetInnerHTML={this.rawMarkup()} /> 
     </div> 
    ); 
    } 
    }); 

    ReactDOM.render(
    <CommentBox url="comments.json" pollInterval={2000} />, 
    document.getElementById('content') 
); 

</script> 

답변

1

당신이 말했듯이, 문제는 이렇게 코멘트를 새로 고칠 때마다, 당신은 잃게, (마지막 단락 참조) JSON 파일의 정보가 정적 인 것입니다 새로운 것. 당신이 그것을 처리 할 수있는 방법은 처음로드하는 동안 json 파일을 사용하는 것입니다. 그런 다음 주석 상자 상태에 새 파일을 추가하는 것만으로 새로 고치지 못하게 할 수 있습니다 (이 모든 것이 단지 예제 일 뿐이며 일부 눈동자를보고 싶을뿐입니다. 그렇지?).

브라우저의 콘솔을 보면 새 파일을 저장하려는 AJAX 요청이 실패했거나 Plunker에서 업데이트 할 수 없다는 것을 알 수 있습니다. 해당 파일은 변경할 수 없습니다.