vue.js+vuetify学习开发排坑:一个古怪的代码 v-slot:activator="{ on, attrs }"
由于需要全栈开发一个售票系统项目,时隔一年后重新捡回了我的前端技术~
开发习惯是边看文档边做,然后再vuetify这个MD设计的UI元件库翻来翻去,再涉及到元件交互的时候有几段代码不是很能理解
<template v-slot:activator="{ on, attrs }">
<v-btn
color="red lighten-2"
dark
v-bind="attrs"
v-on="on"
>
Click Me
</v-btn>
</template>
首先需要明白&attrs的用法,查了一下官方文档:
vm.$attrs
类型:
{ [key: string]: string }只读
详细:
包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (
class和style除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class和style除外),并且可以通过v-bind="$attrs"传入内部组件——在创建高级别的组件时非常有用。
我基本理解成$attrs 可以收集父组件中的所有传过来的属性除了那些在组件中没有通过 props 定义的。就是将父类中的很多属性和方法传递给内部组件,方便执行一些命令。
v-slot是插槽的意思,v-slot:activator,意思是slot="activator",是新的写法。
作用域插槽
一般在父组件中引入了子组件,然后又在子组件中插入了插槽,如果插槽中引入了属性,例如:
//父组件中
<current-user>
{{ user.firstName }}
</current-user>
此时的user属性只能引入的是父组件中的user属性,而不是子组件
这是vue的一个规则:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的
那么,如何在父组件中引用子组件的数据呢?
这就需要使用到作用域插槽:
在子组件childCpn中:
<slot v-bind:user="user">
默认文字
</slot>
在父组件中:
<childCpn>
<template v-slot:default="slotProps">
{{ slotProps.user}}
</template>
</childCpn>
这样使用插槽时,就可以在父组件中直接使用了子组件的属性
所以回到一开始的问题,代码可以写成如下形式:
<v-menu>
<template v-slot:activator="slotProps">
<v-btn v-bind="slotProps.attrs" v-on="slotProps.on">按钮</v-btn>
</template>
</v-menu>
通过获取到了子组件的属性,然后就可以在父组件中直接使用了
另外,作用域插槽的内部工作原理是将你的插槽内容包括在一个传入单个参数的函数里:
function (slotProps) {
// 插槽内容
}
这意味着 v-slot 的值实际上可以是任何能够作为函数定义中的参数的 JavaScript 表达式。所以在支持的环境下(比如支持ES6的浏览器),也可以使用 ES6 解构来传入具体的插槽 prop,如下:
<v-menu>
<template v-slot:activator="{ on, attrs }">
<v-btn v-bind="attrs" v-on="on">按钮</v-btn>
</template>
</v-menu>
这样的写法更加简洁明了
(关于解构语法不懂的可以去百度一下了解学习)
部分转载自https://blog.csdn.net/weixin_44710964/article/details/107428727
vue.js+vuetify学习开发排坑:一个古怪的代码 v-slot:activator="{ on, attrs }"的更多相关文章
- 创建Vue.js对象:我的第一个Vue.js输出信息
<!DOCTYPE html><html><head><meta charset=”utf-8″><title>Vue第一条信息</t ...
- Vue.js实战学习笔记(中)
1.递归组件给组件设置name属性,组件就可以在它的模板内调用自己,但必须给一个条件来限制递归数量.<div id="app"> <child-component ...
- vue.js 初步学习
跟着b站上的视频来学 首先什么是vue.js? 跟着b站上视频来学:(o゚v゚)ノ <!DOCTYPE html> <html lang="en"> < ...
- Vue.JS入门学习随笔
PS:先说说学习Vue的缘由吧,学习完了React之后,突然发现又出了一款叫做vue的框架,而且据说可以引领又一波新框架的潮流,我容易吗我!!! Vue.js(读音 /vjuː/, 类似于view ...
- 从零开始学习Vue.js,学习笔记
一.为什么学习vue.js methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节. vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn ...
- vue.js的学习中的简单案例
今天学习了近年来挺火的一门JS技术,叫vue.js下面是它的一个简单案例: <html> <head> <title>$Title$</title> / ...
- vue.js的学习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Vue.js中学习使用Vuex详解
在SPA单页面组件的开发中 Vue的vuex和React的Redux 都统称为同一状态管理,个人的理解是全局状态管理更合适:简单的理解就是你在state中定义了一个数据之后,你可以在所在项目中的任何一 ...
- web前端——Vue.js基础学习
近期项目的前端页面准备引入Vue.js,看了网上一些简介,及它和JQuery的对比,发现对于新入门的前端开发来说,Vue 其实也是比较适用的一个框架,其实用性不比JQuery差,感觉还挺有意思,于是研 ...
- Electron: 如何以 Vue.js, Vuetify 开始应用
Electron: 使用 JavaScript, HTML 和 CSS 等 Web 技术创建原生程序的框架 Vue.js: Web 前端用于构建用户界面的渐进式框架 Vuetify: Vue.js 的 ...
随机推荐
- Delphi 禁止重复运行程序的方法
第一种方法,使用"过程调用" procedure Del; // 自定义过程 var Mutex: THandle; begin Mutex := CreateMutex(nil, ...
- LLM应用落地实施手册
背景 自ChatGPT诞生以来,各个企业都开始尝试引入LLM落地实施"智能"应用,而目前并没有太多文章系统地介绍应该怎么落地实施一个基于LLM的应用,到底应该做哪些步骤.本人从20 ...
- [源码系列:手写spring] IOC第七节:加载xml文件中定义的Bean
目录 主要内容 代码分支 核心代码 BeanDefinitionReader AbstractBeanDefinitionReader XmlBeanDefinitionReader 测试 bean定 ...
- 【Web】支持纯静态的Layuimini版本
支持纯静态的Layuimini版本 本人做了点小小的改动,在来的基础上添加了对静态的支持. 零.起因 要做个项目,但是用的是JSP,想着用Layui,然后去找模板,发现这个Layuimini.但是这个 ...
- sql server2005的死锁
select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tra ...
- Go操作MySQL总结
1.下载驱动包 打开GoLand->Terminal,输入:go get github.com/go-sql-driver/mysql 2.编写代码 package mainimport ( & ...
- 如果 MySQL 中没有 MVCC,会有什么影响?
如果 MySQL 中没有 MVCC,会有什么影响? MVCC(Multi-Version Concurrency Control) 是 MySQL(尤其是 InnoDB 存储引擎)中一个至关重要的并发 ...
- Python日志模块Logging使用指北
Python日志模块Logging使用指北 作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 Logging模块是Python中一个很重要的日志模块,它提供了灵活 ...
- 查询相册更加mysql 查询
接到一个项目项目案例相册是这种结构 大佬建议 sql 查询 groip 进行时间统计今天 field根据mysql 时间查询进行统计 今天多少条 新增多少条相册 计算天数 $lists = Album ...
- 腾讯云短信发送【java】
先去官网申请secretId, secretKey,然后创建对应的模板 maven引入包 <dependency> <groupId>com.tencentcloudapi&l ...