当前位置:   article > 正文

Vue 组件命名,2024阿里前端笔试总结,【绝对干货】

Vue 组件命名,2024阿里前端笔试总结,【绝对干货】

// 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

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

842933461)]

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-UjxrEclp-1710842933462)]

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


  1. a-zA-Z ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/406471
推荐阅读
相关标签
  

闽ICP备14008679号