Notice: Undefined index: in /data/phpspider/phplib/misc.function.php on line 226
Javascript ReactJS:TypeError:无法添加/删除密封数组元素_Javascript_Reactjs_Graphql_Graphql Subscriptions - Fatal编程技术网

Javascript ReactJS:TypeError:无法添加/删除密封数组元素

Javascript ReactJS:TypeError:无法添加/删除密封数组元素,javascript,reactjs,graphql,graphql-subscriptions,Javascript,Reactjs,Graphql,Graphql Subscriptions,我正在尝试使用Apollo GraphQL制作的API,并在GraphQL订阅的帮助下使用订阅传输ws库实时更新react组件。对于delete操作,我得到TypeError:无法添加/删除密封数组元素错误。下面是react组件中的代码,该组件正在尝试从订阅更新数据 componentWillReceiveProps(nextProps) { if (!this.subscription && !nextProps.data.loading) {

我正在尝试使用Apollo GraphQL制作的API,并在GraphQL订阅的帮助下使用
订阅传输ws
库实时更新
react
组件。对于delete操作,我得到
TypeError:无法添加/删除密封数组元素
错误。下面是react组件中的代码,该组件正在尝试从订阅更新数据

   componentWillReceiveProps(nextProps) {
        if (!this.subscription && !nextProps.data.loading) {
                let { subscribeToMore } = this.props.data
                this.subscription = [subscribeToMore(
                {
                    document: postDeleted,
                    updateQuery: (previousResult, { subscriptionData }) => {
                     const delPost = subscriptionData.data.postDeleted;
                     const mainData = previousResult.Posts;               

                     let post = mainData.find(post => post.id == delPost.id);
                     let updatedList =  mainData.splice(post, 1);
                     return updatedList;
                    },
                }
                )]
       }
    }

mainData
很可能是“”,因此您的
splice
操作抛出错误:

let updatedList =  mainData.splice(post, 1);
解决方案是制作阵列的副本(此处使用阵列分解):

您可以在Chrome控制台中这样尝试:

a = [1, 2, 3];
Object.seal(a);
a.splice(1)

// Uncaught TypeError: Cannot add/remove sealed array elements
//  at Array.splice (<anonymous>)
//  at <anonymous>:1:3

[...a].splice(1)

// [2, 3]
a=[1,2,3];
对象.印章(a);
a、 拼接(1)
//未捕获类型错误:无法添加/删除密封数组元素
//在Array.splice()处
//时间:1:3
[…a]。拼接(1)
// [2, 3]

mainData
很可能是“”,因此您的
拼接操作抛出错误:

let updatedList =  mainData.splice(post, 1);
解决方案是制作阵列的副本(此处使用阵列分解):

您可以在Chrome控制台中这样尝试:

a = [1, 2, 3];
Object.seal(a);
a.splice(1)

// Uncaught TypeError: Cannot add/remove sealed array elements
//  at Array.splice (<anonymous>)
//  at <anonymous>:1:3

[...a].splice(1)

// [2, 3]
a=[1,2,3];
对象.印章(a);
a、 拼接(1)
//未捕获类型错误:无法添加/删除密封数组元素
//在Array.splice()处
//时间:1:3
[…a]。拼接(1)
// [2, 3]

如果您的阵列已被密封,您可以制作一份副本,并按如下方式过滤掉不需要的阵列:


let updatedList=mainData.filter(post=>post.id!==delPost.id)

如果您的阵列已被密封,您可以制作一份副本并按如下方式过滤掉您不需要的阵列:


let updatedList=mainData.filter(post=>post.id!==delPost.id)

splice返回删除的元素,因此:让updatedList=[…mainData].splice(post,1);不会给您更新的列表,但会给您removed@Will[1,2,3]。拼接(1)(删除索引“1”之后的所有内容)和[1,2,3]。切片(1)(从索引1开始并返回到序列末尾)都返回[2,3],因为拼接中的deleteCount参数是如何工作的。拼接返回删除的元素,因此:let updatedList=[…mainData].拼接(柱,1);不会给您更新的列表,但会给您removed@Will[1,2,3]。拼接(1)(删除索引“1”之后的所有内容)和[1,2,3]。切片(1)(从索引1开始并通过序列结束返回)都返回[2,3],因为拼接中的deleteCount参数是如何工作的。