【发布时间】:2018-08-08 06:58:28
【问题描述】:
我正在尝试重构我的组件并将列表项提取到单独的子组件中。
下面的原始代码(未重构)有效:
// ListContainer.js
import React, { Component } from 'react';
import { Container, ListGroup, ListGroupItem, Button } from 'reactstrap';
import { CSSTransition, TransitionGroup } from 'react-transition-group';
import { connect } from 'react-redux';
import { getItems, deleteItem } from '../actions/itemActions';
import PropTypes from 'prop-types';
class ListContainer extends Component {
componentDidMount() {
this.props.getItems();
}
deleteAction = (id) => {
console.log('this.props: ' + JSON.stringify(this.props));
this.props.deleteItem(id);
}
render() {
const { items } = this.props.item;
return(
<Container>
<ListGroup>
<TransitionGroup className="shopping-list">
{
items.map((item, i) => (
<CSSTransition key={item._id} timeout={500} classNames="fade">
<ListGroupItem>
<Button
className="remove-btn"
color="danger"
size="sm"
onClick={e => this.deleteAction(item._id, e)}>
×
</Button>
{item.name} {item._id}
</ListGroupItem>
</CSSTransition>
))
}
</TransitionGroup>
</ListGroup>
</Container>
);
}
}
const mapStateToProps = state => ({
item: state.item
});
const mapDispatchToProps = dispatch => ({
getItems: () => dispatch(getItems()),
deleteItem: id => dispatch(deleteItem(id)),
});
export default connect(mapStateToProps, mapDispatchToProps)(ListContainer);
下面的重构代码不起作用:
单击删除按钮不会正确重新呈现新列表,即使操作已分派、redux 存储已更新且 API 调用成功。
// New ListContainer.js
// Same imports
// Extracted component
const ListElement = props => {
const { del } = props;
const { _id } = props.item;
const { name } = props.item;
return (
<CSSTransition key={_id} timeout={500} classNames="fade">
<ListGroupItem>
<Button
className="remove-btn"
color="danger"
size="sm"
onClick={() => del(_id)}>
×
</Button>
{name} {_id}
</ListGroupItem>
</CSSTransition>
);
}
// Refactored parent component
class ListContainer extends Component {
componentDidMount() {
this.props.getItems();
}
del = (id) => {
this.props.deleteItem(id);
}
render() {
const { items } = this.props.item;
return(
<Container>
<ListGroup>
<TransitionGroup className="shopping-list">
{
items.map((item, i) => (
<ListElement key={i} item={item} del={ id => this.del(id) } />
))
}
</TransitionGroup>
</ListGroup>
</Container>
);
}
}
// Same redux connector
为什么 ListContainer 组件渲染不正确?
【问题讨论】:
标签: reactjs react-redux