React 条件分岐によるComponent表示切り替え方法を理解する #4

JS

Reactにて条件分岐による表示内容(component)の切り替え方法を紹介致します。

1.前回の記事について

前回の記事ではuseStateについて解説しました。

React hook useStateの使い方を理解する #3
Event HandlerとuseStateについて紹介していきます。ユーザーがボタンを押下する、何か画面に入力するなどの操作をトリガーとして、定義したイベントを実行する仕組みになります。useStateと組み合わせて使うことがあるため、一緒に紹介します。

 

本記事では、前回記事で使ったコードを元に変更・追加をしていきます。

条件分岐によるcomponent表示切り替え方法だけであれば、本記事内のコードだけで理解できるようにしています。

2.条件分岐による切り替え

「Add New」ボタンのクリックにより、表示内容を切り替え、「Cancel」ボタンによって元の表示にする例を紹介します。

条件分岐による切り替え方法は、いくつかあります。

2.1 && を使う

NewExpense.js

import React, { useState } from 'react';
import ExpenseForm from './ExpenseForm';
import './NewExpense.css';

const NewExpense = (props) => {
  const [isEditing, setIsEditing] = useState(false);

  const editingHandler = () => {
    setIsEditing(true);
  }

  const stopEditingHandler = () => {
    setIsEditing(false);
  }

  return (
    <div className='new-expense'>
      {!isEditing && <button onClick={editingHandler}>Add New</button>}
      {isEditing && <ExpenseForm onAddExpense={props.onAddExpense} onStop={stopEditingHandler} />}
    </div>
  );
};

export default NewExpense;

追加変更点

const [isEditing, setIsEditing] = useState(false);

trueとfalseに切り替えを管理するflagとしてisEditingを用意します。

{!isEditing && <button onClick={editingHandler}>Add New</button>}

!isEditing つまり、isEditingがfalseのときは、「Add New」ボタンが表示されるようにします。

{isEditing && <ExpenseForm onAddExpense={props.onAddExpense} onStop={stopEditingHandler} />}

!isEditing つまり、isEditingがfalseのときは、「Add New」ボタンが表示されるようにします。

{isEditing && <ExpenseForm onAddExpense={props.onAddExpense} onStop={stopEditingHandler} />}

isEditingがtrueのときは、ExpenseFormが表示されるようにします。

onStopは、「Cancel」ボタンが押されたときの処理になります。

ボタンは、ExpenseForm内に追加します。

ExpenseForm.js

import { useState } from 'react';
import './ExpenseForm.css';

const ExpenseForm = (props) => {

…

  return (
    <form onSubmit={submitHandler}>
      <div className='new-expense__controls'>
        <div className='new-expense__control'>
          <label>Title</label>
          <input type='text' onChange={titleChangeHandler} />
        </div>
        <div className='new-expense__control'>
          <label>Price</label>
          <input type='number' min='0.01' step='0.01' onChange={priceChangeHandler} />
        </div>
        <div className='new-expense__control'>
          <label>Date</label>
          <input type='date' min='2019-01-01' max='2022-12-31' onChange={dateChangeHandler} />
        </div>
      </div>
      <div className='new-expense__actions'>
        <button type='submit'>+ Add</button>
        <button type="button" onClick={props.onStop}>Cancel</button>
      </div>
    </form>
  );
}

export default ExpenseForm;

以下のボタンを追加します。

<button type="button" onClick={props.onStop}>Cancel</button>

props.onStopはNewExpenseから渡されるカスタムEvent handlerです。

「Add New」を押下すると、フォームが表示されます。

Add-New-button

「Add New」を押下すると、以下のフォームに切り替わります。

Add-ExpenseForm-cancel

「Cancel」を押下すると、初期表示時の「Add New」ボタン表示に切り替わります。

2.2 : 三項演算子を使う

NewExpense.js

const NewExpense = (props) => {

…

  return (
    <div className='new-expense'>
      {isEditing ?
        <ExpenseForm onAddExpense={props.onAddExpense} onStop={stopEditingHandler} />
      :
        <button onClick={editingHandler}>Add New</button>
      }
    </div>
  );
};

export default NewExpense;

{条件 ? trueのときの内容 : falseのときの内容 }

三項演算子では、trueとfalseのどちらもときの処理もまとめることができます。

2.3 関数を定義してif文で分岐

NewExpense.js

const NewExpense = (props) => {

  const [isEditing, setIsEditing] = useState(false);
  
  const editingHandler = () => {
    setIsEditing(true);
  }

  const stopEditingHandler = () => {
    setIsEditing(false);
  }

  const AddExpenseForm = () => {
    if(isEditing) {
      return <ExpenseForm onAddExpense={props.onAddExpense} onStop={stopEditingHandler} />
    } else {
      return <button onClick={editingHandler}>Add New</button>
    }
  }

  return (
    <div className='new-expense'>
      <AddExpenseForm />
    </div>
  );
};

export default NewExpense;

NewExpenseの中に新しい arrow関数を定義します。

const AddExpenseForm = () => {
  if(isEditing) {
    return <ExpenseForm onAddExpense={props.onAddExpense} onStop={stopEditingHandler} />
  } else {
    return <button onClick={editingHandler}>Add New</button>
  }
}

JSXコードの中に、AddExpenseFormを追加します。

 return (
   <div className='new-expense'>
     <AddExpenseForm />
   </div>
 );

3.まとめ

条件分岐によるcomponentの表示切り替え方法を紹介致しました。

いずれも挙動自体は同じになります。

用途に応じて&&や三項演算子は使い分けをすればよいかと思います。

また条件が複雑な場合は、関数を定義してJSXコードを簡潔にすることで見やすくなるかと思います。