Reactにて条件分岐による表示内容(component)の切り替え方法を紹介致します。
1.前回の記事について
前回の記事では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」を押下すると、以下のフォームに切り替わります。
「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コードを簡潔にすることで見やすくなるかと思います。