【发布时间】:2020-04-07 16:26:49
【问题描述】:
我是 Redux 的新手,正在寻找一种方法来从 Redux 中的现有数组中删除 JSON 对象。我尝试了几种方法,但都没有奏效。减速器的代码如下:
const initialState = {serviceList: [{name: 'Ancestome', connectedAt: '08/03/2020'},{name: '23AndMe', connectedAt: '09/03/2020'},{name: 'Cancer Research UK', connectedAt: '09/03/2020'}]}
const serviceReducer = (state = initialState, action) => {
let serviceList = [...state.serviceList]
switch (action.type) {
case DELETE_SERVICE:
delete serviceList[action.id]
return {
...state,
serviceList: serviceList
};
default:
return state
}
}
export default serviceReducer
File service.js
class Services extends React.Component {
constructor(props) {
super(props);
this.addNewEle = false;
this.state = {disabled: false};
}
afterAnimationComplete = () => {
this.setState({ disabled: false });
}
deleteFromService = (id) => {
this.props.deleteService(id);
this.addNewEle = false;
this.setState({disabled: false});
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
}
render() {
return (
<View style={styles.container} >
<Header
placement="left"
centerComponent={{ text: 'Service', style: { color: '#fff', fontSize: 24 } }}
/>
<ScrollView
ref={scrollView => this.scrollView = scrollView}
onContentSizeChange={() => {
this.addNewEle && this.scrollView.scrollToEnd();
}}
>
<View style={{ flex: 1, padding: 4 }}>
{Object.keys(this.props.serviceList).map((id) => {
return (
<ServiceItem
key={id}
id={id}
item={this.props.serviceList[id]}
removeItem={(id) => this.deleteFromService(id)}
afterAnimationComplete={this.afterAnimationComplete}
/>
)
})}
</View>
</ScrollView>
</View>
);
}
}
const styles = StyleSheet.create(
{
container: {
flex: 1,
},
title: {
backgroundColor: 'transparent',
color: 'black',
fontSize: 24,
paddingLeft: 10,
paddingTop: 50,
}
});
const mapStateToProps = (state) => ({ serviceList: state.serviceReducer.serviceList });
const mapDispatchToProps = (dispatch) => ({
deleteService: (serviceItem) => {
dispatch(deleteService(serviceItem));
},
});
export default connect(mapStateToProps, mapDispatchToProps)(Services);
在上面的代码中,如果我从数组中删除一个条目但第二次尝试失败,它会起作用。例如,我删除了第一个(id = 0),然后保留了两个条目(id = {1,2})。现在,如果我继续删除第二个条目(id = 1),它并没有删除这个条目,奇怪的是它返回了两个条目(id = {0,2})!!!当我试图删除最后一个条目时发生了类似的事情。
我也试过下面的代码:
let newList = serviceList.slice(0, action.id).concat(serviceList.slice(action.id + 1));
return {
...state,
serviceList: newList
};
但是,如果我删除第一个,那么它会删除第一个和最后一个!!!
我不知道发生了什么,如果有人能提出正确的解决方案,我将不胜感激。谢谢
【问题讨论】:
-
id是代表serviceList中元素的索引还是? -
是的,'id'代表'serviceList'中item的索引
标签: arrays react-redux