javascript - 父插槽中的可重用组件访问子方法

标签 javascript vue.js vuejs2 vue-component

假设我有一个组件 Reusable,其方法 onClick 设置了一个数据属性。我希望这个组件是可重用的,我想使用插槽来覆盖部分。

据我所知,我必须将 onClick 方法作为作用域属性传递给 reusable 中的 parent:

<div class="reusable">
    <h2>Reusable</h2>
    <slot name="clicker" v-bind:onClick="onClick">
        Default stuff <button v-on:click="onClick">Close</button>
    </slot>
    <p v-if="clicked">You clicked me</p>
</div>

<div class="parent">
    <h1>Parent</h1>
    <reusable>
        <template slot="clicker" scope="reusable">
            <button click="reusable.onClick">
                Close from parent
            </button>
        </template>
    </reusable>
</div>

如果我有很多方法,这可能会变得冗长和嘈杂,我想知道:是否有更好的方法,或者这是否完全是 cromulent?

我研究过使用 refs,在父级调用 this.$refs.reusable.onClick 时使用方法,以及指定动态组件并将它们换出;两者似乎都违反直觉。

最佳答案

您可以使用对象表示法绑定(bind)插槽的属性:

<slot name="clicker" v-bind="{ onClick, onInput, onCustom }">
    Default stuff <button v-on:click="onClick">Close</button>
</slot>

Here's a working fiddle.


如果这变得过于冗长,您至少可以将对象定义移至数据属性并将其从模板中取出:

<slot name="clicker" v-bind="scopeProps">
    Default stuff <button v-on:click="onClick">Close</button>
</slot>
data() {
  return {
    scopeProps: {
      onClick: this.onClick,
      onInput: this.onInput,
      onCustom: this.onCustom
    }
  }
}

关于javascript - 父插槽中的可重用组件访问子方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45192103/

相关文章:

vue.js - Storybook 不会在 Vue 项目的组件中加载 SVG

javascript - 删除列表中的行

javascript - 如果<div>的内容被点击,则注册为被点击的<div>

javascript - 为什么我的数组会重叠

javascript - Vue.js 输入(复选框单选框)在使用 :checked with @input or @click together 时不切换

javascript - 如何使用 Vuex 创建模块并使用 mapState() 获取数据

css - 如何使用 vuetify2 使所有 v-card 等高

javascript - 如何使用 Javascript 检查菜单链接或选项卡是否已被单击以及用户是否位于链接/页面上?

javascript - 通过单击同一图标使菜单出现和消失

vue.js - 不提供名为 'Vue' 的导出(位于 main.js?t=1667997788986 :1:9)