LoginSignup
12
11

More than 5 years have passed since last update.

React で show more できるリストを作る

Last updated at Posted at 2017-09-27

何か正式な名称があるのかよくわかりませんが、QiitaやGitHubのホームページにも実装されている、

スクリーンショット 2017-09-27 17.53.13a.png
スクリーンショット 2017-09-27 17.55.41a.png

こういうボタンをReactで実現する方法です。

全く装飾していないので見た目はアレですが、こんな感じの動きになります。

react.gif

ソースコード

import React, { Component } from 'react';

const items = [
  'a',
  'b',
  'c',
  'd',
  'e',
  'f',
  'g',
  'h',
  'i',
  'j',
  'k',
  'l',
  'm',
  'n',
]

export default class App extends Component {
  constructor() {
    super()

    this.state = {
      marker: 5,
    }

    this.loadList = this.loadList.bind(this)
  }

  render() {
    const list = items.map(item => <li>{item}</li>)

    return (
      <div className="App">
        <ul>
          {
            list.slice(0, this.state.marker)
          }
        </ul>
        {
          items.length > this.state.marker
            ? <button onClick={this.loadList}>MORE</button>
            : ''
        }
      </div>
    );
  }

  loadList() {
    this.setState({
      marker: this.state.marker + 5
    })
  }
}

markerというstateで、リストの何個目までを表示させるかを管理しています。
render関数内で、sliceで配列を切ってmarker個目までの要素を表示させています。

その下の三項演算子では、リスト要素数とmarkerを比較して、markerのほうが小さい(まだ表示されていない要素がある)場合、MOREボタンを表示しています。
ボタンのonClickに紐づけられたloadList関数でmarkerを更新します。
stateの更新によって自動的にrender関数が呼ばれ、表示も更新されるという仕組みです。

React標準の仕組みを使って、わりと簡単に実装できました。

私の個人ページ内でも使用しています。
こちらは見た目もちゃんと整えているので、よろしければソースコードを参考にしてみてください。

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11