vue-组件注册及使用

news2024/12/28 20:50:00

​🌈个人主页:前端青山
🔥系列专栏: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等)则会合并成一个对象属性,如对象属性中的属性存在同名则以组件自身的为准

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

删除快一年的数据,能够恢复吗?

在数字化时代&#xff0c;数据已经成为了企业和个人生活中不可或缺的一部分。然而&#xff0c;由于各种原因&#xff0c;我们有时会需要删除某些数据&#xff0c;比如过期的文件、无用的照片或者账号下的旧信息等。但是&#xff0c;当我们删除这些数据后&#xff0c;是否真的能…

一个车厢号码识别算法(2005年的老程序----ccc)

一个车厢号码识别算法&#xff08;2005年的老程序----ccc&#xff09; 2023-09-18 ccc 程序的识别效果 对图中的车厢号码部分用上下两条线限定分为&#xff0c;然后进行识别。 从上面的识别效果可以看出&#xff0c;识别算法具有一定的鲁棒性&#xff0c;能够适应车厢号码的各…

如何改变偏执的性格?

偏执不等同于固执和顽固&#xff0c;固执和顽固更多是好面子的因素&#xff0c;是自尊心的一种表现&#xff0c;而偏执更多是表示处于“不知”的心理状态。当然这里仅仅是讨论性格上的偏执&#xff0c;从性格的角度来分析&#xff0c;如果从精神角度来分析偏执那就比较严重了&a…

在以BUF,字节存储区中,存放有n个带符号整数。试编写统计其中负偶数个数(假设≤9)并且显示。

;默认认采用ML6.11汇编程序 DATAS SEGMENT;此处输入数据段代码BUF DB -2,2,3,4,-4N$-BUF DATAS ENDS STACKS SEGMENT;此处处输入堆栈段代码 STACKS ENDS CODES SEGMENTASSUME CS:CODES,DS: DATAS, SS:STACKS START:MOV AX, DATASMOV DS,AXMOV BX,0MOV CX,0 LOP: mov AX,[BX] RO…

2023.11-9 hive数据仓库,概念,架构,元数据管理模式

目录 0.数据仓库和数据库 数据仓库和数据库的区别 数据仓库基础三层架构 一.HDFS、HBase、Hive的区别 二.大数据相关软件 三. Hive 的优缺点 1&#xff09;优点 2&#xff09;缺点 四. Hive 和数据库比较 1&#xff09;查询语言 2&#xff09;数据更新 3&#xff09;…

Misc | 相当于签到 第二届“奇安信”杯网络安全技能竞赛

题目描述&#xff1a; 图片似乎经过了什么处理&#xff0c;你能否将其复原呢&#xff1f; 密文&#xff1a; 下载附件&#xff0c;解压得到一张.jpg图片。 解题思路&#xff1a; 1、一张图片&#xff0c;典型的图片隐写。放到Kali中&#xff0c;使用binwalk检测&#xff0c;确…

探索人工智能领域——每日30个名词详解【day2】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

JL-03小型气象站气象环境在线监测设备自动上传并保存数据

JL-03小型气象站产品概述 小型气象站用于对风速、风向、雨量、空气温度、空气湿度、太阳辐射、光照强度、土壤温度、土壤湿度、蒸发量、大气压力等气象要素进行现场监测。既可以通过无线通讯将数据传送至云平台&#xff0c;又可以通过配套的数据采集通讯线与计算机进行连接&am…

智能PDU在现代智慧医院机房末端配电系统中的应用分析

随着智慧医院的高速建设和发展&#xff0c;电子计算机及各类通讯设备在医院中广泛应用&#xff0c;医院信息化程度在不断提高&#xff0c;对医院内网、外网、无线网及设备网的稳定运行提出了更高的要求。信息机房作为医院所有网络数据存储交换的中心&#xff0c;它的7x24小时安…

操作系统——内存管理(一文搞懂操作系统的内存管理)

VIRT(虚拟内存)、RES(常驻内存)和SHR(共享内存) VIRT&#xff08;虚拟内存&#xff09; 进程“需要的”虚拟内存大小&#xff0c;包括进程使用的库、代码、数据&#xff0c;以及malloc、new分配的堆空间和分配的栈空间等&#xff1b;假如进程新申请10MB的内存&#xff0c;但实…

软考中级-软件设计师知识点

软考中级-软件设计师知识点 1. cpu、总线、io控制方式、寄存器2.cpu和dma3.海明码4.中断向量、中断响应时间、保存现场5.补码6.指令流水线计算公式7.存储器分类8.总线9.补码、移码10.漏洞扫描11.木马和病毒12.编译与反编译13.死锁判断14.数据库三大范式15.数据库连结和映射16.最…

Node-RED系列教程-28修改UI默认背景图片

主要使用到如下节点: 实现过程如下: 步骤1:编写背景图片请求服务. http in节点配置: 读文件节点配置: http out节点配置: 到此,背景图片请求服务搭建完成。

制作一本3D仿真翻页电子画册,精致又美观

3D仿真翻页电子画册&#xff0c;可能很多小伙伴都不知道是什么样子的&#xff0c;我用一个图例告诉大家&#xff0c;大家看完就知道3D仿真翻页电子画册到底是什么样子啦&#xff01; 随着人们生活水平的提高&#xff0c;审美也在发生着变化。很显然&#xff0c;之前那种简单的文…

如何搭建高性能地图(访问速度快、层级高、免费)

1、下载地图数据源 可以从很多市面上的地图供应商下载地图&#xff0c;如水经注、bigemap等&#xff0c;大部分层级能够达到19级&#xff0c;也即地图的空间分辨率能够达到0.6米&#xff0c;比如下面广州市的数据。如果数据量少&#xff0c;只需要一个城市或者几个城市的数据&…

遇到了别感到奇怪!这其实是python的三目运算!

三目运算定义 我们熟知的三目运算通常表达式是&#xff1a; 判断条件(返回布尔值) ? 为真的结果 &#xff1a;为假的结果。 Python中的三目运算 而在Python中的三目运算并无 ?和:的表达式这种形式。Python的三目运算符也被称为三元运算符&#xff0c;是一种简洁的条件表达…

MySQL最新2023年面试题及答案,汇总版(6)【MySQL最新2023年面试题及答案,汇总版-第三十六刊】

文章目录 MySQL最新2023年面试题及答案&#xff0c;汇总版(6)01、MySQL中DATETIME和TIMESTAMP的区别&#xff1f;02、简单描述MySQL中&#xff0c;索引&#xff0c;主键&#xff0c;唯一索引&#xff0c;联合索引的区别&#xff0c;对数据库的性能有什么影响&#xff08;从读写…

基于蚁狮算法优化概率神经网络PNN的分类预测 - 附代码

基于蚁狮算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蚁狮算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蚁狮优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

Flipper Zero:极客的终极多功能工具,包含各种数据发射接收途径(硬件便携式工具)

Flipper Zero:极客的终极多功能工具(硬件便携式工具)。 Flipper Zero 是一款为极客、渗透测试者和硬件爱好者设计的终极多功能工具。这款口袋大小的设备集成了多种工具:RFID 读取、写入和模拟,RF/SDR 信号捕获和重放,红外线、HID模拟、GPIO、硬件调试、1-Wire、蓝牙、Wi…

kafka实践-热点数据展示

1 实时流式计算 1.1 概念 流式计算一般对实时性要求较高&#xff0c;同时一般是先定义目标计算&#xff0c;然后数据到来之后将计算逻辑应用于数据。同时为了提高计算效率&#xff0c;往往尽可能采用增量计算代替全量计算。也就是将数据先聚集在集中全量处理。 2.2 应用场景…

TCP连接出现大量CLOSE_WAIT不回收的问题排查

背景 日常运维过程中&#xff0c;收到“应用A”突然挂起没有处理请求的告警&#xff0c;然后触发“存活检查”不通过&#xff0c;自动重启了。 问题 为什么“应用A”突然挂起&#xff1f; 分析 排查过程很长&#xff0c;走了很多弯路&#xff0c;这里只列出本案例有效行动…