複数チェックボックスの実装
Reactで複数チェックボックスの実装
ユーザー管理ページ
Growiのユーザー管理ページで、ステータスによって表示する情報を変えるためにチェックボックスの実装を行った。
チェックボックスには、All, ApprovalPending, Active, Suspended, Invitedの5つあるが、このページではAllのみを解説。
チェックボックス を入れるには
- チェックボックスを表示させるにはinputタグでtype属性に"checkbox"を入れてあげる
checked
とonClick
は後ほど解説するので今はスルーしてよし
UserManagement.jsx<input type="checkbox" //ここ checked={adminUsersContainer.isSelected('all')} onClick={() => { this.handleClick('all') }} />
- チェックボックスの横にラベル(All)を入れる
span
タグ(インライン要素)をlabel
タグで挟むclassName
にはラベルの位置や見た目を指定してあげる
UserManagement.jsx<label> <span className="label label-primary d-inline-block vt mt-1">All</span> </label>
イベント処理の条件
- React のイベントは小文字ではなく camelCase で名付けらる
- JSX ではイベントハンドラとして文字列("")ではなく関数 { } を渡す。
イベント処理 - Reactより⤴️ external_link
checked
- 何がチェックされているのかをstatusListに渡していく チェックされると、statusListの中身が
UserManagement.jsxchecked={adminUsersContainer.isSelected('all')}
AdminUsersContainer.js//AdminUsersContainerのstateの中 this.state = { selectedStatusList: new Set(['all']), //複数のチェックボックスなので配列 //初期状態は'all'にチェックされているように指定 }; //AdminUsersContainersクラスの中 isSelected(statusType) { return this.state.selectedStatusList.has(statusType); }
全体コード
UserManagement.jsx<div className="mx-5 form-inline"> //Allのチェックボックス <div className="checkbox checkbox-primary pl-0"> <input type="checkbox" id="c1" checked={adminUsersContainer.isSelected('all')} onClick={() => { this.handleClick('all') }} /> <label htmlFor="c1"> <span className="label label-primary d-inline-block vt mt-1">All</span> </label> </div> //Approval Pendingのチェックボックス <div className="checkbox checkbox-info"> <input type="checkbox" id="c2" checked={adminUsersContainer.isSelected('registered')} onClick={() => { this.handleClick('registered') }} /> <label htmlFor="c2"> <span className="label label-info d-inline-block vt mt-1">Approval Pending</span> </label> </div> //以下省略 </div>