【问题标题】:vue js input form binding from v-for loop data来自v-for循环数据的vue js输入表单绑定
【发布时间】:2019-01-28 16:26:16
【问题描述】:

我正在从 vue 发送一个 post 请求,vue 表单是使用 v-for 循环创建的,因为它是一个数据对象数组。在数据对象中,还有另一组带有字段的对象。我如何设置数据结构?由于 for 循环创建了多个对象,我如何将带有 id 的数据传递到 vue 数据结构中?在这里感谢任何帮助!谢谢!

<div v-for="(list, index) in lists.items" :key="list.id">
    <div class="card">
        <div class="card-header">
            {{ list.title }}
        </div>
        <div class="card-body">
            <div class="row">
                <div class="col-sm">
                    Select quantity of item: <br>
                    <input type="number" placeholder="Quantity of item">
                </div>
                <div class="col-sm">
                    <div v-for="addon in list.addons">
                        Include addons: <br>
                        <input type="checkbox" :value="addon.id">
                        <label>{{ addon.name }}</label>
                        <input type="number" placeholder="Quantity of addon">
                    </div>
                </div>
                <div class="col-sm">
                    <input type="submit" class="btn btn-primary" value="Buy" @click.prevent="buy(index)">
                </div>
            </div>
        </div>
    </div>
</div>

我需要发送

[
    { item_id: id },
    { quantity: quantity },
    [
        [
            { addon_id: id },
            { addon_quantity: quantity }
        ],
        [
            { addon_id: id },
            { addon_quantity: quantity }
        ]
    ]
] 

到后端。插件数组可以包含单个对象或多个对象,具体取决于它们是否已被选中。

【问题讨论】:

  • 您已经在编辑插件信息了吗?您能否编辑您的帖子,向我们展示您发送到后端的数据?并显示你用来发送的函数。
  • 我不是在编辑插件信息,它是一个复选框,供客户选择是否需要插件。我还没有向后端发送任何东西,这是我可以接受的 axios 部分。我的问题是构建要发送的数据结构。

标签: vue.js vuex


【解决方案1】:

我通过将整个数组作为对象放入购买函数中解决了这个问题。当我为每个数组点击提交时,同一个循环中的其他数组不会受到影响。

@click.prevent="buy(list)"

至于列表对象的输入数字,我声明为:

<input type="number" placeholder="Quantity of item" v-model="list.main_quantity">

和插件循环

<div class="col-sm">
    <div v-for="addon in list.addons">
        Include addons: <br>
        <input type="checkbox" :value="addon.id" v-model="addon.addon_id">
        <label>{{ addon.name }}</label>
        <input type="number" placeholder="Quantity of addon" v-model="addon.quantity">
    </div>
</div>

【讨论】:

    【解决方案2】:

    我假设你的 list 结构是这样的:

    list: {
        id: 1,
        title: 'Foo Baah',
        addons: [
            {
                id: 100,
                name: 'Delta'
            },
            {
                id: 101,
                name: 'Bravo'
            },
            {
                id: 102,
                name: 'charlie'
            }
        ]
    }
    

    那么,你可以这样处理这些数据:

    function(lists) {
        let tempList = []
        lists.forEach((item) => {
            let tempItem = []
    
            Object.keys(item).forEach((key) => {
                if (key == 'addons') {
                    let tempAddon = []
                    item.addons.forEach((addonItem) => {
                        let tempAddonItem = []
    
                        Object.keys(addonItem).forEach((addonItemKey) => {
                            let tempObject = {}
                            tempObject[addonItemKey] = addonItem[addonItemKey]
                            tempAddonItem.push(tempObject)
                        })
                        tempAddon.push(tempAddonItem)
                    })
                    tempItem.push(tempAddon)
                } else {
                    let tempObject = {}
                    tempObject[key] = item[key]
                    tempItem.push(tempObject)
                }
            })
    
            tempList.push(tempItem)
        })
    
        return tempList
    }
    

    【讨论】:

    • 嗨 Raphael,感谢您抽出宝贵时间帮助我。您将如何传递主要数量和附加数量的输入数字参数?我不知道有任何方法可以这样做。当按下提交按钮时,我将索引与 v-for 循环中的列表一起区分不同的数组。
    • 我没有意识到您遇到的问题。我认为您需要处理要发送到 API 的数据。希望我的回答对你有所帮助。
    猜你喜欢
    • 2019-04-30
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2021-09-13
    • 2021-04-27
    • 2020-04-13
    相关资源
    最近更新 更多