【发布时间】:2018-05-30 09:27:50
【问题描述】:
我在使用自制的 ReactJS 组件时遇到了一个奇怪的问题,我一定是做错了什么。
我有一个父组件,它通过 REST 服务定期接收对象数组。将接收到的元素枚举并放入 react-bootstrap ListGroup 元素中:
<Row>
<Col sm={2}>
<ListGroup>
{this.state.maps.map((object, index) => {
return <ListGroupItem key={index}
onClick={() => this.setState({ currentMapSelection: object })}>
{object.map_name}
</ListGroupItem>
})}
</ListGroup>
</Col>
<Col sm={10}>
{this.renderMapForm()}
</Col>
</Row>
ListGroupItems 的显示工作正常。
现在我想通过单击来编辑 List 元素。为了代码分离,我想把整个编辑逻辑放到一个单独的组件(MapLoadForm)中,它会渲染一些Form元素以及更新和删除的手段。
我把渲染放到一个单独的函数中,有条件地渲染 MapLoadForm:
renderMapForm() {
const mapForm = this.state.currentMapSelection;
if (mapForm != undefined) {
return <MapLoadForm map={mapForm}></MapLoadForm>
}
return <div></div>
}
现在的问题是,MapLoadForm 只是在第一次点击时正确呈现。对其他列表项的后续单击不再更改它。我不再看到调用 MapLoadForm 构造函数了。
如果我将return <MapLoadForm map={mapForm}></MapLoadForm> 替换为return <Button>{mapForm.map_name}</Button>,我会看到每次新点击都会呈现一个新按钮。如果我将整个表单呈现逻辑放入renderMapForm() 函数的返回语句中,也会发生同样的情况。仅仅将“外包”到新组件中是行不通的。
import React from 'react';
...
export class MapLoadForm extends React.Component {
constructor(props) {
super(props);
}
...
render() {
return (
<Form style={{ marginTop: "20px" }} horizontal>
...
</Form>
)
}
}
export default MapLoadForm;
现在的问题:这应该有效还是我完全走错了轨道?
TIA
【问题讨论】:
标签: reactjs components rendering