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

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

新規登録して質問してみよう
ただいま回答率
85.35%
React.js

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

Q&A

解決済

1回答

1647閲覧

stateの状態をmap関数内で付与したい

kimch

総合スコア8

React.js

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

0グッド

0クリップ

投稿2021/06/22 08:45

前提・実現したいこと

・reactで作成しているtodoリストにおいて、タスクそれぞれで異なるステータス(進行中、完了済みetc)を保持できる様にしたい。
当方勉強不足なのは重々承知なのですが、どうしても解決できなかったため、皆様のお力をお借りできたらと思い質問させていただきます。

何卒、よろしくお願い致します。

問題点/エラー内容/エラー文章

・ステータスの変更と背景色の変更が全てのタスクで共通して行われる。
<=>一つのtodoのみの進捗(useStateで管理しています)を変更することができない。

該当ソースコード/コマンド

incompleteTodos

1 2 3export const IncompleteTodos = (props) =>{ 4const [status,setStatus] = useState([0,1,2,3]); 5 const {incompleteTodos, onClickComplete, onClickDelete} = props; 6const statusValue = (e) =>{ 7 setStatus(e.target.value) 8} 9 10 return( 11 <> 12 <INcompleteBlock> 13 <TItle>todo一覧</TItle> 14 <UL> 15 {incompleteTodos.map((todo,index)=>{ 16 return( 17 <INcompleteList key={index} 18 style={status==="1"? {background:'#FF97C2'} 19 :status==="2"? {background:'#E9FFA5'} 20 :status==="3"? {background:'#78FF94'} 21 :{background:'#EEEEEE'} 22 } 23 > 24 <LIstGuide > 25 <LI>No:{index+1}</LI> 26 <LI>あと{todo.limit}日!</LI> 27 </LIstGuide> 28 <LI>Title:{todo.title}</LI> 29 <LI>内容:{todo.text}</LI> 30 <BUtton onClick={()=>onClickDelete(index)}>削除</BUtton> 31 <BUtton onClick={()=>onClickComplete(index)}>編集</BUtton> 32 <select value={status[index]} onChange={statusValue}>     33 <option selected value="0">選択してください</option> 34 <option value="1">未着手</option> 35 <option value="2">進行中</option> 36 <option value="3">完了済み</option> 37 </select> 38 </INcompleteList> 39); 40 })} 41 </UL> 42 </INcompleteBlock> 43 </> 44 ) 45}; 46const INcompleteBlock = styled.div` 47background-color: #88FFFF; 48width: 80%; 49border-radius: 20px; 50padding-bottom:10px; 51` 52const TItle = styled.p` 53text-align: center; 54font-size: 25px; 55font-weight: bold; 56color: #666; 57` 58 59const UL = styled.ul` 60width:80%; 61` 62const LI = styled.li` 63list-style:none; 64margin: 5px; 65` 66const INcompleteList = styled.div` 67background-color: #EEFFFF; 68 border-radius: 20px; 69 padding: 15px; 70 margin:10px; 71` 72const BUtton = styled.button` 73border-radius: 20px; 74 border: none; 75 margin: 3px 5px 6px 3px; 76 &:hover{ 77 border-radius: 20px; 78 border: none; 79 background-color: blueviolet; 80 color: white; 81} 82 cursor: pointer; 83` 84 85const LIstGuide= styled.div` 86display:flex 87`

処理の流れ

①ドロップダウンリストでステータスの変更を行う。
②useStateのstateに変更が起こるため、レンダリングが起きる。
③pタグ内の三項演算子の記述により、選択したstateによって背景色が変更される。

エラー原因となり得る部分

・map関数内の記述。
→useStateによりステータスの管理を行っているが、一つ一つのtodoにおいてステータスのstateに一意性がないためではないかと考えた。

試したことや調べたこと

-map関数内で一意性を持たせるため、indexの記述をした。
このくらいしか思いつかず、map関数、一意性等検索したのですが、解決には至りませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

statusに入れる値を一貫させましょう。

初期化では[0,1,2,3]と配列を入れているのに、statusValueでは1つの値にしてしまっています。

投稿2021/06/22 08:59

maisumakun

総合スコア146018

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

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

kimch

2021/06/22 09:29

maisumakun 様 いつもアドバイスいただきありがとうございます。 承知しました。 statusValueで取得するのは一つの値ですので、useStateをuseState("")としました。
maisumakun

2021/06/22 09:35

> statusValueで取得するのは一つの値ですので、useStateをuseState("")としました。 逆に、全部を配列で一貫させてください。 それぞれのタスクでバラバラの状態を記録させたいのであれば、stateが1つの値というのはおかしいです。
kimch

2021/06/22 09:53

>それぞれのタスクでバラバラの状態を記録させたいのであれば、stateが1つの値というのはおかしいです。 おっしゃる通りですね。よく分かってなくて申し訳ないです。。。 質問させていただきたいのですが、statusValueでは、自身の認識ではoptionで記述している1~3の数字のどれかが、onChangeによって取得できていると考えていたのですが、これが間違えているということでしょうか??? 何度も申し訳ないです。。。
maisumakun

2021/06/22 09:57

> 自身の認識ではoptionで記述している1~3の数字のどれかが、onChangeによって取得できていると考えていたのですが、これが間違えているということでしょうか??? それは正しいです。得られた値を、配列の正しい位置にセットする必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問