Javascript ReactJS:TypeError:无法添加/删除密封数组元素
我正在尝试使用Apollo GraphQL制作的API,并在GraphQL订阅的帮助下使用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) {
订阅传输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参数是如何工作的。