#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
: это анти-шаблон.
Комментарии:
1. ну, массив не имеет никакого реального значения, даже идентификатор ничего не значит, моя идея состояла в том, чтобы просто дать 1 всему, потому что количество ВСЕГДА будет начинаться с 1, а затем изменить его индивидуально, выполнив функцию плюс/минус (что, я уверен, что, прочитав это, не кажется хорошей практикой).