2016-07-27 85 views
1

我正在通过官方的React教程,并有一点麻烦。当我添加评论时,我希望评论能够在视图中显示,并在一瞬间显示,但随后页面刷新并且评论消失。React教程 - 页面刷新后添加评论添加

在一个相关的问题上(并且真的只是一个小的FYI的请求,因为我还在学习AJAX),代码应该将注释添加到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上更新它,该文件是不可变的。