Приведенный ниже код не будет работать должным образом:
cars: state.cars.filter(obj => obj !== action.payload)
В JavaScript объекты хранятся в переменных в качестве ссылок. Вызывая действие удаления следующим образом:
deleteCar({
id: id,
make: make,
price: price
})
Каждый раз вы создаете новый объект, чтобы он никогда не совпадал и он не был отфильтрован.
Это появляется как если бы сравнение было бы таким:
{ id: id, make: make, price: price } === { id: id, make: make, price: price }
Но в действительности это сравнивается более примерно так:
// Both objects contain the same values
// But will not evaluate as equal because the references are different
'object_reference_1' === 'object_reference_2'
Вместо этого я бы рекомендовал проверить по id
например:
cars: state.cars.filter(obj => obj.id !== action.payload.id)
Вторая проблема заключается в том, что вы дублировали локальное и избыточное состояние в Cars
.
Вместо использования локального состояния, отправьте действие для заполнения избыточного числа. Это может выглядеть примерно так:
componentDidMount() {
fetch(url)
.then(response => response.json())
// Or preferably create a new action and call it like you did `deleteCar`
.then(data => this.props.dispatch({ type: 'INITIALIZE', cars: data }));
}
Затем в редукторе добавьте этот случай:
switch (action.type) {
case 'INITIALIZE':
return {
...state,
cars: action.payload
};
Убедитесь, что вы удалили локальное состояние для cars
и заменили const { cars } = this.state;
на используйте this.props
.