【问题标题】:Pass a button with click handler via slot to recursive child component通过插槽将带有单击处理程序的按钮传递给递归子组件
【发布时间】:2020-06-11 06:31:21
【问题描述】:

我有一个包含以下代码部分的页面模板:

        <nested-draggable v-bind:list="list" v-bind:selected="selected" v-bind:group="dragGroup">
            <slot>
                <v-icon v-on:click="$root.$emit('click', el)" small v-if="allowcreate" style="float: right">mdi-plus</v-icon>
            </slot>
        </nested-draggable>

递归的子组件(“nested-draggable.vue”)如下所示:

<template>
    <ul class="tree">
        <draggable
            class="dragArea"
            tag="li"

            v-for="el in list"

            v-bind:elementdata="el"
            v-bind:key="el._id"
            v-bind:list="list_empty"
            v-bind:selected="selected"
            v-bind:group="group"

            v-on:add="add"
            >
            <span v-bind:class="{'selected' : el._id === selected._id}" v-on:click="elemClicked(el)">{{ el.title }}</span>

            <slot></slot>

            <!-- render children of the current iterated element -->
            <nested-draggable
                v-bind:list="el.children" v-bind:selected="selected" v-bind:group="group">
                <!--<slot></slot>-->
            </nested-draggable>
        </draggable>
    </ul>
</template>

因此,当单击“加号”按钮时,我希望通过当前迭代的 var“el”从传递的插槽内的按钮发出 click 事件,但在插槽内使用的“el”var在嵌套可拖动组件的迭代内无法访问。 Vue 告诉我们在尝试发射时没有“el”引用。 (抛出此错误:https://pastebin.com/8bNwMcDr

那么我怎样才能访问传递槽内的递归数据呢?传递时如何定义我的插槽?

我找到的唯一解决方案是将按钮/事件链接直接放入嵌套可拖动组件(不是插槽),但我认为要干净并编写一个很好的分离组件,这不属于嵌套可拖动组件,但在其父级中。

【问题讨论】:

    标签: vue.js vuejs2 vue-component


    【解决方案1】:

    您不需要从模板中传递您的事件,因为无论如何您都可以使用您的方法。 This 应该可以帮到你。

    【讨论】:

    • 我不需要这个活动。我需要递归子组件中迭代的迭代元素(名称为“el”)。
    • 在这种情况下,您需要将el 绑定到您的插槽才能在插槽内访问它。阅读更多vuejs.org/v2/guide/components-slots.html#Scoped-Slots
    • 你可以做类似&lt;slot :el="el"&gt; ... &lt;/slot&gt;
    • 我试过这个。这不会改变任何事情 - 仍然无法在插槽内访问“el”
    • 你能发布给出错误的确切代码吗?以上还不够清楚。
    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2018-06-27
    • 2019-12-11
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多