【问题标题】:React: change order list when button clicked反应:单击按钮时更改订单列表
【发布时间】: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 &amp;&amp; orders.length &gt; 0 ? orders.map...,您还可以拥有一个订单列表组件。
  • 感谢您的回复和提示,为我的产品列表制作一个组件,这将使我的代码更清晰:)

标签: reactjs button


【解决方案1】:

你可以通过这个来实现:

this.handleDoneAction = event = > {
    let itemIndex = event.target.getAttribute("data-itemIndex");
    let prevOrders = [...this.state.orders];
    var itemToMoveAtLast = prevOrders.splice(itemIndex, 1);
    var updatedOrderList = prevOrders.concat(itemToMoveAtLast);
    this.setState({order: updatedOrderList})

}

我在按钮handleDoneAction 上附加了一个事件处理程序。

<button className="btn btn-sm btn-default btndone" data-itemIndex={index} onClick={this.handleDoneAction}>Done</button>

属性data-itemIndex是orders数组中对象的索引。

你的地图功能会是这样的:

orders.map((order, index) => { 
    //content
})

对于成品的不同风格效果,我建议你对所有成品使用不同的数组。

【讨论】:

  • 感谢您的回复!这行得通。唯一的问题是,如果您单击按钮,页面会自动向下滚动,但我想留在页面顶部。我想在单击按钮时向 div 添加一个类,但是您对额外数组的建议也不是一个坏主意。就像从订单数组中删除点击的产品并将其添加到另一个数组?