从 VueJS 3 中的菜单打开组件

Posted

技术标签:

【中文标题】从 VueJS 3 中的菜单打开组件【英文标题】:Open Component from Menu in VueJS 3 【发布时间】:2021-08-21 18:52:54 【问题描述】:

好的,所以我不是前端人员。我正试图掌握一些事情,但这似乎让我感到难过。我有一个菜单(下面的代码),里面有“查看配置文件”-当有人单击它时,我希望它打开另一个我创建的带有滑出的 vue 文件,其中包含用户信息-滑出工作如果我只是用 <component name /> 加载它,但我不知道如何将它设置为点击。我通过两者来学习只是指导我需要使用哪些术语,或者请帮助我解决问题。谢谢!

澄清: 我在一个名为 index.vue 的文件中有下面的菜单 - 我还有另一个名为 profile.vue 的文件,它是一个滑出式菜单。当有人点击查看个人资料时,我希望滑块出来。


<Menu as="div" class="ml-2 flex-shrink-0 relative inline-block text-left">
    <MenuButton class="group relative w-14 h-8 bg-white rounded-full inline-flex items-center justify-center focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
        <span class="sr-only">Open options menu</span>
        <span class="bg-gray-100 dark:bg-gray-800 flex items-center justify-center h-full w-full rounded-full">
            <DotsVerticalIcon class="w-5 h-5 text-gray-400 dark:text-gray-300 dark:hover:text-gray-400 group-hover:text-gray-500" aria-hidden="true" />
        </span>
    </MenuButton>
    <transition enter-active-class="transition ease-out duration-100" enter-from-class="transform opacity-0 scale-95" enter-to-class="transform opacity-100 scale-100" leave-active-class="transition ease-in duration-75" leave-from-class="transform opacity-100 scale-100" leave-to-class="transform opacity-0 scale-95">
        <MenuItems class="origin-top-right absolute z-10 top-0 right-9 w-48 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none">
            <div class="py-1">
                <MenuItem v-slot=" active ">
                    <a href="#" :class="[active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', 'block px-4 py-2 text-sm']">View profile</a>
                </MenuItem>
                <MenuItem v-slot=" active ">
                    <a href="#" :class="[active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', 'block px-4 py-2 text-sm']">Send whisper</a>
                </MenuItem>
                <MenuItem v-slot=" active ">
                    <a href="#" :class="[active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', 'block px-4 py-2 text-sm']">Send mention</a>
                </MenuItem>
                <MenuItem v-slot=" active ">
                    <a href="#" :class="[active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', 'block px-4 py-2 text-sm']">Request private chat</a>
                </MenuItem>
                <MenuItem v-slot=" active ">
                    <a href="#" :class="[active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', 'block px-4 py-2 text-sm']">Report abuse</a>
                </MenuItem>
                <MenuItem v-slot=" active ">
                    <a href="#" :class="[active ? 'bg-gray-100 text-gray-900' : 'text-gray-700', 'block px-4 py-2 text-sm']">Block member</a>
                </MenuItem>
            </div>
        </MenuItems>
    </transition>
</Menu>

【问题讨论】:

您能否在您的问题中为此提供相关的 .js(或 .ts)?它会帮助你。 在这种情况下,没有 你的问题的意思有点难以理解。您提到您“不是前端人员”。那么使用像Vuetify 这样的“包含电池”的ui 框架可能是一个好主意。有一个有据可查的menu component。 在那个菜单中——当有人点击查看配置文件时——我希望它打开另一个 vue 文件……就是这样…… 【参考方案1】:

你可以简单地为你的组件添加一个 v-if 条件

    <transition v-if="isOpen" enter-active-class="transition ease-out duration-100" enter-from-class="transform opacity-0 scale-95" enter-to-class="transform opacity-100 scale-100" leave-active-class="transition ease-in duration-75" leave-from-class="transform opacity-100 scale-100" leave-to-class="transform opacity-0 scale-95">

你的 MenuButton 需要一个@click="isOpen = !isOpen"

如果您已经使用组合 API,则可以从 setup() 函数中提供 isOpen,否则如果您使用选项 API,只需将 isOpen 添加到您的 data()。

你也可以为这个小代码片段添加一个函数isOpen = !isOpen 所以你的 html 中没有任何“真正的逻辑”,这只是我个人更喜欢的东西。

【讨论】:

以上是关于从 VueJS 3 中的菜单打开组件的主要内容,如果未能解决你的问题,请参考以下文章

VueJS 中的下拉菜单(活动菜单的切换)

如何在 VueJS 中的组件之间共享数据

如何从 VueJS 中的 HTML 模板加载特定组件?

有没有办法从VueJS中的父级触发组件方法?

无法从Vuejs中的子组件向父组件发出事件

从 Vuejs 中的多个 Treeview 组件中选择数据