Почему метод splice удаляет только первый индекс массива в React?

Я делаю небольшое приложение в React с PokeAPI, и у меня возникают проблемы с использованием метода splice() для удаления элемента (покемона) из массива (команды). Независимо от того, какой элемент я выбираю для удаления, он удаляет только первый элемент в массиве.

Это функция, которая передается через реквизит, которую я использую для удаления элемента.

removePokemon = (index) => {
  const team = [...this.state.team]
   team.splice(index, 1)
   this.setState({team})
  }

А вот компонент Team, где он на самом деле используется.

import React, { Component } from 'react';
import Button from 'react-bootstrap/Button'


class Team extends Component {
    render() {
        return (
            <div>
                <h2>{this.props.trainer && <p>{this.props.trainer}'s Team</p>}</h2>
                {this.props.team &&
                <div>
                    {this.props.team.map((pokemon, i) => (
                        <div key = {pokemon.id}>
                            <span className='cardHeader'>#{pokemon.id} - {pokemon.name}</span>
                            <img src = {pokemon.sprites.front_default} alt = {pokemon.name}/>
                            <Button onClick = {this.props.removePokemon}>Remove from team</Button>
                        </div>
                    ))}
                </div>
                }

            </div>
        );
    }
}

export default Team;
onClick = {this.props.removePokemon} vs function removePokemon (index) { ... } - Чего не хватает с левой стороны?
Andreas 28.05.2019 17:22

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

Liam MacDonald 28.05.2019 17:22

Если вы новичок в React, взгляните на отладку, но поскольку это небольшая проблема, вы можете просто сделать console.info(index) в removePokemon.

sebamed 28.05.2019 17:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
453
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не передаете аргумент index своей функции removePokemon:

Вам нужно отредактировать одну строку:

<Button onClick = {() => this.props.removePokemon(i)}>Remove from team</Button>

Поскольку вы не передали index в качестве аргумента onClick = {this.props.removePokemon}.

index внутри removePokemon метод ссылается на объект события. Итак, код

team.splice(index, 1) оценивается как team.splice(eventObject, 1).

Вот почему splice удаляет первый элемент массива.

Вы можете изменить на onClick = {() => this.props.removePokemon(i)}, чтобы удалить нужный элемент.

index будет не undefined, а объект события
Andreas 28.05.2019 17:33

Другие вопросы по теме