可重用性的6个级别
我们所有人都希望编写更少的代码,但要做更多的事情。
为了实现这一点,我们构建了组件,以便可以多次重用它们。
一些组件只需要基本的可重用性。
其他人则需要更复杂的技术才能充分利用它们。
我已经确定了6个不同级别的可重用性,但是可能还有更多我错过的地方。
这是有关级别的基本概述。我即将举行的课程“ 可重用组件 ”探讨了每个组件以及如何充分利用它们。
1.模板化
通过这种技术,我们将其包装在其自己的组件中,而不是到处复制+粘贴代码。
当我们重用该组件(而不是直接使用代码)时,它给我们带来了两个好处:
将来进行更改要容易得多,因为我们只需要在一个地方做 我们不必记住将代码复制到的数十个(或数百个)地方 这是最基本的,也是最经常谈论的可重用性形式。
但是更高的级别会变得更加有趣...
2.配置
对于某些组件,我们需要对其工作方式有所不同。
甲Button组件可能有一个主版本,以及一个唯一的图标版本。但是,我们没有为每个版本创建全新的组件,而是使用道具在不同类型之间进行切换。
添加这些道具通常不会给组件增加太多,但可以为我们提供更多使用该组件的灵活性。整洁
注意:这与将loadingprop 用于状态或数据(例如prop或disabledprop)不同。
3.适应性
配置的最大问题是缺乏远见。您需要预见将来的需求,并通过放置这些道具将它们构建到组件中。
但是,如果您使组件具有适应性,则无需更改组件即可使用从未想到的用例。
我们通过使用插槽将标记的一部分从父代传递到组件来实现。
例如,我们可以使用插槽代替text在Button组件中使用道具default:
<!-- Button.vue -->
<template>
<button
class="btn btn--default"
@click="$emit('click')"
>
<slot />
</button>
</template>
现在,我们不仅限于传递a string或numberin。
如果我们想添加loading微调器而不必修改我们的Button组件,则可以这样做:
<template>
<Button>
<img
v-if="loading"
src="spinner.svg"
/>
Click Me
</Button>
</template>
4.反转
无需将完整的标记块传递给我们的子组件,我们可以传递一组有关如何呈现的指令。
这就像遵循食谱而不是订购外卖。当您遵循食谱时,要做的工作要多一些,但是您可以完全掌控自己的制作方式。您可以随时进行调整,也可以完全放弃该食谱。
我们使用作用域插槽来为我们的组件增加更大的灵活性。
5.扩展
通过适应性和反转性,我们拥有必要的技术,可以最大限度地提高组件的可重用性。
下一步是将这些技术应用于整个组件,以便我们更轻松地扩展其行为。
我们使用命名槽在组件中添加一个或多个扩展点。仅适应性和反转本身给我们提供了扩展行为的一种选择,而拥有多个扩展点则为我们提供了许多不同的选择。
在这里,我们有一个Modal与组件header,default以及footer:
<template>
<div class="modal">
<slot name="header">
<h2>{{ title }}</h2>
</slot>
<!-- Default slot for main content -->
<slot />
<slot name="footer">
<Button @click="closeModal">
Close
</Button>
</slot>
</div>
</template>
这是一个相当简单的扩展示例,但是我们已经有几个扩展该组件的选项:
只需覆盖default广告位即可添加我们的内容 添加内容但也覆盖header广告位 内容和footer添加不同按钮的插槽 内容无一不header与footer插槽的东西更多的自定义 (如果不使用插槽,我们可以添加更多default,但这在这里不太可能)
您不必扩展此组件的行为,也可以扩展其一部分。无论哪种方式,您都将获得很大的灵活性和大量的代码重用性。
6.嵌套
通过将这些扩展点通过一层或多层组件,我们将得出扩展的结论。
乍一看听起来很疯狂,但是它非常有用,尤其是在大中型应用程序中。
您从一个基本组件开始,该组件的功能相当普遍。下一个组件更加具体,以几种方式扩展了基础组件。然后不断,直到您拥有完成实际工作的最终组件。
这正是我们从非常笼统的内容Animal变为更具体的内容Mammal,然后Dog最终降落到的方式Poodle。如果我们需要的只是一个Poodle组件,那么我们在这里浪费时间,但是在大型应用程序中,我们需要在相同的基本概念上进行很多改动。
我们可以扩展Dog组件以获得Corgi和Beagle。或扩展Mammal组件以获得Cat组件,然后让我们添加Tiger和Lion组件。
这是我遇到的最先进的可重用性应用程序。我用这个技术有很多在我自己的工作。
结论
这是我遇到的6个可重用性级别。
我可能会错过一些,我当然不会说这是一份详尽的清单,但是它足够完整,可以使用。
这样的简短文章并不能使他们公平,但是我将在我即将开始的课程Reusable Components中更深入地探讨它们。
- 【美团技术团队博客】前端组件化开发实践
- Spring中Bean
- 跟Google学写代码--Chromium/base--windows_version源码学习及应用
- 一步步教你弹性框架-下篇
- R语言与机器学习(分类算法)朴素贝叶斯算法
- 【美团技术团队博客】RACSignal的Subscription深入分析
- 谈谈个人网站的建立(八)—— 缓存的使用
- 【编程基础】System.arraycopy()和 Arrays.copyOf()
- 移动端 模拟手机联系人触摸A~Z导航
- 谈谈个人网站的建立(七)—— 那些建站必备的插件
- 【美团技术团队博客】Linux资源管理之cgroups简介
- 谈谈个人网站的建立(六)—— 数据库同步
- Javascript解析机制 执行机制
- Tomcat9源码——编译环境搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java的HashMap和HashTable
- 花木兰到底好看不,我用Python爬取了几万条评论!
- java方法重载
- java中super()和this()浅析
- 常见的 Spring 注解概览
- java中 this和super的区别
- Java常用API(ArrayList类)
- 关于多线程中抛异常的这个面试题我再说最后一次!
- 卧槽!居然有比Flask更好用更简单的框架
- Java8基础学习(一)- Founction接口
- java数组详解
- 初识Java对象
- Java常用API(Scanner类)
- Java中多线程的使用(超级超级详细)线程安全+线程锁原理解析+保证线程安全的三种方式 (同步代码块+同步方法+lock锁) 5
- Java匿名对象介绍