Vue 组件命名,最新整理

// var commonTagRE = /^(div|p|span|img|a|b|i|br|ul|ol|li|h1|h2|h3|h4|h5|h6|code|pre|table|th|td|tr|form|label|input|select|option|nav|article|section|header|footer)$/i;

// var reservedTagRE = /^(slot|partial|component)$/i;

2、检查组件名称是否以字母开头,后面跟字母、数值或下划线。

if (!/1[\w-]*$/.test(name)) {

warn(‘Invalid component name: "’ + name + '". Component names ’ + ‘can only contain alphanumeric characaters and the hyphen.’);

}

基于以上两点,可以总结出组件的命名规则为:组件名以字母开头,后面跟字母、数值或下划线,并且不与 HTML 元素或 Vue 保留标签重名。

然而我们注意到,在上面的检查中,不符合规则的组件名称是 warn 而不是 error,意味着检查并不是强制的。实际上,Vue 组件注册的名称是没有限制的 。你可以用任何 JavaScript 能够表示的字符串,不管是数字、特殊符号、甚至汉字,都可以成功注册。

模板解析


虽然 Vue 组件没有命名限制,但是我们终究是要在模板中引用的,不合理的组件名可能会导致我们无法引用它。

为了弄清楚 Vue 是如何将模板中的标签对应到自定义组件的,我们以一段简单的代码说明:

new Vue({

el: ‘#app’,

template: ‘’

})

总体来说,模板解析分为两个过程:

首先,Vue 会将 template 中的内容插到 DOM 中,以方便解析标签。由于 HTML 标签不区分大小写,所以在生成的标签名都会转换为小写。例如,当你的 template<MyComponent></MyComponent> 时,插入 DOM 后会被转换为 <mycomponent></mycomponent>。(注意:我们现在讨论的是 vue 1.x 下的情景)

然后,通过标签名寻找对应的自定义组件。匹配的优先顺序从高到低为:原标签名、camelCase化的标签名、PascalCase化的标签名。例如 <my-component> 会依次匹配 my-component、myComponent、MyComponent。

camelCase 和 PascalCase 是如何实现的代码如下:

var camelizeRE = /-(\w)/g;

function camelize(str) {

return str.replace(camelizeRE, toUpper);

}

function toUpper(_, c) {

return c ? c.toUpperCase() : ‘’;

}

function pascalize(str) {

var camelCase = camelize(str);

return camelCase.charAt(0).toUpperCase() + camelCase.slice(1)

}

对于与一个 Vue 新手,经常对以下示例代码不能正常运行感到非常疑惑:(注意:我们现在讨论的是 vue 1.x 下的情景)

Vue.component(‘MyComponent’, {

template: ‘

hello, world

})

new Vue({

el: ‘#app’,

template: ‘’

})

如果我们按照模板解析的过程推理,就很好解释了。模板 <MyComponent></MyComponent> 插入到 DOM 后会变成 <mycomponent></mycomponent>。标签 mycomponent 匹配的组件依次为 mycomponent(原标签名)、mycomponent(camelCase形式)、Mycomponent(PascalCase形式),并没有匹配到注册的组件名 MyComponent,所以会报找不到组件 的警告。

命名限制


通过分析组件注册和模板解析的过程,发现 Vue 组件命名限制并没有我们想象得多。大家可以尝试一下各种命名,我试过 <a_=-*%按钮></a_=-*%按钮> 都可正常运行。

但是,并不意味着完全没有限制。由于在模板需要插入到 DOM 中,所以模板中的标签名必须能够被 DOM 正确地解析。

主要有三种情况:

一是完全不合法的标签名,例如 </>

二是与 HTML 元素重名会产生不确定的行为,例如使用 input 做组件名不会解析到自定义组件,使用 button 在 Chrome 上正常但在 IE 上不正常;

三是与 Vue 保留的 slot、partial、component 重名,因为会优先以本身的意义解析,从而产生非预期的结果。

上述命名限制存在的根本原因,在于模板解析的过程依赖了 DOM。能不能对模板解析过程改进一下,使其不依赖于 DOM 呢?实际上,这正是 Vue 2.0 的主要改进,将模板解析过程使用 Virtual DOM 实现,使得组件命名更加灵活。

Vue 2.x 组件命名机制

==============

组件注册


Vue 2.0 的组件注册过程与 Vue 1.0 基本相同,只是 HTML 标签和 Vue 保留标签范围有些不同:

// 区分大小写

var isHTMLTag = makeMap(

‘html,body,base,head,link,meta,style,title,’ +

‘address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,’ +

‘div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,’ +

‘a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,’ +

‘s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,’ +

‘embed,object,param,source,canvas,script,noscript,del,ins,’ +

‘caption,col,colgroup,table,thead,tbody,td,th,tr,’ +

‘button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,’ +

‘output,progress,select,textarea,’ +

‘details,dialog,menu,menuitem,summary,’ +

‘content,element,shadow,template’

);

// 不区分大小写

var isSVG = makeMap(

‘svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font,’ +

‘font-face,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,’ +

‘polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view’,

true

);

var isReservedTag = function (tag) {

return isHTMLTag(tag) || isSVG(tag)

};

// 区分大小写

var isBuiltInTag = makeMap(‘slot,component’, true);

虽然 HTML 元素重名警告的标签数大大增加了,但重要的是重名区分大小写,所以我们可以愉快地使用 Input、Select、Option 等而不用担心重名。这个功劳属于 Vue 2.0 引入的 Virtual DOM。

(关于 vue 2.0 中的新特性,请看:Vue 2.0 发布了!Announcing Vue.js 2.0

模板解析

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

数据结构与算法

这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:数组、链表、队列、栈、Set、Map、哈希表等,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题

排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。

  • 二叉树层序遍历
  • B 树的特性,B 树和 B+树的区别
  • 尾递归
  • 如何写一个大数阶乘?递归的方法会出现什么问题?
  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2

  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

[外链图片转存中…(img-5LYlsjY1-1712772573187)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-FsaJfvLF-1712772573187)]


  1. a-zA-Z ↩︎

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值