【2】浅析Vue组件

2023-10-30

组件的基本概念

Vue中有一个概念叫做组件化,就是把页面分成一个个小的部分,每个部分有自己的功能,且可以复用。最外层的组件即根组件,除此之外会有很多子组件。子组件分为两种,全局组件和局部组件:

全局组件,用 Vue.component(组件名,{}) 这种方法创建,在根组件接管范围内可以用组件名当标签名的方式直接使用。

Vue.component('item',{
    props:[],
    template: "<p>{{x}}</p>",
    data:function(){
        return{
            x:"hello"
        }
    },
    methods:{
        func:function(){}
    }
})

子组件与根组件不同的几个点在于:

  • 有一个props用于接收父组件传来的值
  • 有一个template,其值是定义的HTML模板,在使用组件时显示的就是这个模板
  • 子组件的data是一个函数,其中返回一个对象,在这个对象中定义数据
  • 局部组件的创建直接用对象形式,必须要在根实例的components中注册才能使用,其他方面和全局组件相同

is属性

因为在某些标签内,只允许出现特定的标签(如ul标签内只有li标签是有效的),因此使用子组件的模板时可能会引起解析错误,这时就要给标签添加is属性来解决这个问题:

<li is="item"></li>

使用is属性有两种方法,将子组件在components中注册后,用is="组件名"的方法;或是将子组件在data中注册,再用 :is="变量名"的方法使用。

通过后一种绑定方式,我们可以实现动态组件。即,将变量指向不同的组件,页面的内容也就跟着改变了。

给模板添加引用

通过传统的getElementById的方法不方便拿到子组件对应的节点,因此在组件的模板中,可以给标签加上一个ref属性ref=“引用名”,然后通过this.$refs.引用名就可以拿到这个DOM节点。这个方法对于普通标签同样适用。

v-once指令

组件第一次创建时会存入内存中,当再次调用该组件时不会重新创建组件,而是直接从内存中取。在标签中直接添加v-once即可,不需赋值

插槽

  1. 使用场景:在定义模板时,其中某一部分的具体内容还未确定,在使用子组件时再传入这一部分内容。
  2. 使用方法:在相应的位置用表示插槽占位,在使用模板时在模板内部传入内容,就会渲染到slot的位置。若模板中没有slot标签,使用子组件时,开始标签和结束标签间的内容将会被抛弃。
  3. 默认值:在slot标签内部可以提供html代码作为默认值,若在使用模板时没有传入内容,则显示默认值
  4. 具名插槽:当模板中出现了多个插槽时使用,在模板中给slot标签添加属性name=“slotName”。使用模板时,将传给插槽的内容包裹在template标签中,并为其添加属性v-slot:slotName
  5. 作用域插槽:让插槽内容能够访问子组件中才有的数据。模板向插槽中传入数据,但DOM结构在调用时决定。调用组件时向插槽传入的内容必须在外层包裹一个template标签,且该标签有一个slot-scope属性,其值接收模板传递来数据(接收到的是一个对象,用属性名获取到传来的值)
    传递给模板的数据用v-bind绑定至一个新的变量。
<body>
	<div id='box'>
		<it>
			<template slot-scope="props">
				<h1>{{props.con}}</h1>
			</template>
		</it>
	</div>
	<script>
		Vue.component('it',{
			data:function(){
				return{
					text:['aa','bb']
				}
			},
			template:`
					<div>
						<slot v-for="item in text" :con="item"></slot>
					</div>
			         `
		})
		var vm=new Vue({
                    el:"#box"
                })
	</script>
</body>

组件间的传值

1. 父组件=>子组件

前面讲指令时已经说到过,v-bind指令可以用来接收父组件传给子组件的值,如要将父组件数组的值都存入子组件数组:

<p v-for="item in list" v-bind:content="item"></p>

再在子组件的props中定义content即可。

单向数据流:父组件传给子组件的值,不能在子组件中修改。如果确实需要修改,则在子组件中定义一个变量接收这个值,并在后续过程中修改这个变量。

参数校验:在子组件中对父组件传来的值进行约束,此时将子组件的props写为对象而不是数组,对象的每个键表示接收的数据,值有几种写法:

  • 可以直接写为规定的类型(如String),注意不需要加引号
  • 可以写成数组形式,表示值可以是里面任意一种类型
  • 可以写成对象模式
    在这里插入图片描述
  1. type:规定的接收类型

  2. required:是否必须。值为true表示必须传入这个值

  3. default:没有传入这个值时该变量的默认值

  4. validator:通过一个函数判断传入值是否符合要求

2. 子组件=>父组件

通过$emit(“自定义事件名”,参数)的方式向外触发事件,在父组件中添加响应函数,可使用子组件传递出的参数

监听自定义事件的方法:在子组件标签上用@事件名 或.$on(事件名,响应函数)的方法进行事件监听

3. 非父子组件传值

非父子组件的传值,使用发布订阅模式,也叫总线模式。即将要传递的值挂载到总线上,其他任何要接收这个值的地方都可以通过总线获取这个值

创建bus属性: Vue.prototype.bus=new Vue()
需要传值时,在组件时间触发的函数中用this.bus.$emit(‘自定义事件名’,参数)向外方法触发自定义事件,需要传递的数据可以作为参数
在需要接收的地方,用this.bus.$on()方法接收传递来的事件(这部分代码可放在生命周期函数中)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【2】浅析Vue组件 的相关文章

  • 动态加载css的方法

    我很早就知道 您可以使用 addRule 和 insertRule 动态地将样式规则加载到页面中 具体取决于它是 IE 还是兼容标准的浏览器 但我刚刚发现 在 Chrome 上 一种更通用 对我来说 的方法效果很好 创建一个 style 元
  • GWT - onClick 未触发

    我在表单上有一个非常奇怪的行为 有许多具有内联验证的文本字段 如果内容无效 则会在字段下方显示错误消息 验证在模糊时触发 页面底部有一个 下一步 按钮 单击后 将执行验证 如果一切正常 则提交表单 现在 如果当我单击按钮时强制空白字段具有焦
  • 让 GTM 代码在 Web 应用程序上运行

    我们公司的职业 工作网站使用第三方服务 允许用户提交职位发布申请 最初 用户登陆一个与 GTM 完美集成的外部平台 在 CMS 中 您可以轻松地将 GTM 代码添加到标题和正文区域 然而 一旦用户点击职位描述上的 应用 他们就会被重定向到一
  • Google 地图自动完成 - 最多 3 个字符类型

    我已经实现了带有搜索框的谷歌地图 它允许用户通过搜索来选择地址 在该搜索框中 即使我输入 1 个字符 它也会进行搜索 我希望用户至少输入 3 个字符 否则它不应该进行搜索 My JS Fiddle is http jsfiddle net
  • 如何限制注册用户尝试投票两次[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 php 编码和网站设计非常陌生 我正在尝试开发一个在线投票系统 只允许注册用户投票 已完成所有操作并且工作正常 但我需要的帮助是
  • underscore.js 中断路器的重要性是什么? [复制]

    这个问题在这里已经有答案了 In 下划线 js http underscorejs org docs underscore html 有这样的代码 if iterator call context obj keys i keys i obj
  • 如何跨页面播放背景音乐

    我已经读过这个问题 我知道它只能用框架来完成 我真的不想要全站点 AJAX 如何在多个 HTML 页面上播放背景音频 https stackoverflow com questions 4210370 how to play a backg
  • 如何从 JQuery - IonRangeSlider 获取值?

    我怎样才能得到低值和高值ion rangeSlider http ionden com a plugins ion rangeSlider en html通过单击按钮来组件 这是我的 jQuery 代码
  • HTML 5 视频:使用 javascript 播放多个“剪辑”

    我在 HTML 视频和 JavaScript 方面遇到问题 因此编写了一些简单的代码来演示 有一个视频包含三个 剪辑 全长五秒 显然 在现实世界中 它们要长得多 一个在 25 30 秒 一个在 55 60 秒 最后一个在 85 90 秒 我
  • 如何并排展开和折叠三个div?

    document ready function toggle click function if this data name show sidebar animate width 10 hide map animate width 89
  • 删除添加空值的Javascript对象项[重复]

    这个问题在这里已经有答案了 我有一个 JavaScript 对象 finalTitleList Title ffd Iscompleted Id 0 Title fdfmdbk Iscompleted Id 1 Title fdf d Is
  • 单击

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道如何用 jquery 做到这一点 但我被 React 困住了 每当用户点击 div 时 我如何聚焦输入字段 你需要有一个onCl
  • 我想在数据表中使用 Div 结构而不是 Table。是否可以?

    我想用数据表 https datatables net 用div结构代替表格 目的是满足设计要求 有什么可能的方法或替代方案吗 不 您将无法执行此操作 Datatables 的核心仅适用于表格元素和子 thead tbody tfooter
  • 没有 jQuery 的纯 CSS 工具提示[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用纯 CSS 创建 工具提示尾部 https stackoverflow com questions 5623072 how can i create a tooltip tail using
  • 保持 WebSocket 连接处于活动状态

    我正在研究 WebSocket 协议 并尝试在后端使用 Python 实现一个简单的 ECHO 服务 它似乎工作正常 但连接建立后立即断开 这是我的客户
  • 如何确定特定时间是否在javascript中给定时间范围之间

    我想检查两个时间 var open time 和 var close time 之间的 var check val var open time 23 30 var close time 06 30 var check val 02 30 i
  • 利用源映射的堆栈跟踪

    概述 浏览器控制台中的堆栈跟踪输出与调用 Error stack 时返回的跟踪不同 控制台堆栈跟踪似乎考虑了源映射 而 Error stack 堆栈跟踪则没有 控制台输出这是输出到控制台的默认堆栈跟踪 Uncaught TypeError
  • 如何以编程方式将 CSS 定义应用到整个页面?

    我确信该信息已经存在 但我找不到它 对不起 我想使用 JavaScript 创建 CSS 规则 并将它们应用到整个页面 就像它们位于文档头部的样式元素中一样 我不想通过生成 CSS 文本来实现 我想将规则保留为可以更改的实体 JavaScr
  • 如何使用 PHP 读取/显示 XML

    有没有办法使用 PHP 读取 external xml 来自不同网站的 xml 文件 我知道有一种方法可以使用 JavaScript 读取 XML 但前提是它们都位于同一根目录中 您能否提供有关如何获取 xml 文件的示例 然后阅读以下内容
  • 如何在javascript中访问请求查询字符串参数?

    我见过许多利用 RegEx 的解决方案 坦率地说 这似乎有些可笑 因为 javascript 是如此通用 必须有一种更简单的方法来访问请求参数 有人可以给我演示一下吗 我发现了一个有用的方法网的深度 http www dotnetbull

随机推荐

  • fastgithub

    之前我在网上搜过解决办法 其中一个是修改 hosts 文件 但是效果不太理想 我在这里给大家推荐github上的一个开源项目 FastGithub 用了这个之后 效果就比较理想了 次次都能访问到 源码地址 GitHub dotnetcore
  • 简易虚拟培训系统-UI控件的应用2

    目录 Text组件 文字显示 Text组件 文字动态显示 ScrollView组件 使用文件流动态读取硬盘文件 本篇介绍Text和ScrollView的简单应用 以及读取硬盘中 txt文本的内容 Text组件 文字显示 1 加入Text 在
  • 小程序导入npm包 注意事项

    官方api https developers weixin qq com miniprogram dev devtools npm html 1 需要在小程序文件夹 npm init 2 安装需要的npm包 先安装需要的npm 包在构建np
  • 解释器与编译器区别

    让我们看看编译器和解释器之间的主要区别 1 编译器将一个程序作为一个整体进行翻译 而解释器则一条一条地翻译一个程序 2 在编译器的情况下生成中间代码或目标代码 而解释器不创建中间代码 3 编译器比解释器要快得多 因为编译器一次完成整个程序
  • Java基础面试题附带答案(八)

    106字节流和字符流的区别 1 字节流读取的时候 读到一个字节就返回一个字节 字符流读取的时候会读到一个或多个字节 这个要根据字符流中编码设置 一般中文对应的字节数是两个 在UTF 8码表中是3个字节 2 字节流可以处理所有类型数据 如 图
  • Unity如何开发微信小游戏

    微信小游戏现在非常的火 很多开发Unity的同学 都想自己开发微信小游戏 无奈tiny还不成熟 导致很多同学有自己创业做微信小游戏的想法 但是由于技术 却放弃了这样的机会 今天我给大家讲述unity同学如何转型做微信小游戏 1 解放思想 我
  • angular使用websocket和Rxjs

    文章目录 前言 一 Websocket是什么 二 在服务端搭建websocket服务 三 使用rxjs中的websocketsubject 1 使用websocket 2 搭建服务 3 如何拦截到socket关闭 4 如何断线重连 5 如何
  • 运行时动态库:not found 及介绍-linux的-Wl,-rpath命令

    一 运行时动态库 not found 今天在使用linux编写c c 程序时 需要用到第三方的动态库文件 刚开始编译完后 运行提示找不到动态库文件 我就使用了ldd命令查看了一下 发现是有一个库文件显示 not found 如下图所示 库文
  • 法兰克焊接机器人编程入门_Fanuc焊接机器人编程实例

    L 11 89 IF R 2 2 JMP LBL 12 90 IF R 2 3 JMP LBL 13 91 IF R 2 4 JMP LBL 14 92 IF R 2 5 JMP LBL 15 93 IF R 2 6 JMP LBL 16
  • CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate‘.To initi

    看起来你的shell没有正确配置使用conda activate命令 这可能是因为你在安装Anaconda时没有选择将其添加到系统路径中 解决这个问题的方法是运行conda init
  • Power BI第三方图表

    KPI类 Bullet Chart 子弹图 用来展现目标完成率 可定义红 黄 绿区域 Bullet Chart by OKViz 以垂直或水平形式展现目标达成情况 同时可以显示多个指标 Card with States by OKViz 一
  • 钉钉开放平台查询宜搭表单实例数据

    本例结合钉钉开放平台相关api实现获取宜搭表单数据 可在faas中做实现 本例采用python编写 已在本地实现 对于免登获取数据 数据归档到本地能提供参考 faas具体实现请根据实际 参考使用 采用alibabacloud dingtal
  • 【16种重要流操作】

    文章目录 前言 一 16种重要流是什么 二 输入输出流模型化 1 输入流操作 2 输出流操作 三 16种输入输出流 代码通 总结 前言 输入输出流的使用已经非常的广泛 除过采用了不同的类操作 其方法大同小异 下文针对16种重要的流进行分解
  • openEuler-22.03-LTS 安装与配置笔记

    镜像下载与安装 openEuler下载页 镜像下载 下载镜像 wget c https repo openeuler org openEuler 22 03 LTS ISO x86 64 openEuler 22 03 LTS x86 64
  • Recall, Precision, AP, mAP的计算方法(看一次就懂系列)

    Recall Precision AP mAP的计算方法 看一次就懂系列 mAP全称是mean Average Precision 这里的Average Precision 是在不同recall下计算得到的 所以要知道什么是mAP 要先了解
  • Vue的动画和过渡效果详解

    产品中优雅的交互动画可以吸引更多用户留存使用 对于前端的动画实现要求也越来越高了 在Vue中提供了一些快捷 方便的标签和内置属性来更加优雅的实现动画和过渡效果 今天我们来一起学习一下 基础动画效果 公众号 Code程序人生 个人网站 htt
  • 视频生成: 基于Stable Diffusion的微调方法

    chatGPT带来了几个月的AIGC热度 文本图像生成模型大行其道 但AI在视频生成任务上尚没有较好的开源仓库 并受限于 缺那么几百块A100 的资源问题 大多数人无法展开视频生成的研究 好在目前有不少针对视频生成的相关paper 也有不少
  • python在with open()函数中,如何在文件名设置中引用变量

    用format 函数 name wz age 25 with open C Users 0 1 txt format name age w encoding utf 8 as f1 f1 write hellow world 则文件名为 w
  • C++ 模板函数、模板类:如果没有被使用就不会被实例化

    C 中如果一个模板函数没有使用过 那么其局部静态变量都不会被实例化 class A public A edward print A ctor template
  • 【2】浅析Vue组件

    组件的基本概念 Vue中有一个概念叫做组件化 就是把页面分成一个个小的部分 每个部分有自己的功能 且可以复用 最外层的组件即根组件 除此之外会有很多子组件 子组件分为两种 全局组件和局部组件 全局组件 用 Vue component 组件名