简体   繁体   English

如何更改 reactjs 中映射数组中唯一一项的图标?

[英]How to change the icon of only one particular item of mapped array in reactjs?

I was creating the functionality of pinning and unpinning of particular note, so when the user clicks the thumbtack icon I want that icon of only that particular note changes to a cross icon but when I am clicking on the second notes to pin it then the icon that changed on previous pinned note gets restored to its original form.我正在创建特定笔记的固定和取消固定功能,因此当用户单击图钉图标时,我希望仅该特定笔记的图标更改为十字图标,但是当我单击第二个笔记将其固定时,图标在先前固定的笔记上发生更改的内容将恢复为其原始形式。

I have created the pinning functionality using onPin function but struggling with changing the icon of that particular pinned item.我已经使用 onPin function 创建了固定功能,但在更改该特定固定项目的图标时遇到了困难。

I want to add icons to pinned items in such a way that previously added close icons stay in their place and do not get updated.我想以这样一种方式将图标添加到固定项目,即以前添加的关闭图标保留在它们的位置并且不会更新。

What I tried?我试过什么?

So i created the state variable iconId which is an array so whenever the user clicks pinned icon then new id will be pushed to the iconId array and while displaying the output I put the condition that if the current id is included in iconId array then change icon of all those respective ids in iconId to cross icon, apparently this functionality dint work.所以我创建了 state 变量 iconId ,它是一个数组,所以每当用户单击固定图标时,新的 id 就会被推送到 iconId 数组,并且在显示 output 时,我设置了条件,如果当前 id 包含在 iconId 数组中,则更改图标在 iconId 中的所有这些各自的 id 中,交叉图标,显然这个功能可以工作。

-----------------------App.js-------------------------------- ------------------------------------App.js------------------------ --------

   import React, { useState } from "react";
import './App.css';
import Input from './Components/Input';
import Navbar from './Components/Navbar';
import Notesview from './Components/Notesview';
import Notesdata from "./Data/Notesdata";

function App() {

  const [data, setData] = useState(Notesdata);
  // const [pin, setpin] = useState(true)
  const [iconId, seticonId] = useState([])

  function handleDelete(id) {

    let newData = data.filter((item) => item.id !== id)
    setData(newData)
    console.log(newData)
    console.log(Notesdata)
    console.log(0)
  }

  function handlePost(value) {
    //  Notesdata.push(value)
    // setData(Notesdata)
    // // console.log(typeof data)
    // console.log(Notesdata)
    setData([...data, value]);
  }

  
  function onPin(id) {
    let index = data.map((item) => {
      return item.id
    }).indexOf(id)

    let arr1 = data.slice(0, index).concat(data.slice(index + 1))
    arr1.unshift(data[index])
    setData(arr1);

  

    seticonId([...iconId] , id)

  console.log(iconId)
  }

  function handleclose() {
    // setpin(!pin)
    // seticonId("")
  }

  return (
    <div className="App">
      <header className="App-header">
        <Navbar />
        <Input data={data} handlePost={(value) => handlePost(value)} />
        <Notesview handleDelete={handleDelete} Data={data} onPin={onPin} iconId={iconId} handleclose={handleclose} />
      </header>
    </div>
  );
}

export default App;

----------------Noteview function(mapping function)--------------- ----------------Noteview功能(映射功能)----------------

import React from 'react'
import Notescard from './Notescard'
import "../Styles/Notes.css"
// import { useState } from 'react'



const Notesview = ({ Data, handleDelete, onPin , iconId, handleclose}) => {

  return (
    <>
      <div className='notes'>
        {Data && Data.map((item) => {
            return <Notescard item={item} handleDelete={handleDelete} onPin={onPin} iconId={iconId} key={item.id} handleclose={handleclose}/>
          })
        }
      </div>
    </>
  )
}

export default Notesview

-----------------------------Notescard component------------------ ------------------------------记事卡组件------

import React from "react";
import "../Styles/Notescard.css";
import { FaThumbtack, FaTrashAlt, FaPencilAlt ,FaTimesCircle} from "react-icons/fa";
// import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'



const Notescard = ({ item , handleDelete,onPin,iconId,handleclose, key}) => {


  
  return (
    <>
      <div className="box">
        <div className="content">
          <h2 className="item1">{item.title}</h2>
          <h4 className="item1"> {item.tagline}</h4>
          <p className="item2">{item.description}</p>
        </div>

        <div className="icons">

        {iconId.includes(item.id) ? <FaTimesCircle onClick={handleclose}/> : <FaThumbtack id={item.id} onClick={() => onPin(item.id)}/> }


          <FaTrashAlt onClick={() => handleDelete(item.id)}/> 

          
          <FaPencilAlt />
        </div>
      </div>
    </>
  );
};

export default Notescard;

Issue问题

You are passing two arguments to the seticonId state updater function.您将两个 arguments 传递给seticonId state 更新程序 function。

seticonId([...iconId], id)

The id is never added to the iconId state. id永远不会添加到iconId state 中。

Solution解决方案

Use a functional state update to append the id to the array.使用功能 state 更新到 append 数组的id

seticonId((iconId) => iconId.concat(id));

Code:代码:

const Notescard = ({ item, handleDelete, onPin, iconId, handleclose }) => {
  return (
    <div className="box">
      <div className="content">
        <h2 className="item1">{item.title}</h2>
        <h4 className="item1"> {item.tagline}</h4>
        <p className="item2">{item.description}</p>
      </div>

      <div className="icons">
        {iconId.includes(item.id) ? (
          <FaTimesCircle onClick={() => handleclose(item.id)} />
        ) : (
          <FaThumbtack id={item.id} onClick={() => onPin(item.id)} />
        )}

        <FaTrashAlt onClick={() => handleDelete(item.id)} />

        <FaPencilAlt />
      </div>
    </div>
  );
};

... ...

const Notesview = ({ Data, handleDelete, onPin, iconId, handleclose }) => {
  return (
    <div className="notes">
      {Data.map((item) => {
        return (
          <Notescard
            item={item}
            handleDelete={handleDelete}
            onPin={onPin}
            iconId={iconId}
            key={item.id}
            handleclose={handleclose}
          />
        );
      })}
    </div>
  );
};

... ...

export default function App() {
  const [data, setData] = useState(Notesdata);
  const [iconId, seticonId] = useState([]);

  function handleDelete(id) {
    let newData = data.filter((item) => item.id !== id);
    setData(newData);
    console.log(newData);
    console.log(Notesdata);
    console.log(0);
  }

  function handlePost(value) {
    setData([...data, value]);
  }

  function onPin(id) {
    setData((data) => {
      const index = data.findIndex((item) => item.id === id);

      const arr1 = data.slice(0, index).concat(data.slice(index + 1));
      arr1.unshift(data[index]);
      return arr1;
    });

    seticonId((iconId) => iconId.concat(id));
  }

  function handleclose(id) {
    setData((data) => {
      const index = data.findIndex((item) => item.id === id);
      const insertIndex = data.findIndex((item) => !iconId.includes(item.id));

      const arr1 = data.slice(0, index).concat(data.slice(index + 1));
      arr1.splice(insertIndex - 1, 0, data[index]);
      return arr1;
    });

    seticonId((iconId) => iconId.filter((elId) => elId !== id));
  }

  return (
    <div className="App">
      <Input data={data} handlePost={(value) => handlePost(value)} />
      <Notesview
        handleDelete={handleDelete}
        Data={data}
        onPin={onPin}
        iconId={iconId}
        handleclose={handleclose}
      />
    </div>
  );
}

编辑如何更改仅一个特定项目的映射数组在reactjs中的图标

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM