组件的 v-for 循环中的选定值

Posted

技术标签:

【中文标题】组件的 v-for 循环中的选定值【英文标题】:Selected values in a v-for loop of components 【发布时间】:2020-02-24 08:35:12 【问题描述】:

我实现了一个内部有一个选择元素的组件,它或多或少像下面这样:

<!-- child component -->
    <template>
        <b-form-select 
            v-model="selectedProject"
            :options="projects"
            @change="changedValue">
            <template v-slot:first>
                <option :value="null" disabled>-- Please select a project --</option>
            </template>
        </b-form-select>
    </template>

    <script>
    export default 
        name: 'AllocationItem',
        props: 
            projects: 
                type: Array,
                default: () => [ value: Number,  text: String]
            
        ,
        data() 
            return 
                selectedProject: null,
            
        ,
        methods: 
            changedValue(value) 
                this.selectedProject = value;
            
        

    
    </script>

我在父组件中使用此组件,可以通过单击按钮添加其他 AllocationItem。

为此,我使用了一个数组,每次点击添加按钮时我都会推送一个新项目(我不知道这是否正确...)

跟随父组件代码:

<!-- parent component -->
    <template>
        <b-button class="btnAction" @click="addItem()">Add</b-button>
        <b-button class="btnAction" @click="sendAllocation()">Send</b-button>
        <b-row v-for="allocation in resourceItem.allocations" v-bind:key="allocation.id">
            <allocation-item v-bind:projects="projects"></allocation-item>
        </b-row>
    </template>


    <script>
        export default 
        name: 'Management',
        components: 
            AllocationItem
        ,
        data() 
            return 
                allocations: []
            
        ,
        methods: 
            addItem() 
                this.allocations.push(AllocationItem);
            ,
            sendAllocation() 
                this.allocations.forEach((allocation) => 
                    // I WOULD LIKE TO HAVE ALL SELECTED VALUE HERE!!!
                );
            ,
        ,
        created() 
            const dataProjects = this.getProjectsData();
            dataProjects.then(response => 
                this.projects = response.map((item) => 
                    return value: item.id, text: item.name
                )
            );
        
    </script>

在我的应用程序中,我有另一个按钮,发送按钮,应该读取在所有子组件(分配项)中选择的值。

我怎样才能拥有一个具有该选定值的数组?

提前谢谢大家

【问题讨论】:

【参考方案1】:

这取决于“发送按钮”组件与父​​组件的关系。 您可以:

使用 $emit() 方法将数据沿组件树向上传播到共享父组件。然后将其支撑到“发送按钮”组件。 使用Vuex 获得单一事实来源。这是一个将您的所有数据保存在一个集中对象中的存储。

也许您可以向我们提供有关项目结构的更多信息?

【讨论】:

谢谢@laurensvm,我知道这两种解决方案,我正在尝试使用 $emit on change(我的项目中没有 vuex)。但我不明白一件事:“我如何区分 $emit 和不同的组件?”例如,我可以有 3 个或 4 个(或更多)组件由 v-for 循环呈现...我如何区分 $emit 与第一个组件和 $emit 与第二个或第三个组件? 如果它们是相等的组成部分,我认为你不能。但这并不重要,对吧? 对不起@laurensvm,但我不明白。什么意思?【参考方案2】:

首先,问问自己这个组件是否在其他地方使用,除了这里。如果你只使用一次,把它构建到父组件中,你的问题就解决了。 否则我会选择 @laurensvm 的使用 emit 或 Vuex 的方法。

【讨论】:

感谢您的反馈塞巴斯蒂安。显然我需要在不止一个部分中使用组件:)【参考方案3】:

经过对谷歌的一些研究,我找到了一个解决方案。我不知道它是否正确,但它工作正常而且看起来很干净。

我的解决方案包括在子组件上使用发射,在父组件上使用 v-model,如以下示例所示。

<!-- child component -->
    <template>
        <b-form-select 
            v-model="selectedProject"
            :options="projects"
            @change="changedValue">
            <template v-slot:first>
                <option :value="null" disabled>-- Please select a project -- 
</option>
            </template>
        </b-form-select>
    </template>

    <script>
    export default 
        name: 'AllocationItem',
        props: 
            projects: 
                type: Array,
                default: () => [ value: Number,  text: String]
            ,
            value: 
                type: Number
            
        ,
        data() 
            return 
                selectedProject: this.value
            
        ,
        methods: 
            changedValue(value) 
                this.$emit('input', value);
            
        

    
    </script>

在父级上使用 v-model 上的数组变量。 像这样的:

<!-- parent component -->
<template>
    <b-container>
            <b-row>
                    <b-button class="btnAction" variant="success" @click="addItem(index)">Add</b-button>
                    <b-button class="btnAction" @click="sendAllocation(index)">Send</b-button>
            </b-row>
            <b-row v-for="(allocation, index) in resourceItem.allocations" v-bind:key="allocation.id">
                <allocation-item v-bind:projects="projects" v-model="allocationItemSelected[index]"></allocation-item>
            </b-row>
    </b-container>
</template>

点击下面的代码框链接查看可运行的示例:

https://codesandbox.io/s/vue-template-4f9xj?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&moduleview=1

【讨论】:

以上是关于组件的 v-for 循环中的选定值的主要内容,如果未能解决你的问题,请参考以下文章

Vue v-for 循环 - 过滤数组时如何定位组件

elementUI 的 navmenu 怎么在 v-for 中 循环不同的标签?

用 props 值连接 v-for 循环中的源数据

vue中的v-for循环指令使用

Vue.js v-for 循环绑定数组中的项目对象并在更改时更新

前端笔记十一v-for循环普通数组对象数组对象数字