首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在某些行中为用户绘制带有输入的动态表?

如何在某些行中为用户绘制带有输入的动态表?
EN

Stack Overflow用户
提问于 2021-12-29 01:55:30
回答 1查看 282关注 0票数 0

我想要绘制一个包含项目列表的表,并为每个项目提供输入。我设法绘制了表,并呈现了来自get请求的项。目标是在不同的行中获取每一项的输入。但是,由于项是使用map函数呈现的,所以当用户在输入中键入某项时,它将在所有行中呈现。我需要它只在其各自的行上被呈现。我明白为什么会发生这种事,但我不知道怎么做。我是新来的,所以我会感谢你的帮助。

表的呈现代码

代码语言:javascript
复制
<div className="d-flex justify-content-center card card-body border border-5 border-primary">
                <div className="table table-striped text-primary table-container">
                    <thead className="border border-light">
                    <tr>
                        <th>Nombre</th>
                        <th>Sabor</th>
                        <th>Precio</th>
                        <th>Cantidad</th>
                        <th>Empaque</th>
                        <th>Instrucciones Adicionales</th>
                    </tr>
                    </thead>
                    <tbody>
                    {sweets.map(sweet => (
                        <tr key={sweet.sweet_id}>
                            <td>{sweet.s_name}</td>
                            <td>{sweet.s_flavor}</td>
                            <td>{sweet.s_price}</td>
                            <td>
                                <input
                                    type="text"
                                    onChange={e => set_sweet_quantity(e.target.value)}
                                    value={sweet_quantity}
                                    className="form-control"
                                />
                            </td>
                            <td>
                                <input
                                    type="number"
                                    onChange={e => set_sweet_package(e.target.value)}
                                    value={sweet_package}
                                    className="form-control"
                                />
                            </td>
                            <td>
                                <input
                                    type="text"
                                    onChange={e => set_additional_instructions(e.target.value)}
                                    value={additional_instructions}
                                    className="form-control"
                                    placeholder='N/A'
                                />
                            </td>
                            <td>
                                <button className="btn btn-primary btn-sm btn-block"
                                        onClick={() => handleItemSweets(sweet.sweet_id)}
                                >
                                    Añadir a la orden
                                </button>
                                <button
                                    className="btn btn-danger btn-sm btn-block btn-delete"
                                >
                                    Remover
                                </button>
                            </td>
                        </tr>
                    ))}
                    </tbody>
                </div>
            </div>

用于管理输入和get请求的代码

代码语言:javascript
复制
const handleItemSweets = async (id) => {
        set_sweet_id(id)
        console.log(sweet_id)
        const res = await fetch(API + '/create_sweet_item', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                sweet_quantity,
                additional_instructions,
                sweet_package,
                sweet_id
            })
        })
        const data = await res.json();
        console.log(data);

        set_sweet_quantity('');
        set_additional_instructions('');
        set_sweet_package('');
        set_sweet_id('');
    }

    // Variable para guardar los dulces en una lista desde el json
    const [sweets, set_sweets] = useState([]);
    const getSweets = async () => {
        const res = await fetch(API + "/get_all_sweets");
        const data = await res.json();
        set_sweets(data);
        console.log(data);
    };

[Error visualization][1]


  [1]: https://i.stack.imgur.com/ldd1x.png
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-29 02:34:23

不只是存储一个sweet_quantity状态,您可以将其转换为一个对象来存储所有的sweet_quantities

代码语言:javascript
复制
const [sweet_quantities, set_sweet_quantities] = useState({})

当您收到API响应时,可以使用与甜的id关联的缺省数量值填充该对象

代码语言:javascript
复制
const getSweets = async () => {
        const res = await fetch(API + "/get_all_sweets");
        const data = await res.json();
        set_sweets(data);

        ...

        // Set default quantities in state for each item
        const quantities = data.reduce((a, b) => ({ ...a, [b.sweet_id]: b.quantity}), {}) 
        set_sweet_quantities(quantities)
    };

然后,您可以通过甜的id引用选定的状态,并相应地更新它:

代码语言:javascript
复制
{sweets.map((sweet) => (
                        <tr key={sweet.sweet_id}>
                            <td>{sweet.s_name}</td>
                            <td>{sweet.s_flavor}</td>
                            <td>{sweet.s_price}</td>
                            <td>
                                <input
                                    type="text"
                                    onChange={e => set_sweet_quantities({...sweet_quantities, [sweet.sweet_id]: e.target.value})}
                                    value={sweet_quantities[sweet.sweet_id]}
                                    className="form-control"
                                />
                            </td>

                        ....

然后,您可以对其他值重复此逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70514387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档