Ara*_*raw 28 vue.js vuejs2 vuetify.js
查看Vuetify示例代码v-toolbar
的目的是v-slot:activator="{ on }"
什么?例如:
<template v-slot:activator="{ on }">
<v-toolbar-title v-on="on">
<span>All</span>
<v-icon dark>arrow_drop_down</v-icon>
</v-toolbar-title>
</template>
<script>
export default {
data: () => ({
items: [
'All', 'Family', 'Friends', 'Coworkers'
]
})
}
</script>
Run Code Online (Sandbox Code Playgroud)
据我所知,on
它在任何地方都不是定义的变量,因此我看不到它是如何工作的。当我在项目中尝试使用Internet Explorer时,Internet Explorer会引发错误<template v-slot:activator="{ on }">
,但是如果将其删除,则会呈现页面。
ton*_*y19 44
您可能会参考以下示例:
<v-toolbar color="grey darken-1" dark>
<v-menu :nudge-width="100">
<template v-slot:activator="{ on }">
<v-toolbar-title v-on="on">
<span>All</span>
<v-icon dark>arrow_drop_down</v-icon>
</v-toolbar-title>
</template>
...
</v-menu>
</v-toolbar>
Run Code Online (Sandbox Code Playgroud)
以下行声明了一个名为的作用域插槽activator
,并提供了一个范围对象(来自VMenu
),其中包含一个名为的属性on
:
<template v-slot:activator="{ on }">
Run Code Online (Sandbox Code Playgroud)
对于IE,您必须on
从范围对象本身取消引用:
<template v-slot:activator="scope">
<v-toolbar-title v-on="scope.on">
Run Code Online (Sandbox Code Playgroud)
但是,理想的 IMO解决方案是使用Vue CLI生成的项目,该项目包含Babel预设(@vue/babel-preset-app
),以自动包含目标浏览器所需的转换/多边形。在这种情况下,babel-plugin-transform-es2015-destructuring
将在构建过程中自动应用。
activator
插槽上的详细信息VMenu
允许用户指定名为的带槽模板activator
,其中包含在某些事件(例如click
)激活/打开菜单的组件。通过一个对象(传递到广告位)VMenu
为这些事件提供侦听器:activator
<v-menu>
<template v-slot:activator="scopeDataFromVMenu">
<!-- slot content goes here -->
</template>
</v-menu>
Run Code Online (Sandbox Code Playgroud)
广告位内容可以访问VMenu
的事件监听器,如下所示:
<v-menu>
<template v-slot:activator="scopeDataFromVMenu">
<button v-on="scopeDataFromVMenu.on">Click</button>
</template>
</v-menu>
Run Code Online (Sandbox Code Playgroud)
为了提高可读性,还可以在模板中对范围数据进行解构:
<!-- equivalent to above -->
<v-menu>
<template v-slot:activator="{ on }">
<button v-on="on">Click</button>
</template>
</v-menu>
Run Code Online (Sandbox Code Playgroud)
范围对象的侦听器传递给<button>
with v-on
的对象语法,该语法将一个或多个事件/侦听器对绑定到该元素。对于以下值on
:
{
click: activatorClickHandler // activatorClickHandler is an internal VMenu mixin
}
Run Code Online (Sandbox Code Playgroud)
...按钮的单击处理程序已绑定到VMenu
方法。
Pro*_*der 12
我认为最初的问题是关于理解“on”对象。最好在这里解释:
https://github.com/vuetifyjs/vuetify/issues/6866
本质上,“on”是从激活器传入的道具。v-on="on" 的作用是将其 on prop 绑定到组件上。“on”本身是从激活器传递的所有事件侦听器。
要调用可读性提示,可以使用以下语法:
<v-menu>
<template v-slot:activator="{ on: activationEvents }">
<v-btn v-on="activationEvents">
I like turtles
</v-btn>
</template>
</v-menu>
Run Code Online (Sandbox Code Playgroud)
在我的大脑中,这比 具有更流畅的可读性v-on="on"
,对我来说,这就像观察仅包含以下内容的对话:
理解?;)
顺便说一下,activationEvents
可以是任何别名,比如“slotEvents”、“listeners”、“anyOldEvent”,或者任何对读者更有意义的东西作为神秘的on
.
运行下面的代码,你就会知道什么是v菜单中的“attrs”和“on”。
\n<v-menu>\n <template v-slot:activator="{ on, attrs }">\n <div v-bind="attrs" v-on="on">\n v-menu slot activator:\n <br />\n attrs == {{ JSON.stringify(attrs) }}\n <br />\n on == {{ \'{\' + Object.keys(on).map(k => k + " : " + on[k]).join(\',\') + \'}\' }}\n </div>\n </template>\n</v-menu>\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\nv-menu slot activator:\nattrs == {"role":"button","aria-haspopup":true,"aria-expanded":"false"}\non == {\nclick:function (e) {if (_this.openOnClick) {onClick && onClick(e);}_this.absoluteX = e.clientX;_this.absoluteY = e.clientY;},\nkeydown:function () { [native code] }\n}\n
Run Code Online (Sandbox Code Playgroud)\n解释:
\n<div v-bind="attrs" v-on="on">
等于
<div \n v-bind="{role:\'button\',aria-haspopup:true,aria-expanded:\'false\'}" \n v-on="{click:function (e) {/*implement by v-menu*/},keydown:function () {/*implement by v-menu*/}}"\n>\n
Run Code Online (Sandbox Code Playgroud)\n从 vue 2.4.0+ 开始,v-on 还支持绑定到不带参数的事件/监听器对的对象。请注意,使用对象语法时,它不支持任何修饰符。\n示例:
\n<!-- v-on\'s object syntax (vue 2.4.0+) -->\n<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>\n
Run Code Online (Sandbox Code Playgroud)\n关于<template>
Internet Explorer 中的标签引发错误:
正如 vuetify 文档所说:
\n\n由于 Internet Explorer\xe2\x80\x99s 对<template>
标记的支持有限,您必须将完全编译的 dom 元素发送到浏览器。这可以通过提前构建 Vue 代码或创建辅助组件来替换 dom 元素来完成。例如,如果直接发送到 IE,则会失败:
<!-- Vue Component -->\n<template v-slot:items="props">\n <td>{\xe2\x80\x8c{ props.item.name }\xe2\x80\x8c}</td>\n</template>\n
Run Code Online (Sandbox Code Playgroud)\n