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

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

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

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

解決済

1回答

3810閲覧

React CheckBoxの判定の仕方

dsfdsf

総合スコア44

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

1クリップ

投稿2020/01/23 05:28

チェックボックスの処理の書き方について困っています。
Listの一行目、または二行目または三行目のチェックボックスがクリックされた時そのtaskのdoneをtrueにするにはどう書いたらいいでしょうか?
どの行のチェックボックスがクリックされたかどうやったらわかるのでしょうか?

export type Task = { id: number title: string done: boolean }
const App: React.FC = () => { const [tasks, setTasks] = useState([]) return ( <div> <TaskInput setTasks={setTasks} tasks={tasks} /> <TaskList setTasks={setTasks} tasks={tasks} /> </div> ) }
//子コンポーネント import React from 'react' import { Task } from './Types' type Props = { task: Task handleDone: (task: Task) => void handleDelete: (task: Task) => void } const TaskItem: React.FC<Props> = ({ task, handleDone, handleDelete }) => { return (     {task.map((i) => ( <li> <label> <input type="checkbox" className="checkbox-input" onClick={//チェックされたらdoneをtrueにしたい} /> <span className="checkbox-label">{i.title }</span> </label> <button onClick={() => handleDelete(task)} className="btn is-delete" >削除</button> </li> ) } export default TaskItem

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

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

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

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

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

miyabi_takatsuk

2020/01/23 05:47

すみません、Reactは勉強中なのですが、 中かっこ({}です)の開始と閉じの数が合っていないようなのですが、 それに関してエラーが出てたりしませんか? {task.map((i) => ( の{に対しての、}が無いようにお見受けします。 案外それで解決するかもですよ。
thyda.eiqau

2020/01/23 06:03

task.map() していますが、task: Taskは配列ではないのでは? <TaskItem />をどう呼び出しているかもご提示ください。
guest

回答1

0

ベストアンサー

前提がわからない (<TaskItem /> をどう呼び出しているか等) ままエスパーした箇所もあるので正確ではないかもしれないし、TypeScriptはこの質問を見て初めて書いたのでお作法が違ったりもっと良い書き方があったりするかもしれませんが、とりあえず下記で動くのは動きました。

結局やっていることはシンプルで、 onChange ハンドラでpropsで渡されたhandleDoneをコールして、handleDone側でstateの値を変更すればよいです。

これ以上の解説は前提条件がないと無理ですので適宜追記してください。

ts

1/// App.tsx 2 3import React, { useState } from 'react'; 4 5type Task = { 6 id: number 7 title: string 8 done: boolean 9} 10 11interface TaskListProps { 12 tasks: Task[] 13 handleDone: (id: number) => void 14 handleDelete: (id: number) => void 15} 16 17const TaskList: React.FC<TaskListProps> = ({tasks, handleDone, handleDelete}) => { 18 return ( 19 <div> 20 { 21 tasks.map(task => ( 22 <li key={task.id}> 23 <label> 24 <input 25 type="checkbox" 26 className="checkbox-input" 27 checked={task.done} 28 onChange={() => handleDone(task.id)} 29 /> 30 <span className="checkbox-label">{task.title}</span> 31 </label> 32 <button 33 onClick={() => handleDelete(task.id)} 34 className="btn is-delete" 35 >削除</button> 36 </li> 37 )) 38 } 39 </div> 40 ) 41} 42 43const App: React.FC = () => { 44 const [tasks, setTasks] = useState<Task[]>([{ 45 id: 42, 46 title: "The Answer", 47 done: false 48 }]) 49 50 const handleDone = (id: number) => { 51 setTasks(tasks.map(t => { 52 t.done = t.id === id? !t.done : t.done 53 return t 54 })) 55 console.table(tasks); 56 } 57 58 const handleDelete = (id: number) => { 59 setTasks(tasks.filter(t => t.id !== id)) 60 } 61 62 return ( 63 <div className="App"> 64 <TaskList 65 tasks={tasks} 66 handleDone={handleDone} 67 handleDelete={handleDelete} 68 /> 69 </div> 70 ); 71} 72 73export default App;

投稿2020/01/23 08:18

thyda.eiqau

総合スコア2982

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

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

miyabi_takatsuk

2020/01/23 09:07

横槍失礼します。 蛇足で、質問に関係ないですが、 言語名、typescriptでコードカラーリング用意されていますよー (あんましカラーリング変わらんかもですが) あと、 type、interface定義時の各プロパティは、末尾にセミコロン入れた方がいいかもです。(Linterで警告でる) JSのスーパーセットな言語ではありますが、JSと違い、けっこうセミコロンにはうるさい言語な印象があります。
thyda.eiqau

2020/01/23 09:28

おっと、js/build/21a1d1d9da25c445eae2.2.js?1578977354949 (本日現在) でtypescriptのaliasにtsが入っているのでtsでも効くと思ったのですが、別なのですかね。 LinterはTSLintですかね?マジでTypeScript初めて書いたのでEditorにLinterが入ってなかったです。今インストールしてみたところ何の警告も出さないのでconfigがいるかもしれないですね。質問者がどういうruleでやってるかわからないので、よしなに見る側で直していただいてもいい気がします
miyabi_takatsuk

2020/01/23 09:31

コードカラーリングに関しては失礼しました!そうだったのですね! あら・・・、どうなんですかね・・・。 私は、VS Codeで、Linter使ってるのですが、 警告発生しているので、設定厳しすぎるのかな・・・。 確かに、それでよさそうですね 汗 コメント大変に失礼しました。
dsfdsf

2020/01/24 01:07

ご回答ありがとうございます。 t.done = t.id === id? !t.done : t.doneはどういう意味なんでしょうか?
thyda.eiqau

2020/01/24 02:14

短縮せずに書くとこうです。 tasks.map((t: Task) => { if(t.id === id) { t.done = !t.done; } return t; }) stateの `tasks: Task[]` をmapでループして、各要素を `t: Task` に代入してアクセスしています。 tのidが、クリックイベントの発火元になったidと一致しているなら、そのtのdoneを反転しています (done: trueのときにクリックしたらfalseになり、falseのときにクリックしたらtrueになる)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問