vue3(六)-基础入门之自定义组件与插槽、ref通信

一、全局组件

html:

<div id="app"><mytemplace></mytemplace>
</div>

javascript:

<script>const { createApp } = Vueconst app = createApp({})app.component('mytemplace', {template: '<div><button>返回</button></div>'}).mount('#app')
</script>

结果展示:

在这里插入图片描述

二、局部组件

  • 局部组件只能在父组件中使用,其他组件无法使用该局部组件
  • 父组件与子组件属性和方法不能共享

html:

<div id="app"><mytemplate></mytemplate>
</div>

javascript:

<script>const { createApp, ref } = Vueconst app = createApp({})app.component('mytemplate', {template:'<div> <input type="text" v-model="inputText" /><childTemplate @click="buttonClk"></childTemplate><ul><li v-for="item in myDataList">{{ item }}</li></ul></div>',data() {return {myDataList: ['123', '123qwe', 'aaa'],inputText: ''}},methods: {buttonClk() {console.log('自定义组件-父组件点击事件')}},components: {childTemplate: {template: '<button @click="childButtonClk">点击</button>',methods: {childButtonClk() {console.log('自定义组件-子组件点击事件')}}}}}).mount('#app')
</script>

1.结果展示:

在这里插入图片描述

2.点击按钮输出结果:

在这里插入图片描述

三、父组件与子组件之间的传参

1、父传子

父传子通过属性向下传递:在子组件中自定义属性名,并传递相应的参数过去。子组件通过 props 接受传过来的参数

<body><div id="app"><mytemplace mypros="传递固定参数"></mytemplace><mytemplace :mypros="parentProps"></mytemplace><mytemplace :mypros="parentProps" :mypros1="parentProps1"></mytemplace></div><script src="./lib/vue.global.js"></script><script>const { createApp } = Vueconst app = createApp({data() {return {parentProps: '传递动态参数属性前加冒号',parentProps1: true}}})app.component('mytemplace', {template: '<div><button>{{mypros+"-"+mypros1}}</button></div>',//属性校验,指定参数类型props: {mypros: String,mypros1: Boolean}// props: ['mypros', 'mypros1']}).mount('#app')</script>
</body>

2、子传父

子传父通过事件传递参数:子组件的点击事件通过 this.$emit(父组件中自定义的事件名称, 传递的参数) 传递参数到父组件;父组件通过自定义事件接收参数

<body><div id="app"><mytemplace @myevent="parentClick($event)"></mytemplace></div><script src="./lib/vue.global.js"></script><script>const { createApp } = Vueconst app = createApp({methods: {parentClick(e) {console.log('父组件点击:' + e)}}})app.component('mytemplace', {data() {return { childProp: '子组件属性' }},template: '<div><button @click="childClick()">返回</button></div>',methods: {childClick() {this.$emit('myevent', this.childProp)}}}).mount('#app')</script>
</body>

四、slot 插槽

当需要在子组件标签中插入一个或多个父组件的标签时,需要在子组件中定义一个 slot 标签

1、具名插槽: 在子组件中通过 name 属性为插槽取名,在 template 标签中通过 v-slot:插槽名(或者:#插槽名) 选择对应的插槽

html :

<div id="app"><myslot><template v-slot:slot1>插槽1</template><template v-slot:slot2>插槽2</template><template #slot3>插槽3</template></myslot>
</div>

js :

<script>
const app = Vue.createApp({data () {return { chooseValue: 'component1' }},components: {myslot: {template:'<div><button>组件</button><input type="text"/><slot name="slot1"></slot><slot name="slot2"></slot><slot name="slot3"></slot></div>'}}
}).mount('#app')
</script>

2、默认内容: 当父组件没有内容替换插槽时,在 < slot > 标签中的内容回被视为默认内容显示出来

html :

<defaultslot> </defaultslot>

js :

const app = Vue.createApp({data () {return { chooseValue: 'component1' }},components: {defaultslot: {template:'<div><button>组件</button><input type="text"/><slot>默认内容</slot></div>'}}
}).mount('#app')

结果展示 :

在这里插入图片描述
3、动态插槽名: 通过 #[动态插槽名] (或者 v-slot:[动态插槽名]) 动态选择插槽(动态插槽名必须为小写

<myslot><template #[slotname]>插槽1</template>
</myslot><select v-model="slotname">
<option value="slot1">插槽1</option>
<option value="slot2">插槽2</option>
<option value="slot2">插槽3</option>
</select>
const app = Vue.createApp({data () {return { slotname: 'slot1' }},components: {myslot: {template:'<div><button>组件</button><input type="text"/><slot name="slot1">插槽11</slot><slot name="slot2">插槽22</slot><slot name="slot3">插槽33</slot></div>'}}
}).mount('#app')

A、结果展示:初始下拉框默认为插槽1,所以第一个插槽被替换,其他2个插槽使用默认内容

**在这里插入图片描述
--------------------------------------------------------------------------------------------------------------------------

B、结果展示:选择插槽2后,第二个插槽被替换,其他2个插槽使用默认内容
在这里插入图片描述
--------------------------------------------------------------------------------------------------------------------------

4、默认插槽传参

<scopeslot v-slot="slotvalue">{{ slotvalue.text }} {{ slotvalue.count }}
</scopeslot>
<script>
scopeslot: {data () {return { greetingMessage: 'hello' }},template: '<div><slot :text="greetingMessage" :count="1"></slot></div>'
}
</script>

结果展示:

在这里插入图片描述

5、具名插槽传参:

html :

<scopeslot1><template v-slot="info">{{ info.message }} {{ info.age }}</template><template #scope1="{message,age}">{{ message }} {{ age }}</template>
</scopeslot1>

js:

<script>
scopeslot1: {template:'<div><slot message="无名插槽" age="18"></slot>--<slot name="scope1" message="具名插槽" age="20"></slot></div>'
}
</script>

五、ref 通信

子组件(标签)中定义 ref 属性后,可以通过 this.$refs.ref属性名 获得子组件(标签)对象,从而获取子组件(标签)的控制权

<body><div id="app"><!-- 通过ref获取输入框的内容 --><input type="text" ref="myInputText" /><mytemplace ref="myRef"></mytemplace><button @click="parentClick">父组件点击事件</button></div><script src="./lib/vue.global.js"></script><script>const { createApp } = Vueconst app = createApp({data() {return { parentPro: 'refTest' }},methods: {parentClick() {this.$refs.myRef.childClick(this.parentPro)}}})app.component('mytemplace', {data() {return { childProp: '子组件属性' }},template: '<div><button @click="childClick()">返回</button></div>',methods: {childClick(e) {console.log('子组件点击事件', e)}}}).mount('#app')</script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/303434.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】OpenSSH ProxyCommand命令注入漏洞(CVE-2023-51385)

文章目录 前言一、漏洞背景二、漏洞详情三、影响范围四、漏洞验证 前言 OpenSSH存在命令注入漏洞&#xff08;CVE-2023-51385&#xff09;&#xff0c;攻击者可利用该漏洞注入恶意Shell字符导致命令注入。 一、漏洞背景 OpenSSH 是 SSH &#xff08;Secure SHell&#xff09…

[python]python使用M-LSD直线检测算法onnx部署模型实时检测

介绍 github地址&#xff1a;https://github.com/navervision/mlsd LSD (M-LSD)一种用于资源受限环境的实时轻量线段检测器。它利用了极其高效的 LSD 架构和新颖的训练方案&#xff0c;包括 SoL 增强和几何学习方案。模型可以在GPU、CPU甚至移动设备上实时运行。算法已开源&a…

数据库之MySQL的介绍

操作系统&#xff1a; windows&#xff1a;win10、win11、win7、windows Server2016 Linux/Unix &#xff1a;红帽&#xff08;RedHat&#xff09;、Bebian、SUSE MacOS Linux系统&#xff1a;CantOS&#xff08;yum、dnf&#xff09;、Ubuntu&#xff08;apt、apt—get&am…

如何使用设计模式来解决类与类之间调用过深的问题。

我们将使用责任链模式和装饰者模式的组合。 考虑一个简化的餐厅订单处理系统&#xff0c;其中包括服务员&#xff08;Waiter&#xff09;、厨师&#xff08;Chef&#xff09;和收银员&#xff08;Cashier&#xff09;。订单从服务员开始&#xff0c;然后传递给厨师&#xff0c…

【数据结构】六、树和二叉树

目录 一、树的基本概念 二、二叉树 2.1二叉树的性质 2.2二叉树的存储结构 2.3遍历二叉树 先序遍历 中序遍历 后序遍历 层次遍历 2.4二叉树的应用 计算叶子数 前序遍历建树 根据序列恢复二叉树 计算树的深度 判断完全二叉树 三、线索二叉树 3.1线索化 四、树和森林…

哔哩哔哩HarmonyOS服务卡片开发

#HarmonyOS征文#完整服务卡片项目开发&#xff0c;为Bilibili添加服务卡片。 项目预览视频播放地址 介绍 这是一款纯鸿蒙版的哔哩哔哩服务卡片应用。 6月2日鸿蒙发布&#xff0c;今年的六月已经被鸿蒙刷屏了。从安卓到鸿蒙&#xff0c;最直观的变化应该就是服务卡片了。我也…

Shell三剑客:awk(awk编辑编程)四

一、Break 结束循环 Break 结束循环实例 break[n]&#xff1a;当第n次循环到来后&#xff0c;结束整个循环&#xff0c;n0就是指本次循环当计算的和大于 50 的时候使用 break 结束循环&#xff1a; [rootlocalhost ~]# awk BEGIN { > sum0; for(i0;i<20;i) { > …

跟着LearnOpenGL学习12--光照贴图

文章目录 一、前言二、漫反射贴图三、镜面光贴图3.1、采样镜面光贴图 一、前言 在跟着LearnOpenGL学习11–材质中&#xff0c;我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xf…

UDP协议工作原理及实战(二)UDP客户端代码实现

这个是一个测试我们写的函数是否正确。 启动服务&#xff1a;这里边的udpsocket->bind(port)就是对端口号进行连接。

Neural Networks 期刊投稿指南

一 简介 这是国际神经网络学会、欧洲神经网络学会和日本神经网络学会的官方期刊。 论文类型 文章&#xff1a; 原创的、全文长度的文章将被考虑&#xff0c;前提是它们除了摘要形式外尚未发表&#xff0c;并且没有同时在其他地方进行审查。作者可以自愿但不是必须建议一位编辑…

【网络面试必问(9)】Web服务器处理Http请求消息及与客户端交互的原理

接上一篇&#xff1a;【网络面试必问&#xff08;8&#xff09;】防火墙原理、正向代理、反向代理、缓存服务器、负载均衡和内容分发服务器 这一篇&#xff0c;我们看一下请求消息的终点&#xff0c;Web服务器的程序结构。我们都知道&#xff0c;服务器会同时接收多个客户端的请…

组织框架概念澄清及表设计

组织 企业组织 企业组织就是企业正式编制&#xff0c;以单独的编制&#xff0c;是个人在企业所在的长久的家&#xff0c;类似于所说的考编&#xff0c;在企业体制内的位置&#xff0c;可能一个人在组织有不同的岗位&#xff0c;也可能有不同的项目组&#xff0c;但是&#xf…