反应数组映射,点击时切换所有下拉菜单,我只想打开被点击卡片的下拉菜单

Tay*_*man 1 ecmascript-6 reactjs

文字报价卡

    import React, {useRef, useState} from 'react'
    import {Link} from "react-router-dom";

    import {QuoteCardDropdown} from "../../utils/dropdowns";
    
    export const TextQuoteCard = () => {
    
        const [open, setOpen] = useState(false)
        const toggle = () => setOpen(!open)
        const [textQuote, setTextQuote] = useState([
        
            {
                userId: '123',
                userName: 'Tr',
                userImageUrl: 'https://qph.fs.quoracdn.net/main-thumb-892821828-200-lrcgeycqieflgsovvoxglqawinbcjhtv.jpeg',
                quoteId: 'TQ122',
                postDateTime: 'Fri',
                quoteAuthorId: '123',
                quoteAuthorName: 'Jhon Mart',
                quoteCategory: 'Motivational',
                quoteType: 'textQuote',
                quoteText: 'If there’s no market, about finding market opportunities, or creating opportunities. If there’s no market, then you need to grow one',
                quoteImageUrl: 'https://qph.',
                bookmarkStatus: 2,
                likesCount: 3300,
                commentsCount: 123,
                overallShareCount: 1203,
                fbShareCount: 423,
                twtShareCount: 1232,
                waShareCount: 1023,
                viewCount: 1923
            },
            {
                userId: '124',
                userName: 'nr',
                userImageUrl: 'https://qph.fi.jpeg',
                quoteId: 'TQ123',
                postDateTime: 'Fri',
                quoteAuthorId: '123',
                quoteAuthorName: 'Wall Mart',
                quoteCategory: 'Motivational',
                quoteType: 'textQuote',
                quoteText: 'Best thing to do. ',
                quoteImageUrl: '',
                bookmarkStatus: 1,
                likesCount: 3300,
                commentsCount: 123,
                overallShareCount: 1203,
                fbShareCount: 423,
                twtShareCount: 1232,
                waShareCount: 1023,
                viewCount: 1923
            }
            ])
        const handleBookmark = (event) => {
            console.log(event)
        }
        const idGetter = (id) =>{
            console.log(id)
        }
        const test = Object.keys(textQuote).map(item => item)
        console.log(test)
    
        return(
            <div>
                {
                    textQuote.map((quote) => (
                        <div className="QuoteCardPrimaryContainer" key={quote.quoteId}>
                          <div>{quote.userName}</div>
                           <div className="ddContainer">
                             <span className="QuoteCardEngagementActionButtonIconContainer">
                              <span className="QuoteCardEngagementActionButtonIcon"
                                onClick={() => toggle(!open)}
                               >
                                options
                              </span>
                             </span>                                                                           
                            {open && <QuoteCardDropdown targetLink={quote.quoteId}/>}
                           </div>
                          </div>
    
                    ))
                }
            </div>
        )
    }
Run Code Online (Sandbox Code Playgroud)

**

QuoteCardDropdown.js

import React, {useState} from 'react'
import {Link} from "react-router-dom";

import '../../global/assets/css/dropdowns.css'

export const QuoteCardDropdown = (props) => {
    const [ddItems, SetDdItems] = useState([
        {
            ddOptionIcon: 'icon',
            ddOptionText: 'Share',
            ddOptionTip: 'Tip text goes here',
            ddOptionBorder: 'no',
            targetId: props.targetId,
            targetLink: props.targetLink
        },
        {
            ddOptionIcon: 'icon',
            ddOptionText: 'Bookmark',
            ddOptionTip: 'Tip text goes here',
            ddOptionBorder: 'no',
            targetId: props.targetId,
            targetLink: props.targetLink
        }
    ])
    return (
        <div>
            <div className="quoteCardDropdownPrimaryContainer">
            
                            <div className="quoteCardDropdownPrimaryBody">
                                <div className="quoteCardDropdownPrimaryBodyInner">
                                    {
                                        ddItems.map(item => (
                                            <Link to=
                                                      {
                                                          item.ddOptionText === 'Edit this Quote' ?
                                                              `${'edit/' + props.targetLink}` :
                                                          item.ddOptionText === 'Share' ?
                                                              `${'share/' + props.targetLink}` : ''
                                                      }
                                            >
                                                <div className="quoteCardDropdownContentWrapper">
                                                    <div className="quoteCardDropdownContentItem">
                                                        <div className="quoteCardDropdownItem" key={item.ddOptionText}>
                                                            {item.ddOptionText}
                                                        </div>
                                                    </div>
                                                </div>
                                            </Link>
                                        ))
                                    }
                                </div>
                            </div>
                        </div>
                        <div className="quoteCardPointer" data-placement='top'> </div>
          
        </div>

    )

}
Run Code Online (Sandbox Code Playgroud)

我有映射到的对象数组,这些对象在页面/提要上显示了多张卡片。每张卡片都有一个下拉菜单,用户可以对点击的卡片执行多项操作。想想 FB 提要或任何其他社交媒体提要卡,用户可以单击以打开下拉列表并为卡选择选项。我正在尝试实现类似的功能,但问题是当我单击按钮打开下拉菜单时,它会切换所有卡片的所有下拉菜单,而不是打开单击的卡片的下拉菜单。

预期行为:仅打开被点击卡片的下拉菜单。

Mor*_*hai 5

更改open以获取 id:

const [open, setOpen] = useState() // undefined is nothing open
const toggle = id => setOpen(open === id ? undefined : id) // close if currently open

// the JSX

return(
  <div>
  {textQuote.map((quote) => (
        <div className="QuoteCardPrimaryContainer" key={quote.quoteId}>
          <div>{quote.userName}</div>
          <div className="ddContainer">
            <span className="QuoteCardEngagementActionButtonIconContainer">
              <span className="QuoteCardEngagementActionButtonIcon"
                onClick={() => toggle(quote.quoteId)}>
                options
                </span>
              </span>                                                                           
              {open === quote.quoteId && <QuoteCardDropdown targetLink={quote.quoteId}/>}
            </div>
          </div>
        ))}
  </div>
)

Run Code Online (Sandbox Code Playgroud)