【发布时间】:2018-10-03 15:35:47
【问题描述】:
我有一个名为Cart 的父组件和另一个名为Items 的组件。
基本上,我从 Node.js 获取一组对象并将其保存为Cart 组件中的状态。
我的购物车组件:
class Cart extends React.Component {
constructor(props){
super(props)
this.state={
cartData:null,
}
}
componentWillUnmount(){
_isMounted = false
}
componentDidMount() {
_isMounted = true
this.callApi()
.then(res => {if(_isMounted) this.setState({cartData: res.express})})
.catch(err => console.log(err));
}
callApi = async () => {
const response = await fetch('/myCart');
const body = await response.json();
if (response.status !== 200) throw Error(body.message);
return body;
};
mapOutItems(){
return this.state.cartData.map((item,index) => (
<Item
key={index}
desc={item.desc}
amount={item.amount}
total={item.total}
delete={this.handleDelete(item.desc)}
/>
))
}
handleDelete(desc){
axios({method: "post", url: "/remove", data:{name: desc}})
axios("/myCart").then(function (response){
this.setState({cartData : response.data.express})
})
.catch(function (error){
console.log(error)
});
}
render(){
return(
<div>
<div className="container">
{this.mapOutItems()}
</div>
</div>
)
}
}
export default Cart;
项目组件
class Item extends React.Component{
handleClick(e){
e.preventDefault()
axios({method: "post", url: "/remove", data:{name: this.props.desc}})
}
render(){
return(
<div>
<div className="row">
<div className="col">
{this.props.desc}
</div>
<div className="col">
{this.props.amount}
</div>
<div className="col">
{this.props.total}
</div>
<button className="btn btn-sm btn-danger" onClick=onClick={this.props.delete}>
Delete
</button>
</div>
</div>
)
}
}
export default Item;
逻辑:我的Cart 组件将从 Node.js 的端点获取数据。它是一个对象数组,Cart 组件使用它来填充item 组件。 item 组件有一个删除按钮,一旦触发器将发送它想要删除的项目的名称并使用 MongoDB 的查询来删除这些项目。
但是后台显示删除成功了,但是父组件Cart还是渲染了被删除的item。我想找到一种方法来在项目被删除后触发重新渲染购物车。
编辑:
来自 url 的简单数据是一个对象数组,如下所示:
[{ desc: 'Market', total: 4000, amount: 1 }
{ desc: 'Data', total: 17000, amount: 1 }]
handleDelete()中的响应是被调用的axios的响应,格式如下:
{data: {…}, status: 200, statusText: "OK", headers: {…}, config: {…}, …}
config: {adapter: ƒ, transformRequest: {…}, transformResponse: {…}, timeout: 0, xsrfCookieName: "XSRF-TOKEN", …}
data: {express: Array(1)}
headers: {date: "Wed, 03 Oct 2018 18:30:02 GMT", etag: "W/"37-QxQ/lxfNH/fWEmtfXYAG1YLiA/E"", x-powered-by: "Express", content-length: "55", vary: "Accept-Encoding", …}
request: XMLHttpRequest {onreadystatechange: ƒ, readyState: 4, timeout: 0, withCredentials: false, upload: XMLHttpRequestUpload, …}
status: 200
statusText: "OK"
__proto__: Object
从response.data,我得到express: Array(1),所以从response.data.express,我实际上得到了数据数组
在@Code-Apprentice 的编辑之后。现在的问题是,在第一个 remove 调用完成后,调用的第二个 axios 没有调用 get invoke。我试图打印出我从第二个 axios 返回的数据,它与第一次渲染的数据相同。
【问题讨论】:
-
我建议将逻辑从
Item移出并移到父组件中 - 您可以使用回调道具让父组件知道何时单击删除。然后父组件可以更新自己的状态(这将触发重新渲染)。 -
@JoeClay 我是 React 新手,如何将删除逻辑移动到父组件
-
请显示来自
componentDidMount中初始请求的this.state.cartData示例。那么handleDelete()中的.then()处理程序中的response是什么。在向/myCart发出请求之前,您可能需要在调用/remove路由之后使用.then。
标签: javascript reactjs