🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
React.js

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

Q&A

解決済

1回答

1207閲覧

reactでのいいねボタン作成

Ajay

総合スコア1

React.js

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

0グッド

0クリップ

投稿2021/02/09 01:38

前提・実現したいこと

react mapの使い方

発生している問題・エラーメッセージ

特に無し

該当のソースコード

react

1-イメージはいいねボタンです。- 2 3{****map((photo, index) => 4---コード--- 5<FaHeart 6className="faheart" id="faheart" 7onClick={() => setShowHeartitems(!showHeartitems)} 8style={{color: showHeartitems ? "white" : "#E0306C"}}/> 9---コード--- 10)}[ 11 12ざっくりとですがこのような構造でjsonをmapで処理しています。 13 14そこで、記載させて頂いた<FaHeart...からのコードでハートのマークをタップするとハートの色が変わるというコードを書きたいと思っているのですが、現状1つのハートをタップすると処理されている全てのハートの色が変わってしまいます。 15keyを付けてみたり試行錯誤したのですが、現状維持で改善しませんでした。 16 17実現したいこととしては、 18・1つ1つハートが変わること 19・色が変わったハートのkey?index?を取得出来る事 20 21宜しくお願い致します。 22 23

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

hoshi-takanori

2021/02/09 01:58

showHeartitems が一つの boolean 値になってると思いますが、これを配列またはオブジェクトにする必要があるでしょうね。
Ajay

2021/02/09 02:06

回答の程、ありがとうございます。 回答の通りboolean になっております。 具体的にどのようにすれば良いでしょうか? お手数おかけしますが、初心者のため、お願い出来ると幸いです。 宜しくお願い致します。
hoshi-takanori

2021/02/09 02:14

具体的に答えるには、もう少し情報というか、前後のソースが欲しいですね。 map の前にある配列 (photo の配列?) の要素は固定ですか? 内容は URL か何か? 色が変わったハートのkey?index?を取得する際の key? index? はどうなって欲しいですか? あと、const [showHeartitems, setShowHeartitems] = useState(false); ってことですよね。
Ajay

2021/02/09 02:24

承知致しました。 お手数おかけして申し訳ないです。 hoshi-takanori様の記述通り下記の通りに書いております。 const [showHeartitems, setShowHeartitems] = useState(false); 長くなりますが、下記がmapの省略無しのバージョンです。 <div id="second"> {filteredInfo1000.map((photo, index) => <div className="photo-box"> <img src={photo.photo} className="photo-items" /> <div className="flex-bottom"> <div className="heat-box"> <div className="heart-back" id="heart-back" onClick={() => setShowHeartitems(!showHeartitems)} style={{backgroundColor: showHeart ? "#E0306C" : ""}}> {/* 本体 */} <FaHeart className="faheart" id="faheart" onClick={() => setShowHeartitems(!showHeartitems)} style={{color: showHeartitems ? "white" : "#E0306C"}}/> </div> </div> <a href={photo.link}><h3 className="photo-instagram"><FaInstagram className="Fainstagram" />Instagram</h3></a> </div> </div> )} </div> jsonには、下記の3点の情報が書き込まれております。 { key: 1, photo: Photo1001, link: "http://Instagram.com/....個人情報の為....", }, 特に手段等は選びません。(配列等の固定なども特に考えていません。)
guest

回答1

0

ベストアンサー

こんな感じでいかがでしょうか。

js

1import React, { useState } from 'react'; 2import { FaHeart, FaInstagram } from 'react-icons/fa'; 3 4// 画像は http://aws.random.cat/ よりお借りしました。 5const filteredInfo1000 = [ 6 { 7 key: 1, 8 photo: 'https://purr.objects-us-east-1.dream.io/i/8O1TS.jpg', 9 link: 'http://aws.random.cat/view/317' 10 }, 11 { 12 key: 2, 13 photo: 'https://purr.objects-us-east-1.dream.io/i/20170831_102918.jpg', 14 link: 'http://aws.random.cat/view/1494' 15 }, 16 { 17 key: 3, 18 photo: 'https://purr.objects-us-east-1.dream.io/i/20161003_163413.jpg', 19 link: 'http://aws.random.cat/view/1246' 20 } 21]; 22 23function App() { 24 // showHeart がよく分からなかったので仮にtrue にしてみました。 25 const showHeart = true; 26 const [showHeartitems, setShowHeartitems] = useState([]); 27 28 // showHeartitems は選択された項目の key の配列です。 29 console.log(showHeartitems); 30 31 // ハートが押された時の処理。 32 const toggleShowHeart = (key) => { 33 // showHeartitems に key が含まれてるかチェックして、 34 if (showHeartitems.includes(key)) { 35 // 含まれていたら key を削除。 36 setShowHeartitems(showHeartitems.filter(item => item !== key)); 37 } else { 38 // 含まれてなければ key を追加。 39 setShowHeartitems([...showHeartitems, key]); 40 } 41 }; 42 43 return ( 44 <div id="second"> 45 {filteredInfo1000.map((photo, index) => 46 <div key={photo.key} className="photo-box"> 47 <img src={photo.photo} className="photo-items" /> 48 <div className="flex-bottom"> 49 <div className="heat-box"> 50 <div className="heart-back" id="heart-back" onClick={() => toggleShowHeart(photo.key)} style={{backgroundColor: showHeart ? "#E0306C" : ""}}> 51 {/* 本体 */} 52 <FaHeart className="faheart" id="faheart" onClick={() => toggleShowHeart(photo.key)} style={{color: showHeartitems.includes(photo.key) ? "white" : "#E0306C"}}/> 53 </div> 54 </div> 55 <a href={photo.link}><h3 className="photo-instagram"><FaInstagram className="Fainstagram" />Instagram</h3></a> 56 </div> 57 </div> 58 )} 59 </div> 60 ); 61} 62 63export default App;

投稿2021/02/09 03:05

編集2021/02/09 03:11
hoshi-takanori

総合スコア7899

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

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

Ajay

2021/02/09 03:58

hoshi-takanori様 機能するようになりました! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問