Вопрос дизайна React о создании функции удаления

#reactjs #design-patterns

#reactjs #шаблоны проектирования

Вопрос:

Это немного затянуто.

Я хотел бы получить совет о том, как создать функциональность кнопки удаления. Я относительно новичок в react и должен был спланировать этот проект до того, как приступил. В любом случае, я сейчас здесь и ищу несколько советов, прежде чем я удалю функциональность завтра.

В этом компоненте я создаю метод под названием «displayFood», в котором я беру массив из props, содержащий строковые значения названий продуктов, которые пользователь хотел добавить в холодильник. Например: [йогурт, молоко, яйцо, простокваша, йогурт]. Затем я создаю объект, который сопоставляет этот массив парам ключ-значение на основе имени и количества, например: {«йогурт»: 3, «молоко»: 1, «яйцо»: 1}. После этого я создаю массив, содержащий то, что я хочу отобразить пользователю, то есть каждый элемент, который они кладут в холодильник, и количество этого элемента. У меня также есть кнопка удаления. Я думал о том, как удалить элементы, но не знаю, как это сделать.

Если, например, пользователь удаляет йогурт, я хочу, чтобы значение уменьшилось на единицу, и если пользователь удаляет элемент с количеством 1, то он должен исчезнуть.

Это довольно конкретный вопрос, спасибо за ваше время.

 import React from 'react';
import "./style.scss";

function InFrige(props) {

  const handleRemove = (e, counts) => {
    console.log(e.target.name)
  }

  const displayFood = () => {
     var counts = {};
    props.foodAddedByUser.forEach(function(x) { counts[x] = (counts[x] || 0)   1; });

    let foodItems = []
    for(var index in Object.entries(counts)){
        foodItems.push(
           <div className="inFrige-food-item" key={index}>
            <h3>{Object.keys(counts)[index]} x{Object.values(counts)[index]}</h3>
             <button onClick={handleRemove} name={Object.keys(counts)[index]}>Remove</button>
           </div>
         )
    }
  return foodItems
  }

  return (
    <div>
      <div className="inFrige-food-container">
          {displayFood()}
      </div>
    </div>
  )
 }

 export default InFrige;
  

Ответ №1:

Ваша проблема в том, что вы пытаетесь изменить свои реквизиты внутри компонента. Вы могли бы либо обработать это внутри компонента с помощью state, либо выполнить обратный вызов через props из родительского компонента и обработать удаление там, что-то вроде этого:

 <button onClick={()=>{this.props.handleRemove(Object.keys(counts)[index])}} name={Object.keys(counts)[index]}>Remove</button>
  

в родительском рендеринге:

 <InFridge handleRemove={(item)=>{foodAddedByUser.delete(item)} foodAddedByUser={foodAddedByUser} />
  

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

1. Спасибо за совет. Я собираюсь сделать это внутри компонента.