Как сохранить и удалить значение в useState с помощью onClick в React?

#reactjs

#reactjs

Вопрос:

Как выбрать и отменить выбор div, который генерируется с помощью функции map.

Как я могу сохранить индекс и его значение при нажатии на div и в то же время, когда я отменяю выбор этого div, удалить этот индекс div и значение из переменной useState work

Я пытался сделать таким образом

 const data = [
  {
    Key: 1,
    value: "four"
  },
  {
    Key: 2,
    value: "fours"
  },
]



export default function App() {

  const [work , setWork] = React.useState()

  const handleSelect = (value , idx) => {
    setWork(prev => {
      const index = prev.findIndex(item => item.key === idx);
      if(index< 0) return [...prev, { idx, value}];
    })
  }

  return (

    <div className="App">
      <h1>Hello CodeSandbox</h1>
      {
        data.map((da , idx) => (
          <div onClick = {handleSelect(da.value , idx)} >{da.value}</div>
        ))
      }
      
    </div>
  );
}
  

Ответ №1:

Вместо того, чтобы удалять его, вы должны просто создать selected состояние для каждого элемента и переключать это значение в зависимости от того, был ли div нажат или нет.

 const data = [
  {
    key: 1,
    value: "four"
  },
  {
    key: 2,
    value: "fours"
  }
];

export default function App() {
  const [items, setItems] = React.useState(
    data.map((item) => {
      return { ...item, selected: false };
    })
  );
  const [work, setWork] = React.useState([]);

  const handleSelect = (value) => {
    const nextItems = items.map((item) => {
      if (item.value === value) {
        return {
          ...item,
          selected: !item.selected
        };
      }
      return item;
    });
    const nextWork = nextItems
      .filter((item) => item.selected)
      .map((item) => item.value);

    setWork(nextWork);
    setItems(nextItems);
  };
  return (
    <div className="App">
      {items.map((da) => (
        <div key={da.key} onClick={() => handleSelect(da.value)}>
          {da.value}
        </div>
      ))}
      <p>Items: {JSON.stringify(items)}</p>
      <p>Selected: {JSON.stringify(work)}</p>
    </div>
  );
}
  

Вот пример:

Комментарии:

1. Спасибо, но как я могу отфильтровать только форму значения work и сохранить в переменную, где выбрано значение true

2. @Akhi21 не уверен, что ты имеешь в виду. Для чего вам нужна эта переменная?

3. @Akhi21 смотрите мою правку. Если я правильно понимаю, текущее решение — это то, что вы хотите.

4. Извините, это был мой плохой @goto

Ответ №2:

Используйте событие click, чтобы получить элемент, на который нажат. Также вы можете хранить любые детали внутри элемента в качестве пользовательского атрибута. Тогда может быть очень полезно использовать атрибуты данных, которые доступны в element.dataset.

 const data = [
  {
    Key: 1,
    value: "four"
  },
  {
    Key: 2,
    value: "fours"
  },
]

function App() {
  const [work , setWork] = React.useState()
  // *e* stands for event here, e.target is an clicked element itself. Now you can use it to pick up the element by and its properties: 
  const handleSelect = e => {
    console.log(e.target.dataset.key) 
    // dataset.key is available thanks to data-key attribute of the element
    // this way you can get any of needed data from element and then use it to set new work state
  }

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      {
        data.map((da , idx) => (
          <div onClick = {handleSelect} data-key={da.Key} >{da.value}</div>
        ))
      }
      
    </div>
  );
}