Как удалить объект в массиве?

Я использовал 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/

вы также не должны мутировать подобные реквизиты. Создайте часть состояния, которая содержит ваш измененный массив.

Chase 05.06.2019 17:58

Пожалуйста, опубликуйте свой образец массива и то, что находится в deletedPost.

kiranvj 05.06.2019 18:04

@Chase, почему это неправильный способ изменения данных?

SeN 05.06.2019 18:21

Я добавил в первый пост, вероятно, информацию, которую вы просили. @kiranvj

SeN 05.06.2019 18:24
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
4
171
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

используйте splice() для удаления :), вы можете найти индекс поста, который нужно удалить, а затем удалить его, используя этот метод.

Это может помочь:

componentDidUpdate (prevProps, prevState) {
    if (prevProps.deletedPost) {
        const letang = this.props.posts;
        letang.splice(deletedPost, 1);
    }
}

slice() принимает индекс объекта и необязательное количество элементов для удаления. так как вы просто хотите удалить один объект, который вы передаете 1.

Я пробовал методичную склейку, но она все равно стирает первый элемент из массива, а не выбранный

SeN 05.06.2019 18:08

deletePost это объект или id?

Claeusdev 05.06.2019 18:14

Это может помочь, попробуйте отфильтровать объект, который вам не нужен в массиве.

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

Chukwuemeka Ihedoro 05.06.2019 18:26

но если вы видите РЕДАКТИРОВАТЬ 2, тогда вы понимаете, почему сообщения

SeN 05.06.2019 18:38

@SeN хорошо. теперь я вижу, что вы используете deletedPost2 в своем mapStateToProps. поменяй prevProps.deletedPost.id на prevProps.deletedPost2.id

Chukwuemeka Ihedoro 05.06.2019 18:44

затем я вижу ошибку: «Uncaught TypeError: невозможно прочитать свойство« фильтр »неопределенного в Posts.componentDidUpdate»

SeN 05.06.2019 18:47

в логе консоли вижу изменение в смысле на один пост меньше всегда выбирается, но к сожалению не отображает состояние в отображаемых объектах в приложении. И всегда исчезает один элемент, а не то, что выбранные посты вычитаются один за другим

SeN 05.06.2019 19:06

Давайте продолжить обсуждение в чате.

Chukwuemeka Ihedoro 06.06.2019 19:56
Ответ принят как подходящий

Вам нужно использовать соединение для удаления элемента из массива. В сращивании вам нужно указать 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
        }
    }

Ответы, которые объясняют код, который они вводят, более полезны, чем те, которые не...

Heretic Monkey 05.06.2019 18:34

@kiranvj Ваше предложение приводит к пустой таблице, но ни одно сообщение не удаляется

SeN 05.06.2019 18:37

@Sen console.info(сообщения); // здесь должен быть массив без DeletePost

kiranvj 05.06.2019 18:42

Да у меня есть, и там пустой массив

SeN 05.06.2019 18:43

Но я меняю на const letang = this.props.posts.slice(this.props.posts.findIndex( (post)=> post.id === this.state.postId), 1); затем я вижу первые сообщения в журнале консоли

SeN 05.06.2019 18:46

@kiranvj, когда я нажимаю дважды, затем удаляю сообщение в массиве, но я изменил в конце для вашего кода this.state.postId, потому что я беру идентификатор из функции handleDeleted, я добавляю это в РЕДАКТИРОВАТЬ 3

SeN 05.06.2019 18:58

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