【发布时间】:2025-12-03 13:15:01
【问题描述】:
我正在使用 Javascript 和 React 制作我的第一个应用程序,并从一个查看购物清单的页面开始。它从 api 调用中获取项目。
如果用户单击“完成”按钮(或者我应该使用复选框吗?)该产品应该位于列表的底部(并用 css 显示为灰色,但这不是问题)。
问题是,我不知道该怎么做。谁能帮帮我?
这是我的代码:
import React from 'react';
//import image from '../images/header.png';
//import Collapsible from './Collapsible';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
isLoading: true,
orders: []
}
}
componentWillMount() {
localStorage.getItem('orders') && this.setState({
orders: JSON.parse(localStorage.getItem('orders')),
isLoading: false
})
}
componentDidMount() {
if (!localStorage.getItem('orders')){
this.fetchData();
} else {
console.log('Using data from localstorage');
}
}
fetchData() {
fetch('http://localhost:54408/api/orders/all/15-03-2018')
.then(response => response.json())
.then(parsedJSON => parsedJSON.map(product => (
{
productname: `${product.ProductName}`,
image: `${product.Image}`,
quantity: `${product.Quantity}`,
isconfirmed: `${product.IsConfirmed}`,
orderid: `${product.OrderId}`
}
)))
.then(orders => this.setState({
orders,
isLoading: false
}))
.catch(error => console.log('parsing failed', error))
}
componentWillUpdate(nextProps, nextState) {
localStorage.setItem('orders', JSON.stringify(nextState.orders));
localStorage.setItem('ordersDate', Date.now());
}
render() {
const {isLoading, orders} = this.state;
return (
<div>
<header>
<img src="/images/header.jpg"/>
<h1>Boodschappenlijstje <button className="btn btn-sm btn-danger">Reload</button></h1>
</header>
<div className={`content ${isLoading ? 'is-loading' : ''}`}>
<div className="panel">
{
!isLoading && orders.length > 0 ? orders.map(order => {
const {productname, image, quantity, orderid} = order;
return<div className="product" key={orderid}>
<div className="plaatjediv">
<img className="plaatje" src={image} />
</div>
<div className="productInfo">
<p>{productname}</p>
<p>Aantal: {quantity}</p>
<p>ID: {orderid}</p>
</div>
<div className="bdone">
<button className="btn btn-sm btn-default btndone">Done</button>
</div>
</div>
}) : null
}
</div>
<div className="loader">
<div className="icon"></div>
</div>
</div>
</div>
);
}
}
export default App;
【问题讨论】:
-
一种简单的方法是:在您的
orders.map之前添加.sort。然后您将拥有orders.sort(yourCustomSortFunction).map(...)。单击订单后,您必须进行回调以使其移动到数组的末尾。为了使您的组件更清晰,请尝试对该组件进行更多模块化。除了!isLoading && orders.length > 0 ? orders.map...,您还可以拥有一个订单列表组件。 -
感谢您的回复和提示,为我的产品列表制作一个组件,这将使我的代码更清晰:)