Я использовал componentDidUpdate и в нем я поставил метод сдвига, который используется для удаления объекта из массива JSON и тем самым перерендеринга отображаемых постов, но метод сдвига самостоятельно удаляет первый объект из массива, в котором кнопка удаления на пост я нажму? Есть ли тогда какая-либо возможность обойти удаление первого элемента в пользу того, который предназначен для удаления?
componentDidUpdate(prevProps, prevState) {
const {posts} = this.props;
const indexPosts = posts.findIndex((post) => post.id === this.state.postId);
if (prevProps.posts !== posts){
this.handleData();
} else if (indexPosts !== -1)
{
this.informationAlert();
const log = posts.splice(indexPosts, 1);
console.info(log);
}
}
Обновлено: Действия
export const deletedPost = (id) => (dispatch) => {
axios
.delete(`https://jsonplaceholder.typicode.com/posts/${id}`, id, {
headers: {
'Content-type': 'application/json'
}
})
.then((post) =>
dispatch({
type: DELETED_POST,
payload: post.data
})
)
.catch((err) => console.info(err));
};
import { FETCH_POSTS, NEW_POST, DELETED_POST, FETCH_COMMENTS, NEW_COMMENT } from '../actions/types';
const initialState = {
items: [],
item: {},
itemComent: [],
itemNewComment: {},
deletedPost: []
};
export default function (state = initialState, action) {
switch (action.type) {
case FETCH_POSTS:
return {
...state,
items: action.payload
};
case NEW_POST:
return {
...state,
item: action.payload
};
case DELETED_POST:
return {
...state,
deletedPost: action.payload
};
case FETCH_COMMENTS:
return {
...state,
itemComent: action.payload
}
case NEW_COMMENT:
return {
...state,
itemNewComment: action.payload
}
default:
return state;
}
}
Обновлено еще раз:
const mapStateToProps = (state) => ({
posts: state.posts.items,
newPost: state.posts.item,
deletedPost2: state.posts.deletedPost
});
РЕДАКТИРОВАТЬ 3:
handleDeletedPost = (id) => {
this.setState({
postId: id
})
}
Редактировать 4:
//I added in constructor
this.state: dataPost: '',
//next I create function to load data and send to state dataPost
handleData = (e) => {
const {posts} = this.props;
const {dataPost} = this.state;
const letang = posts;
const postsData = dataPost;
if (postsData.length <= 0) {
this.setState({
dataPost: letang
})
} else {
console.info('stop')
}
}
// next i create in componentDidUpdate this code
componentDidUpdate(prevProps, prevState) {
const {posts} = this.props;
const indexPosts = posts.findIndex((post) => post.id === this.state.postId);
if (prevProps.posts !== posts){
this.handleData();
} else if (indexPosts !== -1)
{
this.informationAlert();
const log = posts.splice(indexPosts, 1);
console.info(log);
}
}
** Когда я добавил цикл if (indexPosts !== -1), то мой массив обрезается только одним объектом :-) Сообщения API: https://jsonplaceholder.typicode.com/posts/
Результаты видны по этой ссылке, когда вы нажимаете детали, а затем значок удаления: https://scherlock90.github.io/api-post-task/
Пожалуйста, опубликуйте свой образец массива и то, что находится в deletedPost.
@Chase, почему это неправильный способ изменения данных?
Я добавил в первый пост, вероятно, информацию, которую вы просили. @kiranvj

используйте splice() для удаления :), вы можете найти индекс поста, который нужно удалить, а затем удалить его, используя этот метод.
Это может помочь:
componentDidUpdate (prevProps, prevState) {
if (prevProps.deletedPost) {
const letang = this.props.posts;
letang.splice(deletedPost, 1);
}
}
slice() принимает индекс объекта и необязательное количество элементов для удаления. так как вы просто хотите удалить один объект, который вы передаете 1.
Я пробовал методичную склейку, но она все равно стирает первый элемент из массива, а не выбранный
deletePost это объект или id?
Это может помочь, попробуйте отфильтровать объект, который вам не нужен в массиве.
componentDidUpdate (prevProps, prevState) {
if (prevProps.deletedPost) {
const letang = this.props.items.filter(p => p.id !== prevProps.deletedPost.id);
}
}
ОБНОВЛЕНО Я думаю, вам следует удалять элементы в вашем хранилище избыточности, а не пытаться удалить сообщения из вашего API, поскольку API может скорее генерировать одни и те же данные случайным образом. Измените свой actionCreator на
export const deletedPost = (id) => {
dispatch({
type: DELETED_POST,
payload: id
});
};
Затем используйте это в своем редукторе, чтобы вы могли сосредоточиться на массиве элементов, поступающем из вашего магазина редукторов. Затем удалите deletedPost: [] из вашего редуктора.
...
case DELETED_POST:
const newItems = state.items.filter(p => p.id !== action.payload);
return {
...state,
items: [ ...newItems ],
};
...
@SeN из вашего редуктора, вы используете элементы вместо сообщений, попробуйте заменить this.props.posts.filter на this.props.items.filter
но если вы видите РЕДАКТИРОВАТЬ 2, тогда вы понимаете, почему сообщения
@SeN хорошо. теперь я вижу, что вы используете deletedPost2 в своем mapStateToProps. поменяй prevProps.deletedPost.id на prevProps.deletedPost2.id
затем я вижу ошибку: «Uncaught TypeError: невозможно прочитать свойство« фильтр »неопределенного в Posts.componentDidUpdate»
в логе консоли вижу изменение в смысле на один пост меньше всегда выбирается, но к сожалению не отображает состояние в отображаемых объектах в приложении. И всегда исчезает один элемент, а не то, что выбранные посты вычитаются один за другим
Давайте продолжить обсуждение в чате.
Вам нужно использовать соединение для удаления элемента из массива. В сращивании вам нужно указать startIndex и количество элементов для удаления во втором аргументе. В приведенном ниже коде найдите индекс, используя метод `индекс поиска, второй аргумент равен 1, так как нам нужно удалить только 1 элемент.
Попробуй это
componentDidUpdate (prevProps, prevState) {
if (prevProps.deletedPost) {
const { posts } = this.props
const letang = posts.splice(posts.findIndex( (post)=> post.id === prevProps.deletedPost.id), 1);
console.info(posts); // this should have array without deletedPost
}
}
Ответы, которые объясняют код, который они вводят, более полезны, чем те, которые не...
@kiranvj Ваше предложение приводит к пустой таблице, но ни одно сообщение не удаляется
@Sen console.info(сообщения); // здесь должен быть массив без DeletePost
Да у меня есть, и там пустой массив
Но я меняю на const letang = this.props.posts.slice(this.props.posts.findIndex( (post)=> post.id === this.state.postId), 1); затем я вижу первые сообщения в журнале консоли
@kiranvj, когда я нажимаю дважды, затем удаляю сообщение в массиве, но я изменил в конце для вашего кода this.state.postId, потому что я беру идентификатор из функции handleDeleted, я добавляю это в РЕДАКТИРОВАТЬ 3
вы также не должны мутировать подобные реквизиты. Создайте часть состояния, которая содержит ваш измененный массив.