Reactのみで簡易掲示板

Reactを用いて↓のような簡易掲示板を作ったのでメモ。


コンポーネントに分けず、Stateのみを用いたパターンと、コンポーネントにわけPropsを用いたパターンの2つを実装してみました。


実装

今回は値の追加にformは用いていません。handleInputChangeメソッド をつくり、input/textareaの値の変化をstateに反映させます。そして、追加ボタンクリック時に呼ばれるaddCommentメソッドで更新されたstateをviewに表示しています。

コンポーネントに分けずstateのみを仕様

import React, { Component } from 'react';

class App extends Component {

  // コンストラクタでstateを初期化
  constructor() {
    super();
    this.state = {
      name: '名無し',
      comment: '',
      commentList: []
    };
  }
  // input, textareaに値が入るとstateを更新する
  handleInputChange = (e) => {
    switch (e.target.name) {
      case 'name':
        this.setState({
          name: e.target.value
        })
        break;
      case 'comment':
        this.setState({
          comment: e.target.value
        })
        break;
      default:
        break;
    }
  }
  // stateを更新
  addComment = () => this.setState({
    commentList: [
      ...this.state.commentList,
      {
        name: this.state.name,
        comment: this.state.comment
      }
    ]
  })

  render() {
    return (
      <div style={{width: 500, margin: 'auto'}}>
        <input name='name' type='text' placeholder='名前' onChange={this.handleInputChange}/><br />
        <textarea name='comment' style={{width: 400, height: 100}} onChange={this.handleInputChange} placeholder='何か書いてね'/>
        <input type='submit' value='追加' onClick={this.addComment}/>
        <table>
          <thead>
            <tr>
              <th>名前</th>
              <th>コメント</th>
            </tr>
          </thead>
          <tbody>
          {
            this.state.commentList.map((comment, index) => (
              <tr key={index}>
                <td>{comment.name}</td>
                <td>{comment.comment}</td>
              </tr>
            ))
          }
          </tbody>
        </table>
      </div>
    )
  }
}

export default App;


コンポーネントにわけPropsを使用

import React, { Component } from 'react';

class App extends Component {

  constructor() {
    super();
    this.state = {
      name: '名無し',
      comment: '',
      commentList: []
    };
  }

  handleInputChange = (e) => {
    switch (e.target.name) {
      case 'name':
        this.setState({
          name: e.target.value
        })
        break;
      case 'comment':
        this.setState({
          comment: e.target.value
        })
        break;
      default:
        break;
    }
  }

  addComment = () => this.setState({
    commentList: [
      ...this.state.commentList,
      {
        name: this.state.name,
        comment: this.state.comment
      }
    ]
  })

  render() {
    return (
      <Components handleInputChange={this.handleInputChange} addComment={this.addComment} commentList={this.state.commentList} />
    )
  }
}

const Components = (props) => (
  <div style={{width: 500, margin: 'auto'}}>
    <input name='name' type='text' placeholder='名前' onChange={props.handleInputChange}/><br />
    <textarea name='comment' style={{width: 400, height: 100}} onChange={props.handleInputChange} placeholder='何か書いてね'/>
    <input type='submit' value='追加' onClick={props.addComment}/>
    <table>
      <thead>
        <tr>
          <th>名前</th>
          <th>コメント</th>
        </tr>
      </thead>
      <tbody>
      {
        props.commentList.map((comment, index) => (
          <tr key={index}>
            <td>{comment.name}</td>
            <td>{comment.comment}</td>
          </tr>
        ))
      }
      </tbody>
    </table>
  </div>
)

export default App;


 以上、メモでした。