Как правильно проверить текущий индекс массива на карте React?

#arrays #reactjs #array.prototype.map

Вопрос:

Я пытаюсь увеличить значение массива определенной позиции. Допустим, у вас есть массив:

 const [cantidad, setCantidad] = useState([
   {cantidadID: 1, value: 1},
   {cantidadID: 2, value: 1},
   {cantidadID: 3, value: 1}
]);
 

Теперь я хотел бы изменить значение ТОЛЬКО одного из них (неважно, какого) с помощью кнопки

 const plus = (e) => {
   setCantidad(cantidad[e]   1);
};

const minus = (e) => {
   if (cantidad[e] > 0){
      setCantidad(cantidad[e] - 1);

   } else {
      window.alert("Sorry, Zero limit reached");
      setCantidad(0);
   }
};
 

e будучи индексом массива (с некоторым интеллектуальным кодированием ofc), отправляемым из таблицы примерно так

 {libros.map((l) => (                   
   <tr>
      <td>
         <button onClick={mas} />
         {cantidad}
         <button onClick={menos} />
      </td>

      <td>{l.grado}</td>

      <td>
         <input
            onChange={(event) => {
               let checked = event.target.checked;
            }} 
            type="checkbox"
            checked=""
         >
         </input>
         {l.descripcion}
      </td>

      <td>{l.editorial}</td>
      <td>${parseFloat(l.precio).toFixed(2) * cantidad}</td>
   </tr>
))}

// I know the checkbox is not working. I'm still working through that.
 

Теперь в моей голове имеет смысл, что при отображении должна быть переменная, управляющая индексом cantidad переменной, но если я попытаюсь создать новую переменную внутри карты, она сойдет с ума и выйдет из строя (если только я не сформирую ее неправильно или не помещу в неправильное место).

Итак, я понял, что логика очень проста, но я не знаю, как ее применить, это было бы что-то вроде: если у вас есть переменная X [], в то время как отображение делает переменную Y, которая управляет идентификатором переменной массива, и если вы хотите изменить значение определенного значения из X [], то вы должны отправить переменную X[Y] на кнопку const плюс и минус, а затем изменить только эту переменную из этого конкретного идентификатора.

В моем полном коде я не использую 3 значения, кстати, значения равны объему данных, которые выводятся с карты

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

Это фактический код, над которым я работаю, и хотя на первый вопрос был дан ответ, у меня все еще возникают проблемы со следующей частью (только соответствующей частью).

 const [amount, setAmount] = useState([1]);

//I know this bit doesn't make sense (Yet) I'm trying to figure out first the first bit
const plus = (index) => {
        setAmount(amount[index]   1);
      };

      const menos = (index) => {
        if (amount[index] > 0){
            setAmount(amount[index] - 1);
        }
        else {
            window.alert("Sorry, Zero limit reached");
            setAmount(0);
        }
      };

{books.map((l, index) => (
                        
                        <tr >
                        
                        <td>
                            <button onClick = {() => plus(index)}/>
                            {amount[index]}
                            <button onClick = {() => minus(index)}/>
                        </td>
                        <td>{l.grado}</td>

                        <td >
                        <input onChange = {(event) => {
                            let checked = event.target.checked;
                        }} 
                        
                        type="checkbox" checked = "">
                        </input>
                        {l.descripcion}
                        </td>

                        <td >{l.editorial}</td>
                        <td >${parseFloat(l.precio).toFixed(2) * amount[index]}</td>
                        </tr>

                     ))}

 

и вот как происходит печать
введите описание изображения здесь

Я знаю, что в Javascript вы можете использовать массив(5).заполните(2) есть что-то похожее на это? как я хотел бы сделать массив(карта.длина).например, заполните(1), чтобы значение всегда начиналось с 1, а затем все, что мне нужно сделать, это поиграть с индексом, чтобы изменить правильный с плюсом и минусом.

Ответ №1:

Это второй аргумент .map функции, поэтому:

 libros.map((l, idx)
 

где idx твой i

Вот документация об этом

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

1. О, ну что ж, теперь я чувствую себя клоуном. Быстрый вопрос, как мне отправить идентификатор через кнопки, хотя, потому что да, теперь у меня есть идентификатор, но как я отправляю его на кнопку, чтобы он менялся, только этот идентификатор <button onClick = {plus, id}/> не работал, хотя я бы отправил идентификатор в качестве аргумента для const plus функции

2. @ReactPotato это должно быть onClick = {() => plus(id)} так: нажмите, чтобы вы выполняли функцию plus с идентификатором в качестве аргумента

3. @ReactPotato просто чтобы прояснить ситуацию, это индекс , а не идентификатор .

4. правильный индекс да, причина в позиции, а не в идентификаторе, есть ли способ сделать так, чтобы все значения начинались с 1 ? потому что, если я заявлю, что в начале только первый начинается с 1, если я, например, сделаю это: {cantidad[1, index]} все они остаются пустыми

5. @ReactPotato Я думаю, вам следует потратить время на чтение документации по массивам и карте .

Ответ №2:

Вы устанавливаете объект в массиве на основе index значения, а не фактического id . Настоятельно рекомендуется включить идентификатор в каждый объект, а затем захватить объект по идентификатору, чтобы управлять им. В противном случае вы можете столкнуться с ошибками и неожиданным поведением при работе с массивом.

Та же концепция, что и не использовать индекс массива при использовании map : это анти-шаблон.

https://reactjs.org/docs/lists-and-keys.html

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

1. ну, массив не имеет никакого реального значения, даже идентификатор ничего не значит, моя идея состояла в том, чтобы просто дать 1 всему, потому что количество ВСЕГДА будет начинаться с 1, а затем изменить его индивидуально, выполнив функцию плюс/минус (что, я уверен, что, прочитав это, не кажется хорошей практикой).