Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. class CommentBox extends React.Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = { data: this.props.initialData };
  5. this.handleCommentSubmit = this.handleCommentSubmit.bind(this);
  6. }
  7. loadCommentsFromServer() {
  8. const xhr = new XMLHttpRequest();
  9. xhr.open('get', this.props.url, true);
  10. xhr.onload = () => {
  11. const data = JSON.parse(xhr.responseText);
  12. this.setState({ data: data });
  13. };
  14. xhr.send();
  15. }
  16. handleCommentSubmit(comment) {
  17. const comments = this.state.data;
  18. // Optimistically set an id on the new comment. It will be replaced by an
  19. // id generated by the server. In a production application you would likely
  20. // use a more robust system for ID generation.
  21. comment.Id = comments.length + 1;
  22. const newComments = comments.concat([comment]);
  23. this.setState({ data: newComments });
  24.  
  25. const data = new FormData();
  26. data.append('author', comment.author);
  27. data.append('text', comment.text);
  28.  
  29. const xhr = new XMLHttpRequest();
  30. xhr.open('post', this.props.submitUrl, true);
  31. xhr.onload = () => this.loadCommentsFromServer();
  32. xhr.send(data);
  33. }
  34. componentDidMount() {
  35. window.setInterval(() => this.loadCommentsFromServer(), this.props.pollInterval);
  36. }
  37. render() {
  38. return (
  39. <div className="commentBox">
  40. <h1>Comments Data</h1>
  41. <CommentList data={this.state.data} />
  42. <CommentForm onCommentSubmit={this.handleCommentSubmit} />
  43. </div>
  44. );
  45. }
  46. }
  47.  
  48. class CommentList extends React.Component {
  49. render() {
  50. const commentNodes = this.props.data.map(comment => (
  51. <Comment author={comment.author} key={comment.Id}>
  52. {comment.text}
  53. </Comment>
  54. ));
  55. return (
  56. <div className="commentList">
  57. {commentNodes}
  58. </div>
  59. );
  60. }
  61. }
  62.  
  63. class Comment extends React.Component {
  64. render() {
  65. return (
  66. <div className="comment">
  67. <h2 className="commentAuthor">
  68. {this.props.author}
  69. </h2>
  70. {this.props.children}
  71. </div>
  72. );
  73. }
  74. }
  75.  
  76. class CommentForm extends React.Component {
  77. constructor(props) {
  78. super(props);
  79. this.state = { author: '', text: '' };
  80. this.handleAuthorChange = this.handleAuthorChange.bind(this);
  81. this.handleTextChange = this.handleTextChange.bind(this);
  82. this.handleSubmit = this.handleSubmit.bind(this);
  83.  
  84. }
  85. handleAuthorChange(e) {
  86. this.setState({ author: e.target.value });
  87. }
  88. handleTextChange(e) {
  89. this.setState({ text: e.target.value });
  90. }
  91. handleSubmit(e) {
  92. e.preventDefault();
  93. const author = this.state.author.trim();
  94. const text = this.state.text.trim();
  95. if (!text || !author) {
  96. return;
  97. }
  98. this.props.onCommentSubmit({ Author: author, Text: text });
  99. this.setState({ author: '', text: '' });
  100. }
  101. render() {
  102. return (
  103. <form className="commentForm" onSubmit={this.handleSubmit}>
  104. <input
  105. type="text"
  106. placeholder="Your name"
  107. value={this.state.author}
  108. onChange={this.handleAuthorChange}
  109. />
  110. <input
  111. type="text"
  112. placeholder="Say something..."
  113. value={this.state.text}
  114. onChange={this.handleTextChange}
  115. />
  116. <input type="submit" value="Post" />
  117. </form>
  118. );
  119. }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement