Я вижу здесь несколько вещей, на которые вам стоит взглянуть, и, надеюсь, они помогут вам решить вашу проблему.
Прежде всего, обратите внимание, что ваша функция deletePost
ожидает параметр с идентификатором записи. Однако в коде JSX, который вы разместили для своей кнопки, вы вообще не передаете значение функции. Это означает, что свойство payload
будет иметь значение undefined
к моменту отправки действия.
Убедитесь, что вы обновили свое представление, чтобы передать ему идентификатор, поэтому вы вызываете правильную конечную точку (ваш DELETE
запрос, вероятно, указывает на https://jsonplaceholder.typicode.com/posts/undefined
прямо сейчас), и редуктор фактически получает идентификатор сообщения, которое вы хотите удалить:
<button key={post.id} onClick={()=>this.props.deletePost(post.id)}>X</button>
Второе, что вы должны проверить, - это реализация вашего редуктора , Из того, что я понял в вашем сообщении и коде для метода deletePost
, action.payload
должен содержать число.
В таком случае то, как ваш редуктор обрабатывает действие DELETE_POST
в редукторе, не имеет для меня особого смысла.
case DELETE_POST:
return {
...state,
items: action.payload
};
Предполагается, что редукторы - это чистые функции, которые для данного состояния и действия возвращают совершенно новое состояние на основе полученного действия. Помните также, что состояние, которое вы получаете, не может быть изменено вообще: если оригинальный экземпляр каким-либо образом видоизменяется, ваш код не будет работать.
В этом случае вам необходимо вернуть новое состояние, в котором ваше свойство items
заменяется новым списком, в котором отсутствует идентификатор, который вы хотите удалить. Однако в фрагменте кода, который вы написали, вы заменяете массив items
числом . Это не то, что должно было произойти, начиная с того факта, что items
все еще должен быть массивом чисел.
На самом деле вам нужно создать новый массив, в котором нет элемента, который вы хотите удалить . Для этого вы можете использовать метод filter
:
case DELETE_POST:
return {
...state,
items: state.items.filter(item => item !== action.payload)
};
Этот код должен делать именно то, что вы хотите: здесь мы присваиваем свойство items
в вашем штате полностью новый массив, где удаленный пост не включен.
filter
возвращает массив с элементами, для которых указанная функция возвращает true
. В этом случае функция стрелки, которую мы передаем filter
, возвращает true
для каждого элемента, который отличается от идентификатора записи, которую вы хотите удалить.
При использовании этого метода у вас также не будет проблемы с каким-либо видоизменением исходного значения state.items
, так как filter
возвращает новый экземпляр Array
и не изменяет оригинал.