在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这里我们一起来学习前端组件化的知识,而组件化在前端架构里面是最重要的一个部分。 讲到前端架构,其实前端架构中最热门的就有两个话题,一个就是组件化,另一个就是架构模式。组件化的概念是从开始研究如何扩展 HTML 标签开始的,最后延伸出来的一套前端架构体系。而它最重要的作用就是提高前端代码的复用性。 架构模式就是大家特别熟悉的 所以说,前端架构当中,组件化可以说是重中之重。在实际工程当中,其实组件化往往会比架构模式要更重要一些。因为组件化直接决定了一个前端团队代码的复用率,而一个好的组件化体系是可以帮助一个前端团队提升他们代码的复用率,从而也提升了团队的整体效率。 因为复用率提高了,大家重复编写的代码量就会降低,效率就会提高,从而团队中的成员的心理和心智负担就会少很多。
这里我们先从了解什么是组件化和一个组件的基本组成部分开始。 组件的基本概念组件都会区分为模块和对象,组件是与 UI 强相关的,所以某种意义上我们可以认为组件是特殊的模块或者是特殊的对象。
组件化的特点是可以使用树形结构来进行组合,并且有一定的模版化的配置能力。这个就是我们组件的一个基本概念。 对象与组件的区别首先我们来看对象,它有三大要素:
在 JavaScript 中的普通对象可以用它的属性,方法和继承关系来描述。而这里面的继承,在 JavaScript 中是使用原型继承的。 这里说的 “普通对象” 不包含复杂的函数对象或者是其他的特殊对象,而在 JavaScript 当中,属性和方法是一体的。 相对比组件,组件里面包含的语义要素会更丰富一点,组件中的要素有:
接下来就是组件的 同时组件也会有
每一个组件都会有生命周期 组件的 之前有一些比较流行的拖拽系统,我们可以把一些写好的 UI 组件拖到页面上,从而建立我们的系统界面。但是后面发现除了可以拖拽在某些区域之外,还需要一些自动排序,组件嵌套组件的功能需求。这个时候组件与组件之间没有树形结构就不好使了。 最后组件在对象的基础上添加了很多语义相关的概念,也是这样使得组件变成了一种非常适合描述 UI 的概念。 组件 Component我们用一张图来更深入的了解组件。 组件最直接产生变化的来源就是用户的输入和操作,比如说当一个用户在我们的选择框组件中选中了一个选项时,这个时候我们的状态 图中右边的这几种情况就是组件的开发者与组件的关系。其中一种就是开发者使用了组件的标记代码
开发者除了可以用
然后就是 那么这里我们可以确定一个概念,使用组件的开发者会使用到 通过这张图我们就可以清楚知道组件的各个要素的作用,以及他们的信息流转方向。 特性 Attribute在所有组件的要素中,最复杂的无非就是 我们从 而 上面讲的就是这两个词在英文中的区别,但是在实际运用场景里面他们也是有区别的。 因为 Attribute 对比 Property这里我们用一些例子来看看 Attribute 和 Property 的区别。我们可以看看它们在 HTML 当中不等效的场景。 Attribute:<my-component attribute="v" /> <script> myComponent.getAttribute('a') myComponent.setAttribute('a', value) </script>
Property:myComponent.a = 'value';
Class 属性<div class="class1 class2"></div> <script> var div = document.getElementByTagName('div'); div.className // 输出就是 class1 class2 </script> 早年 JavaScript 的 Class 是一个关键字,所以早期 class 作为关键词是不允许做为属性名的。但是现在这个已经被改过来了,关键字也是可以做属性名的。 为了让这个关键字可以这么用,HTML 里面就做了一个妥协的设计。在 HTML 中属性仍然叫做 比如说在 React 里面,我们写 className它自动就把 Class 给设置了。 Style 属性现在 JavaScript 语言中,已经没有 class 和 className 两者不一致的问题了。我们是可以使用 有些时候 Attribute 是一个字符串,而在 Property 中就是一个字符串语义化之后的对象。最典型的就是 <div class="class1 class2" style="color:blue"></div> <script> var div = document.getElementByTagName('div'); div.style // 这里就是一个对象 </script> 在 HTML 里面的 Style 属性他是一个字符串,同时我们可以使用 getAttribute 和 setAttribute 去取得和设置这个属性。但是如果我们用这个 Style 属性,我们就会得到一个 key 和 vaule 的结构。 Href 属性在 HTML 中 比如我们的 href 的值输入的是 “//m.taobao.com”。这个时候前面的 http 或者是 https 协议是根据当前的页面做的,所以这里的 href 就需要编译一遍才能响应当前页面的协议。 做过 http 到 https 改造的同学应该都知道,在让我们的网站使用 https 协议的时候,我们需要把所有写死的 http 或者 https 的 url 都要改成使用 所以在我们 href 里面写了什么就出来什么的,就是 attribute。如果是经过 resolve 的就是我们的 property 了。 <a href="//m.taobao.com" rel="external nofollow" ></a> <script> var a = document.getElementByTagName('a'); // 这个获得的结果就是 "http://m.taobao.com", 这个 url 是 resolve 过的结果 // 所以这个是 Property a.href; // 而这个获得的是 "//m.taobao.com", 跟 HTML 代码中完全一致 // 所以这个是 Attribute a.getAttribute('href'); </script> 在上面的代码中我们也可以看到,我们可以同时访问 property 和 attribute。它们的语义虽然非常的接近,但是它们不是一样的东西。 不过如果我们更改了任何一方,都会让另外一方发生改变。这个是需要我们去注意的现象。 Input 和 value这个是最神奇的一对,而 value 也是特别的坑。 我们很多都以为 property 和 attribute 中的 value 都是完全等效的。其实不是的,这个 attribute 中的 input 的 value 相当于一个 value 的默认值。不论是用户在 input 中输入了值,还是开发者使用 JavaScript 对 input 的 value 进行赋值,这个 input 的 attribute 是不会跟着变的。 而在 input 的显示上是会优先显示 property,所以 attribute 中的 value 值就相当于一个默认值而已。这就是一个非常著名的坑,早期同学们有使用过 JQuery 的话,我们会觉得里面的 prop 和 attr 是一样的,没想到在 value 这里就会踩坑。 所以后来 JQuery 库就出了一个叫 val 的方法,这样我们就不需要去想 attribute 还是 property 的 value,直接用它提供的 val 取值即可。
如何设计组件状态这里我们来分析一下, 这里 Winer 老师给我们整理了一个表格,分成了四个场景:
那么我们一个一个来讲述一下:
❌ 它是不能够被 markup 这种静态的声明语言去设置的
❓ 用户的输入就不一定会改变它,与 Property 同理
❌ 状态是会由组件内部去改变的,它不会从组件的外部进行改变。如果我们想设计一个组件是从外部去改变组件的状态的话,那么我们组件内部的 state 就失控了。因为我们不知道组件外部什么时候会改变我们组件的 state,导致我们 state 的一致性无法保证。
✅ Config 在组件中是一个一次性生效的东西,它只会在我们组件构造的时候触发。所以它是不可更改的。也是因为它的不可更改性,所以我们通常会把 config 留给全局。通常每个页面都会有一份 config,然后拿着这个在页面内去使用。 组件生命周期 Lifecycle讲到生命周期,我们最容易想到的会有两个,一个是 那么在这两个开始与结束之间有什么生命周期呢?我们就需要想一下,一个组件在构造到销毁之间都会发生什么事情。 一个组件有一个非常重要的事情,就是它被创建之后,它有没有被显示出来。这里就涉及生命周期中的 有挂載那必然就会有卸载,所以组件中的 所以在 那么组件还会在什么时候发生状态更变呢?这里我们就有两种情况:
比如说我们用户点了一下按钮或者 Tab,这个时候就会触发这个组件的状态更变。同时也会产生一个组件的生命周期,而这个生命周期就是 Render 渲染或者 Update 更新。 所有这些生命周期加在一起就是我们一个组件完整的生命周期。我们看到的所谓 Children最后我们来讲一下 Children (子组件)的概念。Children 是构建组件树最重要的一个组件特性,并且在使用中其实有两种类型的 Children:
在设计我们的组件树的 children 的时候,一定要考虑到这两种不同的场景。比如我们在 React中,它没有 template 型的 children,但是它的 children 可以传函数,然后这个函数可以返回一个 children。这个时候它就充当了一个模版型 children 的作用了。那么在 Vue 里面当我们去做一些无尽的滚动列表的时候,这个对 Vue 的模版型 children 就有一定的要求。 结束语这里我们就学习完了整个组件的概念和知识了,下一篇文章我们就会一起来设计和搭建一个组件系统,并且了解到它的各方各面的实践知识。我们还会用一些典型的组件和典型的功能来让大家对组件的实现有一定的了解。 我们在这里互相监督,互相鼓励,互相努力走上人生学习之路,让学习改变我们生活! 学习的路上,很枯燥,很寂寞,但是希望这样可以给我们彼此带来多一点陪伴,多一点鼓励。我们一起加油吧! (๑ •̀ㅂ•́)و 到此这篇关于前端组件化基础知识的文章就介绍到这了,更多相关前端组件化,前端基础知识,前端知识内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论