vue-组件注册及使用

​🌈个人主页:前端青山
🔥系列专栏:Vue篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来vue篇专栏内容-组件注册及使用

目录

1、组件的注册及使用

2、组件常用属性

2.1、directive

2.2、computed

2.3、watch

2.4、filter

2.5、mixin

1、组件的注册及使用

Vue的组件按照类型可以分为:

  • 全局组件:只要注册好,可以在项目中任意.vue文件中使用

  • 局部组件:主要注册好,可以在当前的.vue文件中使用

无论是全局组件还是局部组件,在使用时必须先对组件进行注册

全局组件通常在入口文件main.js中注册,注册语法:

Vue.component("组件名",组件对象)

局部组件根据需要,在需要使用外部组件的那个组件自身中注册,注册分为两部,先导入目标组件,然后再注册,示例如下:

import CompName from "path of Component"
export default {
    components: {
        // 标签名: CompName,
    }
}

当一个组件被注册好后,该组件就可以在对应的范围内被使用,使用时,将组件名以HTML标签语法进行使用即可:

<!-- 例如,某组件名为TabBar,则使用语法如下 -->
<template>
    <TabBar></TabBar>
</template>

由于组件在使用的时候按照标签语法进行使用,因此强烈建议在注册组件时强烈采用大驼峰命名法,以此来避免和html标签重复,例如有组件名Form的组件,在Vue及React中都是允许的,但是form这样的组件名慎用!

2、组件常用属性
2.1、directive

directive,该属性用于自定义指令

除了核心功能默认内置的指令,Vue也允许开发者注册自定义指令。

自定义指令可以分为两种情况:

  • 全局自定义指令【更加实用】

  • 局部自定义指令

当在某个组件内,自身的局部自定义指令与全局自定义指令冲突时,以组件自身的局部自定义指令为准。

指令是帮助我们快速完成某些处理的语法糖,其本质也就是一些拥有固定函数名称的函数集合,这些函数会在特定的时间触发并自动执行,我们称之为钩子函数。指令支持以下钩子函数:

bind,当指令首次与标签元素绑定的时候触发

inserted,当标签元素被插入完成后触发(与bind的区别在于是否可以获取父节点)

update,当标签元素更新时触发

componentUpdated,当组件更新完毕后触发

unbind,当指令与标签解绑时触发

在自定义指令时,我们必须要根据业务需要从上面几个钩子函数中选取一个或几个合适的钩子函数,并准备好逻辑代码组成一个JavaScript对象。钩子函数支持俩个形参:

  • el:指令宿主对应的DOM对象

  • binding:指令绑定对象,可以通过该对象获取指令的名称、指令表达式等信息

全局自定义指令的注册,通常也是在入口文件main.js中完成,但指令的处理程序在编写的时候允许模块化,也建议采用模块化来保持入口文件中的代码可读性。

Vue.directive("不带v-的指令名",包含指令处理程序的对象)

局部自定义指令通常注册在对应的组件自身,处理程序自身往往也不需要模块化,可以直接写在组件内,当然如果这个指令也需要在其它组件中使用也是可以模块化的:

export default {
    directives: {
        // 不带v-的指令名: 包含指令处理程序的对象,
    }
}

请注意,在自定义指令的方法中,不能像以前的methods中的方法一样使用关键词this,此时this关键词指向undefined

案例:使用自定义指令实现以下效果

  • 使用全局指令定义自定义的v-color(传参),在元素被插入时设置内容颜色

例如:<div v-color="'red'">文字</div>

此时指令语法如下:

// 指令实则是一堆钩子函数的集合
// 使用全局指令定义自定义的`v-color(传参)`,在元素被插入时设置内容颜色
const obj = {
  bind (el) {
    // 获取不到父节点
    console.log(el.parentNode)
  },
  inserted (el, binding) {
    console.log(el, binding)
    // 获取父节点
    console.log(el.parentNode)
    el.style.color = binding.value
  }
}
​
export default obj

需要在入口文件main.js中导入并注册指令:

import color from './directives/color'
// 全局指令注册语法:Vue.directive(指令名,指令对象)
Vue.directive('color', color)

在App.vue文件中测试全局指令的使用:

<template>
  <div>
    <!-- 全局指令测试 -->
    <div v-color="color">青山哥哥好帅啊</div>
    <div v-color="'green'">青山哥哥好帅啊</div>
    <div v-color="'blue'">青山哥哥好帅啊</div>
    <div v-color="'pink'">青山哥哥好帅啊</div>
    <div v-color="'orange'">青山哥哥好帅啊</div>
    <div v-color="'grey'">青山哥哥好帅啊</div>
  </div>
</template>
​
<script>
export default {
  data () {
    return {
      color: 'red'
    }
  },
}
</script>
​
<style></style>
  • 使用局部自定义指令实现v-mobile(不传参)验证用户输入的是否是合法的手机号,不合法时将输入框背景色设置成pink,边框设置成red;合法时,边框黑色,背景色白色。

2.2、computed

computed,该属性用于定义计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

<div id="example">
    {{ message.split('').reverse().join('') }}
    {{ message.split('').reverse().join('') }}
    {{ message.split('').reverse().join('') }}
</div>

在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。

所以,对于任何复杂逻辑,你都应当使用计算属性

如果我们使用一个计算属性,假定计算属性名字叫resverseMessage,那么我们可以将翻转message的工作交给该属性去完成,那么我们视图部分就可以这么写了:

<div id="example">
    <!-- 虽然模版简单了,但是针对数据的处理依然需要在计算属性声明的位置去书写,因此代码实际上没有减少。那么问题来了?我们为什么还推广建议使用计算属性呢? -->
    {{ reserseMessage }}
</div>

计算属性没有全局和局部之分,按照以下语法声明计算属性:

export default {
    computed: {
        // 计算属性名 : Function,
    }
}
计算属性默认只有 getter,不过在需要时你也可以提供一个setter:

export default {
    computed: {
        // 计算属性名 : { get: Function, set: Function },
    }
}
  • get:对应的函数在调用该计算属性时被执行

  • set:对应的函数在给该计算属性赋值时被执行,形参为赋的值

计算属性的结果会被缓存,除非依赖的响应式数据变化才会重新计算。注意,如果某个依赖 (比如非响应式 property) 在该实例范畴之外,则计算属性是不会被更新的。

2.3、watch

watch,该属性用于定义监听器/侦听器

使用watch来侦听data中数据的变化,watch中的属性(watch是对象格式)一定是data 中已经存在的数据。(特殊情况除外)

使用场景:数据变化时执行异步或开销比较大的操作

典型应用:在线汉字转拼音

监听器

监听器的语法如下:

export default {
    watch: {
        data中数据属性名: 函数名 | 函数 | 对象 | 回调函数数组,
    }
}
特别需要注意,如果监听的数据是一个对象,则需要使用深度监听语法:

export default {
    watch: {
        data中对象属性名: {
            deep: true,
            handler(val,oldVal){
                
            }
        }
    }
}

注意,不应该使用箭头函数来定义 watcher 函数

案例:给定三个输入框,第一个为姓输入框,第二个为名输入框,第三个为姓名组合结果框;要求当用户更新姓或名后,第三个输入框自动生成完整的姓名结果。

== 面试题:computed与watch有什么区别?? ==

  • 设计方式上的区别

    • 计算属性:依赖数据的,只要数据不变,它会套用固定的流程去执行。我们写好之后一劳永逸的。

    • 监听器:需要我们自己去写比较复杂的数据处理过程,比如说一些异步的操作、开销大的操作。

  • 响应方式上的区别

    • 计算属性:支持深度深度数据是否变化的监听的

    • 监听器:默认不支持深度响应,仅支持字面量处理,但是其支持通过代码的改动来支持深度监听

2.4、filter

filter,该属性用于定义过滤器

注意:filter仅在Vue2.x中支持,Vue3.x中已废弃,针对后者建议通过computed或methods来替代实现

前端呈现的页面中,不泛很多数据是来自于后端接口请求得到的响应,而有些时候响应给我们的数据格式未必符合我们的要求。例如,如果你做一个功能需要显示一个字符串名单,但是后端给你的名单格式是一个数组,那么此时v-for循环操作不太好操作,而我们需要实现数组字符串的格式转化,这个时候就可以使用过滤器来解决这个问题。

过滤器没有全局和局部之分,哪个组件需要使用则在对应的组件中声明即可,例如:

export default {
    filters: {
        过滤器名: Function,
    }
}

需要注意的是,过滤器对应的函数:

  • 至少有1个形参,形参为待处理的数据(任意格式)

  • 使用过滤器时,如果实参有n个,那么形参应该有n+1个;其中第一形参必定是待处理的数据,而后的形参与实参一一对应(例如:第二个形参对应着第一个实参,第三个形参对应着第二个实参....)

  • 必须有返回值

定义好过滤器后,过滤器就可以与插值表达式一起在视图结构中使用了:

{{表达式 | 过滤器名}}

过滤器可以传递实参:

{{表达式 | 过滤器名(实参1,实参2,...)}}

当然过滤器也可以被连续调用:

{{表达式 | 过滤器名1 | 过滤器名2 | ...}}

理论上来说,只要一个过滤器的表达式有输出,后面就可以继续调用,无长度限制。

案例:给定以下数组,请使用过滤器将其处理成目标显示效果,为了考虑兼容,如果插值没有数据,请返回固定语句进行提示

const actors = [
    {id: 11, name: "张三"},
    {id: 22, name: "李四"},
    {id: 33, name: "王麻子"},
    {id: 44, name: "青山哥哥"}
]

如果有数据则显示如下:

本剧主演:张三 李四 王麻子 青山哥哥

如果没有数据则显示如下:

本剧主演:暂无
2.5、mixin

mixin,该属性用于定义混入

mixin是Vue中非常实用的一个功能,它能够实现一些代码片段的复用,它可以将一个混入对象(js普通对象)中的Vue选项混入到被混入的Vue组件中去。混入操作按照类型可以分为:

  • 全局混入,全局混入也可以称之为叫强制混入

  • 局部混入,局部混入也可以称之为叫按需混入

全局混入会将混入对象的选项混入到所有的Vue组件中去,除非项目中每个组件都需要这些Vue选项,否则该操作方式慎用,因为其可能导致其它组件运行不正常。

定义混入对象,混入对象与常规的Vue选项对象的声明基本一致,假设混入对象名称为obj,则:

// 将要复用的选项放到混入对象中去
const obj = {
    methods: {}
    data(){
        return {}
    },
    filters: {
            
    },
    computed: {
        
    },
    // ....
}

它不一定需要所有的Vue选项,需要什么根据复用的需求而定,需要复用什么选项写入进去即可。但是由于工程化下整个项目共用一个Vue的el选项,因此混入对象中一般不会有el选项。

全局混入语法:

Vue.mixin(混入对象)

局部混入语法:

export default {
    mixins: [混入对象1,混入对象2,....]
}

在一个混入对象被混入到一个组件的时候,混入对象中的选项可能与组件自身的选项存在冲突的情况,例如混入对象中的data中有一个msg属性,而组件自身的data中也有msg属性,在这种情况下,混入操作会按照固定的合并策略进行冲突合并:

  • 如果冲突发生在data中,则以组件自身的data数据为准

  • 如果是对象属性发生冲突(如methods、computed、filters等)则会合并成一个对象属性,如对象属性中的属性存在同名则以组件自身的为准

  • 如果是钩子函数出现同名冲突,则混入对象中的钩子函数会与本组件自身的钩子函数合并成数组,所有钩子函数均会被执行,但同周期的钩子函数在执行的时候混入对象中的钩子函数会优先于本组件的钩子函数执行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲

这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务&#xff0c;但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对&#xff0c;似乎没写错误处理的文章。后面补上。 首先&…

低功耗蓝牙技术 > GAP和GATT介绍

GAP&#xff08;Generic Access Profile&#xff09;和GATT&#xff08;Generic Attribute Profile&#xff09;简介 在蓝牙技术的发展中&#xff0c;GAP和GATT两个协议扮演着关键的角色&#xff0c;为BLE&#xff08;低功耗蓝牙&#xff09;设备之间的通信提供了规范和框架。…

IPSec案例部署

项目拓扑与项目求 项目需求 某企业网络使用ospf作为IGP协议实现内部网络的互联互通&#xff0c;区域规划和IP规划如图所示&#xff0c;现在要求实现如下需求&#xff1a; 公司总部和分支之间互访&#xff0c;使用IPSec VPN传递流量&#xff0c;并且对其加密&#xff0c;公司内…

IntellJ IDEA利用spring initializr创建springboot项目

maven仓库修改镜像源 idea会默认从.m2目录下读取maven配置信息&#xff0c;若没有setting.xml则从maven安装目录拷贝一个setting.xml到这里 在xml中添加阿里云镜像源 <mirrors><mirror> <id>nexus-aliyun</id> <name>nexus-aliyu…

鸿蒙原生应用开发-DevEco Studio中HarmonyOS与OpenHarmony项目的切换

一、找到该目录 二、修改操作系统类型 三、分别进行开发&#xff0c;一些常规的应用功能实现后&#xff0c;相互切换后都可以正常运行的。前期OpenHarmony项目如果连接开发板比较困难的化&#xff0c;开发完成后&#xff0c;切换成为HarmonyOS后就可以比较详细地看看效果了。

FNPLicensingService.exe 总提示要联网

目录预览 一、问题描述二、原因分析三、解决方案&#xff1a;四、参考链接 一、问题描述 FNPLicensingService.exe 总提示要联网 找到路径如下&#xff1a; C:\Program Files (x86)\Common Files\Macrovision Shared\FlexNet Publisher然而从文件目录来看&#xff0c;并没有…

智能电网线路阻抗模拟负载的工作原理

智能电网线路阻抗模拟负载是一种用于测试和评估电网线路性能的技术&#xff0c;它的工作原理是通过模拟负载来模拟实际负载对电网的影响&#xff0c;以便评估电网的稳定性和可靠性&#xff0c;智能电网线路阻抗模拟负载通常由电子设备和控制系统组成。电子设备主要包括电阻、电…

OLED透明屏在智慧零售场景的应用

OLED透明屏在智慧零售场景中的应用主要包括以下几个方面&#xff1a; 商品展示&#xff1a;OLED透明屏可以作为商品展示窗口&#xff0c;使得产品可以在玻璃的透明表面上直接呈现展示&#xff0c;同时显示相关的文字和视频广告信息。这种宣传模式可以更加吸引顾客注意力&#…

高性能图表库LightningChart JS v5.0 - 轻松实现图表自定义布局

LightningChart JS是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画。 点击获取LightningChart JS v5.0正式版下载 LightningChart JS …

瑞吉外卖Day03

小张推荐:瑞吉外卖Day02 1.启用/禁用员工账号 1.1 思路分析 1.2Controller层 PutMapping()public R<String> update(RequestBody Employee employee, HttpServletRequest request) {log.info(employee.toString());Long emp (Long) request.getSession().getAttribu…

聚力未来!云起无垠成为光合组织成员单位

近日&#xff0c;云起无垠正式加入海光产业生态合作组织&#xff08;简称“光合组织”&#xff09;。云起无垠将与光合组织联合打造安全、好用、开放的产品与解决方案&#xff0c;满足企业的安全检测需求&#xff0c;帮助企业解决业务系统上线前的安全检测和修复问题。 图1 光合…

未来之光:十八数藏的文化数字化新篇章

在时代的浪潮中&#xff0c;十八数藏显现出文化数字化的新时代光芒。这一数字化的新篇章不仅仅是对传统文化的延续&#xff0c;更是一场对未来的引领。通过数字化&#xff0c;十八数藏打开了文化传承的崭新大门&#xff0c;为传统工艺注入了新的生命力。 数字技术为十八数藏带来…

培养财务团队协作,冲破市场经济逆境

在过去&#xff0c;企业财务发展道路上往往只有分析师&#xff0c;财务分析也十分简单&#xff0c;只需要业务上挖掘部分有用数据或做一些简单的“数学题”。这些内容都是由财务分析师来完成的。但随着科技发展、大数据时代的到来&#xff0c;越来越多的企业发现还有许多其他未…

2019年五一杯数学建模A题让标枪飞解题全过程文档及程序

2020年五一杯数学建模 A题 让标枪飞 原题再现 标枪的投掷是一项历史悠久的田径比赛项目。标枪投掷距离的远近受到运动员水平&#xff08;出手速度、出手角、初始攻角、出手高度、出手时标枪的初始俯仰角速度等&#xff09;&#xff0c;标枪的技术参数&#xff08;标枪的长度、…

Electronica Samtec展台连接器Demo回顾 | 224Gbps PAM4:令人瞠目的速率

【摘要/前言】 最近&#xff0c;我们正在为大家带来2023慕尼黑上海电子展虎家展台Demo演示回顾系列。 今天虎家工程师团队再次为大家带来系列第一期&#xff1a; 我们邀请到了合作伙伴Keysight&#xff0c;与我们一同带来了Samtec NovaRay高密度、高性能阵列连接器以及Keysig…

车载通信与DDS标准解读系列(1):DDS-RPC

▎RPC & DDS-RPC RPC&#xff1a;Remote Procedure Call&#xff0c;远程过程调用。 远程过程调用是一种进程间通信&#xff0c;它允许计算机程序在另一个地址空间中执行子程序&#xff0c;就好像用别人的东西像用自己的一样&#xff0c;常用于分布式系统。 远程过程调用…

Cesium 实战 - 调整饱和度、对比度等参数,加载夜晚模式

Cesium 实战 - 调整饱和度、对比度等参数&#xff0c;加载夜晚模式 渲染美化影像底图核心代码完整代码&#xff1a;在线示例 三维地图夜晚模式一般用于大屏展示以及体现晚上效果。 设置参与跟暗黑模式类似&#xff0c;只是这里加了大气参数。 本文包括渲染美化影像底图核心代…

Leetcode—122.买卖股票的最佳时机II【中等】

2023每日刷题&#xff08;二十八&#xff09; Leetcode—122.买卖股票的最佳时机II 实现代码 int maxProfit(int* prices, int pricesSize) {int totalProfit 0;if(pricesSize < 1) {return 0;}for(int i 1; i < pricesSize; i) {if(prices[i] - prices[i - 1] > …

RabbitMq防止消息丢失

RabbitMq防止消息丢失 消息的传递路径出现消息丢失的位置解决 消息的传递路径 消息发送方 --> MQ --> 消息消费方 出现消息丢失的位置 消息发送方: 消息传输过程中丢失MQ: MQ收到消息后,存在内存中,还未被消费就宕机了,导致数据丢失消息消费方: 消息到达消费方后, 服务…

CentOS 7镜像下载;VMware安装CentOS 7;解决新安装的虚拟机没有网络,无法ping通网络的问题

CentOS 7镜像下载&#xff1b;VMware安装CentOS 8.5&#xff1b;解决新安装的虚拟机没有网络&#xff0c;无法ping通网络的问题 CentOS 8.5镜像下载VMware安装CentOS 7解决新安装的虚拟机没有网络&#xff0c;无法ping通网络的问题写入配置文件 CentOS 8.5镜像下载 阿里提供的…