質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1346閲覧

React 大量のチェックボックスの結果をメンテナンス性よく記述したい

TAKAYA

総合スコア1

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/03/25 14:48

編集2022/03/25 16:43

Reactでチェックボックスがチェックされたかどうかの結果を
ローカルストレージに保存する機能を以下のように作りました。

React

1import './App.css'; 2import { useState, useEffect } from 'react'; 3 4//チェックボックスの初期値を設定 5const App = () => { 6 const [currentCheckboxId, setCheckboxId] = useState({ 7 check1: false, 8 check2: false, 9 }); 10 11//ローカルストレージに保存されている1つ目と2つ目のチェックボックスの結果を取得 12 useEffect(() => { 13 const data = { 14 check1: localStorage.getItem('check1') === 'true' ? true : false, 15 check2: localStorage.getItem('check2') === 'true' ? true : false, 16 }; 17 setCheckboxId(data); 18 }, []); 19 20//1つ目のチェックボックスの結果をローカルストレージに保存 21 const setCheckbox = (event) => { 22 const check1 = event.target.checked; 23 localStorage.setItem('check1', check1); 24 25 setCheckboxId((prevData) => ({ 26 ...prevData, 27 check1: check1, 28 })); 29 }; 30 31//2つ目のチェックボックスの結果をローカルストレージに保存 32 const setCheckbox2 = (event) => { 33 const check2 = event.target.checked; 34 localStorage.setItem('check2', check2); 35 36 setCheckboxId((prevData) => ({ 37 ...prevData, 38 check2: check2, 39 })); 40 }; 41 42//ローカルストレージの内容削除 43 const removeCheckbox = (event) => { 44 const check1 = event.target.checked; 45 const check2 = event.target.checked; 46 localStorage.clear(); 47 setCheckboxId((prevData) => ({ 48 ...prevData, 49 check1: check1, 50 })); 51 setCheckboxId((prevData) => ({ 52 ...prevData, 53 check2: check2, 54 })); 55 }; 56 57 return ( 58 <div className='App'> 59 <h1>リロードしても消えないチェックボックス</h1> 60 <label> 61 チェックボックス1 62 <input type='checkbox' onChange={setCheckbox} id='first' checked={currentCheckboxId.check1} /> 63 </label> 64 65 <label> 66 チェックボックス2 67 <input type='checkbox' onChange={setCheckbox2} id='second' checked={currentCheckboxId.check2} /> 68 </label> 69 <br /> 70 <button onClick={removeCheckbox}>チェックを全て外す</button> 71 </div> 72 ); 73}; 74 75export default App;

コードではチェックボックスが2個ですが
本来は70個チェックボックスを作りたいです。
この場合愚直に3.4.5と変数の数字だけ変えて70回書くしか方法はないのでしょうか?
今後のことも考えてもメンテナンス性の良いコードにしたいと
考えているのですがどの様にまとめれば良いか思いつきません。
是非アドバイス等よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKAYA

2022/03/25 15:00

アドバイスありがとうございます ただ配列を使って今回の要件と同じ機能を どのように実装すれば良いのか 自分には考えつかないので もし宜しければサンプル等をもらえると助かります
guest

回答1

0

ベストアンサー

複数のコンポーネントをレンダーする
https://ja.reactjs.org/docs/lists-and-keys.html#rendering-multiple-components

リンク先を参考に修正してみました。
(Reactは勉強中ですのであまりスッキリ記述できていないかもしれません・・)
不明な点がありましたらコメントください。

js

1import './App.css'; 2import { useState, useEffect } from 'react'; 3 4//チェックボックスの初期値を設定 5const App = () => { 6 const checkboxLength = 3 7 const getInitialValues = () => Array(checkboxLength).fill(false) 8 const [checked, setChecked] = useState(getInitialValues()) 9 10 //ローカルストレージに保存されているチェックボックスの結果を取得 11 useEffect(() => { 12 const json1 = localStorage.getItem('checked') 13 if (json1) { 14 const array1 = JSON.parse(json1) 15 setChecked(array1) 16 } 17 }, []); 18 19 // チェックボックスの結果をローカルストレージに保存 20 const onChange = (e, i) => { 21 const array1 = checked.map((x2, i2) => i2 === i ? e.target.checked : x2) 22 setChecked(array1) 23 const json1 = JSON.stringify(array1) 24 localStorage.setItem('checked', json1); 25 } 26 27 // 複数のチェックボックス 28 const checkboxes = checked.map((x, i) => ( 29 <div> 30 <label> 31 チェックボックス{i + 1} 32 <input type='checkbox' checked={x} onChange={e => onChange(e, i)} /> 33 </label> 34 </div> 35 )) 36 37 //ローカルストレージの内容削除 38 const removeCheckbox = () => { 39 localStorage.clear(); 40 setChecked(getInitialValues()) 41 }; 42 43 return ( 44 <div className='App'> 45 <h1>リロードしても消えないチェックボックス</h1> 46 {checkboxes} 47 <button onClick={removeCheckbox}>チェックを全て外す</button> 48 </div> 49 ); 50}; 51 52export default App;

投稿2022/03/26 04:27

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKAYA

2022/03/26 09:03 編集

とても丁寧な回答ありがとうございます。 自分ではとても思いつきませんでした。 ローカルストレージに保存の部分なのですが onChange={e => onChange(e, i)} でHTMLのイベント情報とindex番号を const onChange = (e, i) => { const array1 = checked.map((x2, i2) => i2 === i ? e.target.checked : x2) setChecked(array1) const json1 = JSON.stringify(array1) localStorage.setItem('checked', json1); } の関数に渡して i2 === i ? e.target.checked : x2 で同じindex番号の値のみ更新しているという考えであってますか?
退会済みユーザー

退会済みユーザー

2022/03/26 09:10

コメントありがとうございます。 > で同じindex番号の値のみ更新しているという考えであってますか? そうです、合っています。 ここが個人的にはスッキリしない感じがしていたところですが、 配列を部分的に更新するには、私の現時点のスキル的にはこんな感じになるかな、 といった回答でした・・
TAKAYA

2022/03/26 10:05

質問の回答ありがとうございます 今回提示していただいたコードの全容が理解できました。 自分もxg63ex2bさんのように柔軟な考えでコードが書けるよう これからも勉強していきます。 ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問