vue组件基础及注册

1、组件的命名

  • kebab-case(短横线)命名法:字母全小写且必须包含一个连字符;例:my-component-name
  • PascalCase(帕斯卡)命名法:首字符大写;例:MyComponentName

在整个指引中,我们都使用 PascalCase 作为组件名的注册格式,这是因为:

  • PascalCase 是合法的 JavaScript 标识符。这使得在 JavaScript 中导入和注册组件都很容易,同时 IDE 也能提供较好的自动补全。
  • PascalCase 是合法的 JavaScript 标识符。这使得在 JavaScript 中导入和注册组件都很容易,同时 IDE 也能提供较好的自动补全。

< PascalCase /> 在模板中更明显地表明了这是一个 Vue 组件,而不是原生 HTML 元素。同时也能够将 Vue 组件和自定义元素 (web components) 区分开来。

在单文件组件和内联字符串模板中,我们都推荐这样做。但是,PascalCase 的标签名在 DOM 内模板中是不可用

2、组件的介绍

组件是可复用的Vue实例;
组件注册类型:全局注册、局部注册;

2.1、全局组件

vue2 全局组件 介绍

使用Vue.component 来创建组件;
全局注册的组件,注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中;
也可在任意子组件中使用;

vue3 全局组件 介绍

使用 Vue 应用实例的 .component() 方法,让组件在当前 Vue 应用中全局可用。
.component() 方法可以被链式调用。
全局注册的组件可以在此应用的任意组件的模板中使用,包括子组件;

2.2、局部组件

vue2 局部组件 介绍
全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。 在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件

1、通过一个普通的 JavaScript 对象来定义组件;
2、在 components 选项中定义你想要使用的组件;
3、对于 components 对象中的每个 property 来说,其 property 名就是自定义元素的名字,其 property 值就是这个组件的选项对象;如下例3.2.1:component-a为自定义元素名,ComponentA 为组件的对象名;
4、局部注册的组件在其子组件中不可用;如需子组件A在子组件B中可用,需在子组件B的components选项中进行定义;具体参考下例3.2.1;
5、在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写;

vue3 局部组件 介绍

全局注册虽然很方便,但有以下几个问题:

  1. 全局注册,但并没有被使用的组件无法在生产打包时被自动移除 (也叫“tree-shaking”)。如果你全局注册了一个组件,即使它并没有被实际使用,它仍然会出现在打包后的 JS 文件中。
  2. 全局注册在大型项目中使项目的依赖关系变得不那么明确。在父组件中使用子组件时,不太容易定位子组件的实现。和使用过多的全局变量一样,这可能会影响应用长期的可维护性。

在使用 < script setup > 的单文件组件中,导入的组件可以直接在模板中使用,无需注册;参考4.2.2
没有使用 < script setup >,则需要使用 components 选项来显式注册;其他与vue2特点一致;

3、vue2组件注册

3.1、全局注册(所有页面均可直接使用,无需再引入)

3.1.1、全局注册组件在html的使用

<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>
<body><div id='app'><component-a></component-a></div><script>/*组件注册*/Vue.component('component-a', {template: `<div @click="changeHandle">{{msg}}</div>`,data: function(){return {msg:'我是局部子组件'}},methods:{changeHandle(){console.log('子组件点击事件');},}})/*创建vue实例*/new Vue({el: '#app',data(){return {count:0}},mounted(){console.log('mounted生命周期');},methods:{/*方法*/}})</script>
</body>
</html>

3.1.2、全局注册项目中使用

第一步,新建TabBar组件
src/components/TabBar.vue

<template><div class="footer-bar"><div class="fotter-hFoot"></div><div class="footer-con"><router-link to="/">首页</router-link><router-link to="/center">我的</router-link></div></div>
</template><script>
export default {name:'TabBar'
}
</script>

第二步,main中全局注册组件
src/main.js文件

//main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'/*全局组件*/
import TabBar from './components/TabBar'
Vue.component('TabBar', TabBar)/*vue实例化*/
new Vue({router,render: h => h(App)
}).$mount('#app')

第三步:页面中使用组件
src/view/index.vue页面中使用参考

<template>
<div class="index-main"><P>我是首页</p><!-- 引入组件 --><TabBar index="1"></TabBar>
</div>
</template>
<script>
export default {name: 'Home',data(){return {title:null,}},created(){}
}
</script>

3.2、局部注册(使用页面需先引入才可使用)

3.2.1局部组件在html中引入及使用

<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
</head>
<body><div id='app'><component-a></component-a><component-b></component-b><left-text></left-text></div><script>/*定义组件*/var ComponentA = {template: '<div>{{msg}}</div>',data(){return {msg:'我是局部子组件'}}};var ComponentB = { /* ... */ };/*创建vue实例*/new Vue({el: '#app',components: {'component-a': ComponentA,'component-b': ComponentB,'left-text':{template:`<div>left-text组件</div>`}},data(){return {count:0}}})</script>
</body>
</html>

局部注册的组件在其子组件中不可用,如果子组件想使用其他子组件,则需采用如下写法

var ComponentA = { /* ... */ };
var ComponentB = { components: {'component-a': ComponentA},// ...
};

3.2.2局部组件项目中使用

通过 Babel 和 webpack 使用 ES2015 模块,那么代码可精简如下

/*index.vue页面*/
<template><div class="index-main"><P>我是首页</p><!-- 使用局部组件 --><ComponentA></ComponentA></div>
</template>
<script>
import ComponentA from './components/ComponentA.vue'
export default {name: 'Home',components: {ComponentA},data(){return {title:null,}},created(){}
}
</script>

4、vue3组件注册

4.1、全局注册

4.1.1、全局注册html中使用

<html>
<head>
</head>
<body><div id='app'><component-a></component-a></div><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><script>const { createApp, ref } = Vue/*创建vue实例*/const app = createApp({setup(){const msg = ref('父组件');return {msg}}})/*全局注册组件*/app.component('my-component',{setup(){const count = ref(0);const msg = ref('全局子组件');return{count,msg}},template:`<div>{{msg}}:{{count}}</div>`,})/*挂载应用*/app.mount('#app')</script>
</body>
</html>

4.1.2、全局注册项目中使用

第一步:新建组件省略,参考vue2.0
第二步:全局组件注册
src/main.ts

import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import router from './router'const app = createApp(App)/*全局组件注册*/
import TabBar from './components/TabBar'
import MyComponent from './components/MyComponent .vue'
/*可链式调用*/
app
.component('TabBar ',TabBar)
.component('MyComponent',MyComponent)app.use(createPinia())
app.use(router)app.mount('#app')

第三步:全局组件使用

<script setup lang="ts">import { ref } from 'vue';const count= ref(1)
</script><template>
<div class="home-main"><MyComponent></MyComponent><TabBar></TabBar>
</div>
</template>

在 DOM 中书写模板 (例如原生 元素的内容),模板的编译需要遵从浏览器中 HTML 的解析行为。在这种情况下,你应该需要使用 kebab-case 形式

4.2、局部注册

4.2.1、局部注册html使用

<html>
<head>
</head>
<body><div id='app'><list-demo></list-demo><my-components></my-components></div><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><script>const { createApp, ref } = Vue/*创建组件MyComponents */const MyComponents = {setup(){const msg = ref('MyComponents子组件');return {msg}},template:`<div>{{msg}}</div>`}/*创建vue实例,创建list-demo组件并注册*/const app = createApp({components:{'list-demo':{setup(){const msg = ref('局部子组件');return{msg}},template:`<div>{{msg}}</div>`},'my-components': MyComponents //组件注册},setup(){const msg = ref('父组件');return {msg}}})/*挂载应用*/app.mount('#app')</script>
</body>
</html>

4.2.2、局部注册项目中使用

使用 < script setup >
第一步:新建组件省略,参考vue2.0
第二步:页面注册及使用;在使用 < script setup > 的单文件组件中,导入的组件可以直接在模板中使用,无需注册

<script setup lang="ts">
import { ref } from 'vue';
/*局部组件引入,无需components注册*/
import MyComponent from '@/components/MyComponent.vue'
import MyComponentB from '@/components/MyComponentB.vue'const count= ref(1)
</script><template>
<div class="home-main"><MyComponent></MyComponent><MyComponentB></MyComponentB>
</div>
</template>

未使用 < script setup >

<script>
import { ref  } from 'vue';
/*局部组件注册*/
import MyComponent from '@/components/MyComponent.vue'
import MyComponentB from '@/components/MyComponentB.vue'
export default{components:{MyComponent,MyComponentB},setup(){const count = ref(0);function buttonClick(){count.value++;}return{count,buttonClick}}
}
</script><template>
<div class="home-main"><MyComponent></MyComponent><MyComponentB></MyComponentB>
</div>
</template>

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

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

相关文章

C语言数据结构基础笔记——树、二叉树简介

1.树 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 &#xff08;图片来源于网络&#xff09;…

【OJ】string类题目

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 415字符串相加1.1 分析1.2 代码 2. 344反转字符串2.1 分析2.2 代码 3. HJ1字符串最后一个单词的长度3.1 分析3.2 代码 4. 387.字符串中的第一个唯一字符4.1 分析4.2 代码 5. 125验证回文串5.1 分析5.2 代码 1. 415字符…

【python小技能】使用Python发送电子邮件的完整指南(适合零基础)

前言 在现代通信中&#xff0c;电子邮件是一种不可或缺的工具。使用Python编程语言&#xff0c;我们可以轻松地编写代码来发送电子邮件。本文将为零基础的读者提供一个完整的指南&#xff0c;教你如何使用Python发送电子邮件 安装库 首先&#xff0c;我们需要安装smtplib库。…

wordpress被恶意搜索攻击(网址/?s=****)解决方法。

源地址&#xff1a;https://www.ctvol.com/seoomethods/1413686.html 什么叫恶意搜索攻击&#xff1f; wordpress恶意搜索攻击并不是像病毒一样的攻击&#xff0c;而是一种seo分支黑帽手段&#xff0c;通过被攻击网站搜索功能中长尾关键词来实现攻击&#xff0c;通过网址不断…

Clickhouse MergeTree原理(二)—— 表和分区的维护

作者&#xff1a;俊达 引言 MergeTree是Clickhouse中最核心的存储引擎。上一篇文章中&#xff0c;我们介绍了MergeTree的基本结构。 1、MergeTree由分区&#xff08;partiton&#xff09;和part组成。 2、Part是MergeTree可操作的基本数据单元。 当插入数据时&#xff0c;会…

MySQL 中的“两阶段提交”机制

在MySQL数据库中&#xff0c;为了确保redo log&#xff08;重做日志&#xff09;和binlog&#xff08;二进制日志&#xff09;之间的数据安全性和一致性&#xff0c;引入了“两阶段提交”这一重要概念。MySQL将redo log的写入过程细分为“prepare”和“commit”两个步骤&#x…

【LeetCode热题100】146. LRU 缓存(链表)

一.题目要求 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c…

Jenkins插件Parameterized Scheduler用法

Jenkins定时触发构建的同时设定参数。可以根据不同的定时构建器设置不同参数或环境变量的值。可以设置多个参数。并结合when控制stage流程的执行。结合when和triggeredBy区分定时构建的stage和手动执行的stage。 目录 什么是Parameterized Scheduler&#xff1f;如何配置实现呢…

代码随想录训练营Day24:● 理论基础 ● 77. 组合

理论基础 回溯算法解决的问题 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合 切割问题&#xff1a;一个字符串按一定规则有几种切割方式 子集问题&#xff1a;一个N个数的集合里有多少符合条件的子集 排列…

yolo项目中如何训练自己的数据集

1.收集自己需要标注的图片 2.打开网站在线标注网站 2.1 点击右下角Get Start 2.2点击这里上传自己的图片 上传成功后有英文的显示 点击左边的Object Detection&#xff0c;表示用于目标检测 2.3选择新建标签还是从本地加载标签 如果是本地加载标签&#xff08;左边&#…

基本常用函数help()

Python内置函数 help()函数&#xff1a;查看对象的帮助信息 print()函数&#xff1a;用于打印输出 input()函数&#xff1a;根据输入内容返回所输入的字符串类型 format()函数&#xff1a;格式化显示 len()函数&#xff1a;返回对象的长度或项目个数 slice()函数&#xf…

26-Java访问者模式 ( Visitor Pattern )

Java访问者模式 摘要实现范例 访问者模式&#xff08;Visitor Pattern&#xff09;使用了一个访问者类&#xff0c;它改变了元素类的执行算法&#xff0c;通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变访问者模式中&#xff0c;元素对象已接受访问者对象&a…

TouchGFX之MVP

TouchGFX用户接口遵循Model-View-Presenter&#xff08;MVP&#xff09;架构模式&#xff0c;它是Model-View-Controller&#xff08;MVC&#xff09;模式的派生模式。 两者都广泛用于构建用户接口应用。 MVP模式的主要优势是&#xff1a; 关注点分离&#xff1a;将代码分成不…

mysql 排序底层原理解析

前言 本章详细讲下排序&#xff0c;排序在我们业务开发非常常见&#xff0c;有对时间进行排序&#xff0c;又对城市进行排序的。不合适的排序&#xff0c;将对系统是灾难性的&#xff0c;这个不是危言耸听。可能有些人会想&#xff0c;对于排序mysql 是怎么实现的&#xff0c;…

Android 地图SDK 绘制点 删除 指定

问题 Android 地图SDK 删除指定绘制点 详细问题 笔者进行Android 项目开发&#xff0c;对于已标记的绘制点&#xff0c;提供撤回按钮&#xff0c;即删除绘制点&#xff0c;如何实现。 解决方案 新增绘制点 private List<Marker> markerList new ArrayList<>…

Oracle数据库:使用 bash脚本 + 定时任务 自动备份数据

Oracle数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

解决:InheritableThreadLocal与线程池共用的问题

回顾一下上篇文章&#xff1a;InheritableThreadLocal和ThreadLocal的区别和使用场景 上篇文章介绍道&#xff0c;InheritableThreadLocal 是 ThreadLocal 的一个子类&#xff0c;它不但继承了ThreadLocal的所有特性&#xff0c;父线程中的 InheritableThreadLocal 变量的值可以…

AI赋能写作:AI大模型高效写作一本通

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

Java学习笔记(15)

JDK7前时间相关类 Date时间类 Simpledateformat Format 格式化 Parse 解析 默认格式 指定格式 EE&#xff1a;表示周几 Parse&#xff1a;把字符串时间转成date对象 注意&#xff1a;创建对象的格式要和字符串的格式一样 Calendar日历类 不能创建对象 Getinstance 获取当…

深度学习pytorch——索引与切片

indexing import torch a torch.rand(4,3,28,28) # 表示4张28*28的rgb图 print(a[0].shape) # a[0]获得第一张图片 print(a[0,0].shape) # a[0,0]获得第一张图片的r图 print(a[0,0,2,4]) # 获得第一张图片第一个通道的一个像素点&#xf…