我在学Vue.js和我正在努力找到一种方法来组织我的代码.我正试图使所有东西尽可能模块化,所以在制作滑块时,我做了以下几点:

<template>
    <div class="banners">
        <slot></slot>
    </div>
</template>
<script>
    export default {
        methods: {
            echo() {
                console.log('Echoing..')
            }
        },
        mounted() {
            $('.banners').slick();
        }
    }
</script>

在我看来,我只是简单地使用组件:

<banners>
    <?php for ($i = 0; $i < 5; $i++) : ?>
        <img src="http://lorempixel.com/1440/500" alt="Banner image" class="banner">
        <a href="#" v-on:click="echo">Echo</a>
    <?php endfor; ?>
</banners>

但在我try 调用echo后,它会在父范围中查找它,而不是在横幅组件范围中,并表示该方法未定义.

我想知道实现这一点的最佳方式.对我来说,在父范围内声明方法是无用的,因为在整个项目中,我将有数百万个类似于这种情况的其他方法,如果我这样做,它将迅速变得无组织.我想把这些横幅方法放在它们自己的中,不管是什么,这样我就可以很容易地在它们的适当位置找到它们,以及除了横幅之外的其他模块.

也许我用错了组件,不应该用这个?我就是不能把一个echo()方法放在只与特定组件相关的父范围内.想象一下,我可能会在其他元素中使用其他的echo(),这些元素将执行与横幅不同的操作.

我也不能在模板内移动内容,因为我需要通过PHP获取数据,这就是为什么我在内为做.

推荐答案

在这种特殊情况下,你应该使用scoped slot.

在组件中,传递希望能够在插槽中使用的属性(在本例中为echo方法).

<div class="banners">
    <slot :echo="echo"></slot>
</div>

在应用程序模板中,使用具有scope属性的模板标记将要注入的内容包装到插槽中.

<banners>
    <template slot-scope="props">
    <?php for ($i = 0; $i < 5; $i++) : ?>
        <img src="http://lorempixel.com/1440/500" alt="Banner image" class="banner">
        <a href="#" v-on:click="props.echo">Echo</a>
    <?php endfor; ?>
    </template>
</banners>

这是example美元.

如果不需要使用传递到插槽的所有内容,或者只是为了避免每次写入props.echo,那么也可以对作用域属性进行解构.

<banners>
    <template slot-scope="{echo}">
    <?php for ($i = 0; $i < 5; $i++) : ?>
        <img src="http://lorempixel.com/1440/500" alt="Banner image" class="banner">
        <a href="#" v-on:click="echo">Echo</a>
    <?php endfor; ?>
    </template>
</banners>

Vue.js相关问答推荐

为什么普通对象在 Vue3 中自动变成响应式的?

如何在 v-for 指令切换状态下安全地制作包含附加到对象的复选框的列表(W/O 切换列表中的其他复选框)?

何时将代码拆分为 Nuxt 中的组件?

如何使用 vuejs 在浏览器 url 中获取当前 product.id 的详细信息

v-slot: activator 中 {attrs} 参数的作用是什么?

如果在 VueJS/VuetifyJS 中切换switch,则调用函数

v-for 内部的组件

Webpack 你可能需要一个合适的加载器来处理这个文件类型

Vue.js 如果在视图中

请求正在进行时显示加载器

如何使用 Vuejs 和 Laravel 获取当前经过身份验证的用户 ID?

从我的服务访问路由实例

如何将项目推送到 Vuejs 中数据对象的数组中? Vue 似乎没有关注 .push() 方法

Vue-i18n '无法读取 Proxy.Vue.$t 处未定义的属性 '_t'

VueJS错误编译模板

我如何能够在 vue js html 中以给定格式进行多项 Select 和传递数据?

过渡后的 v-if 下方的过渡元素

Vue.js 单向绑定表单

VueJS 路由 - 使用子路由和 Vuetify 时如何停止多个活动路由(active routes)?

在 Vue.js 模板中调用函数