Home > Net >  How do I pass data when the x button is clicked?
How do I pass data when the x button is clicked?

Time:01-18

So I have a filter chip, and this filter chip is just passed a text body, and close function like so:

import CloseIcon from '@mui/icons-material/Close';
import "./FilterChip.css";

function FilterChip({textBody, onCloseClick}) {

    return <div className="filter-chip">
        Category: {textBody} <CloseIcon onClick={onCloseClick} className="filter-chip-close-button"/>
    </div>
}

export default FilterChip;

I can render multiple filter chips in one page. How can I tell my parent component that the particular chip's x button has been clicked? Is it possible to pass this data on the onCloseClick function? I need to remove the chip once it's x button has been clicked, and I also need to uncheck it from my list of check boxes in my parent component. This is how I render the chips.

function renderFilterChips() {
        const checkedBoxes = getCheckedBoxes();

        return checkedBoxes.map((checkedBox) => 
            <FilterChip key={checkedBox} textBody={checkedBox} onCloseClick={onChipCloseClick} />
        );
    }

CodePudding user response:

You should pass an "identifier" for each chip and then use that identifier to find out "what" was clicked by the user. And then you can filter out the clicked chip.

function FilterChip({ textBody, onCloseClick, id }) {
  const handleOnClose = (event) => {
    onCloseClick(event, id);
  };
  return (
    <div className="filter-chip">
      Category: {textBody}{" "}
      <CloseIcon onClick={handleOnClose} className="filter-chip-close-button" />
    </div>
  );
}

Now your onCloseClick should accept a new param id and handle the logic to remove the chip .

Hope it helps.

CodePudding user response:

Sounds like you need checkedBoxes to be in state.

import { useState } from "react"

const initialBoxes = getCheckedBoxes()

function renderFilteredChips() {
   const [ checkedBoxes, setCheckedBoxes ] = useState(initialBoxes)
}

Then implement a function to remove a checked box by its index (or if you have a unique key identifier that would be even better)

const onChipCloseClick = (indexToRemove) => {
   setCheckedBoxes(state => state.filter((_, chipIndex) => chipIndex !== indexToRemove))
}

Then when you map over the chips, make sure the function that closes the chip has its index, effectively allowing each chip in state to filter itself out of state, which will re-render your chips for you.

import { useState } from "react"

const initialBoxes = getCheckedBoxes()

function renderFilteredChips() {
   const [ checkedBoxes, setCheckedBoxes ] = useState(initialBoxes)

const onChipCloseClick = (indexToRemove) => {
   setCheckedBoxes(state => state.filter((_, chipIndex) => chipIndex !== indexToRemove))
 }

return <>
   {checkedBoxes.map((checkedBox, index) => (
     <FilterChip 
        key={index} 
        textBody={checkedBox} 
        onCloseClick={() => onChipCloseClose(index)} 
     />
    })
  </>
}

Obligatory note that I haven't checked this and wrote it in Markdown, so look out for syntax errors (:

  • Related