组件化和模块化

为什么会有组件化和模块化?当我们的项目复杂度不断上升,项目维护成本逐渐提高之后,对于旧项目的维护就变得格外困难。前端如果按照以前的编程方式,将许多html和js代码都封装在同一个页面,甚至于我们大多数时候在编写html页面的时候会将同一段代码复制黏贴到不同的页面上,那么无疑对于维护者来说是一场巨大的灾难,所以组件化和模块化的出现便成为了一种必然。

组件化和模块化其实思想内核时一致的,甚至于我认为组件化是脱胎于模块化。它们二者的目的都是为了减少我们维护项目的成本,减少代码的冗余,提高代码的阅读性。

这两者让我们可以将频繁使用到的代码,复杂的页面,划分成一个个独立而又互相联系的小方块,就像积木一样,最终可以拼凑出一座更好的代码大楼。

模块化

提起前端的模块化,就离不开ES6。随着ES6的出现,更多的指令,命令和功能也随之出现,我们可以编程出更友好的代码。

es6中出现了module的说法,即模块。通过将我们的js代码封装成一个个module,然后使用export和import命令,我们就可以更好地去管理我们的功能代码,将通用的代码统一封装成一个个小模块,将大型的功能代码划分成简单易懂的函数方法。

'use strict'
//导出变量
export const a = '100';  //导出方法
export const dogSay = function(){ console.log('wang wang');
}
//导出函数
export function catSay(){console.log('miao miao');
}// export catSay 这样也行// 使用的地方导入
// export导出的是多个,需要解构取值
import {a,dogSay,catSay} from 'url'

正是因为ES6这一更新,便有了我们将模块一个个划分,也有了我们更好地去使用插件,封装插件的途径,当我们正确使用模块化,就可以减少代码的冗余,减少页面结构的臃肿,也更好地可以去将各种功能插件封装到项目中。

组件化

组件化的中心思想其实跟模块化是大同小异的,可以简单地认为模块化是对于我们的JS功能代码的一个说法,而组件化是对于我们html,css代码的一个说法,当我们的JS功能代码可以被封装成一个个小的模块后,经过不断地思考演化,就引出了组件化这一说法。

组件化对应前端三剑客中的html和css,作为一个前端开发者,如果没有组件化之前,经常能碰到的一个场景就是复制同样的html代码和js代码到不同页面上,去做这种重复而无聊的工作。

或者其实我们可以用后端提供的组件化,比如php,jsp中,它们可以提供一个组件化的解决方案,就是通过封装同一文件,然后php,jsp去识别读取我们页面上对应的标签。

但是这样的方案在前端后端分离开发中显得是相对麻烦而且依赖性太强了,并不能算是前端真正的组件化解决方案。

所以前端的各种框架横空出世,当然它们也是通过node等类型的一个服务端语言来实现我们的前端组件化,但是相对于php和jsp,它们显然更适合我们的前后端分离开发。

这里以Vue封装组件作为例子,通过一个简单的封装组件,我们可以清晰地看到组件是如何被封装,以及如何应用。

Vue中的组件化

Vue中我们使用emit和props完成组件的通讯。通讯也就是说我们可以传递一些参数给这个组件母版,获得一个按照我们需要生成的组件。类似于我们定义一个类,可以传递一些参数,来实例化一个独特的对象。

props

props就是当我们使用组件时,就要传递一些参数给到我们的母版,这样才能得到我们想要的组件的样式或者对应的一些功能。比如一个input,如果我们希望它是不可被输入的,那我们就可通过传递一个参数,值为false,然后props中的参数会接收到对应的值,再将它传给我们的组件中的html标签input

emit

为什么会有emit?因为我们封装一个输入框母版之后,当我们在某一个页面使用这个母版生成的子组件并且想要添加一个@input的方法,如果直接@input=“function”,会发现是没效果的。

我们需要的应该是它的母版,在母版上的input事件绑定一个function,然后当输入触发了这个function后通过emit(声明一个函数如inputFun)发送出去,然后我们在子组件上可以接收到这个信号@inputFun=“getFun”,只要我们监听了inputFun,它就会将有输入这个信号传给我们在子组件定义的getFun。

<template><div class="cat-input" :class="{ 'cat-input--suffix': showSuffix }"><!-- type:先判断是否有传入显示密码,控制输入框类型是文本/密码,然后是type传入的值 --><input:type="showPassword ? (passwordVisiable ? 'text' : 'password') : type"class="cat-input__inner":placeholder="placeholder":name="name":disabled="disabled":class="{ 'is-disabled': disabled }":value="value"@input="handleinput"/><span class="cat-input__suffix" v-if="showSuffix"><iclass="cat-input__icon cat-icon-circle-close"v-if="clearable && value"@click="clear"></i><iclass="cat-input__icon cat-icon-view":class="{ 'cat-icon-view-active': passwordVisiable }"v-if="showPassword"@click="handlepwd"></i></span></div>
</template><script>
export default {name: "CatInput",props: {placeholder: {type: String,default: "",},type: {type: String,default: "text",},name: {type: String,default: "",},disabled: {type: Boolean,default: false,},value: {type: String,default: "",},clearable: {type: Boolean,default: false,},showPassword: {type: Boolean,default: false,},},data() {return {passwordVisiable: false, //控制是否显示密码};},methods: {handleinput(event) {//父组件在绑定v-model时,其实就绑定的input事件,因此父组件不需要再声明事件了this.$emit("input", event.target.value);},clear() {this.$emit("input", "");},handlepwd() {this.passwordVisiable = !this.passwordVisiable;},},computed: {//有清空/显示密码,添加类名、显示spanshowSuffix() {return this.clearable || this.showPassword;},},
};
</script>
// 组件需要注册才能使用,要么全局,要么在页面上局部注册。
import CatInput from "./components/input.vue";
Vue.component(CatInput.name, CatInput);
<template><!-- 输入框需要绑定v-model,实际上是一个语法糖,等价于::value="uname"@input="uname=$event.target.value"--><div><Cat-inputplaceholder="请输入用户名"type="text"v-model="uname"clearable></Cat-input><br /><Cat-input placeholder="禁用的输入框" disabled></Cat-input><br /><Cat-inputplaceholder="请输入密码"v-model="upwd"show-password></Cat-input></div>
</template><script>
export default {data() {return {uname: "",upwd: "",};},
};
</script><style lang="scss" scoped>
.cat-input {margin-bottom: 10px;
}
</style>

前端的组件化和模块化相关推荐

  1. 我所知道的前端组件化与模块化

    序言:组件化?模块化?这都是什么鬼?这是最初看到这2个新名词的反应.随着时间的推移,似乎.可能.大概明白了一点,于是想说说自己的理解(仅仅是自己的理解) 一.组件化 忘记什么时候看到这个词的了,由于用 ...

  2. 理解前端组件化、模块化、工程化

    什么是组件化.模块化.工程化? 组件化:把重复的代码提取出来合并成为一个个组件,组件最重要的就是复用,位于框架最底层,其他功能都依赖于组件,可供不同功能使用,独立性强.组件化更多关注UI部分,每个组件 ...

  3. 组件化、模块化、集中式、分布式、服务化、面向服务的架构、微服务架构

    组件化.模块化.集中式.分布式.服务化.面向服务的架构.微服务架构 最近最火的词是什么?那大概就是微服务(Microservice)了.最近也火的一踏糊涂的Docker.DevOps也都是围绕着微服务 ...

  4. Vue学习笔记(二)组件化和模块化

    Vue学习笔记(二)组件化和模块化 前言 组件化 什么是组件化 1.基础使用 2.全局组件和局部组件 3.语法糖和模板抽离 4.组件的data为什么是函数 5.父子组件 5.1 父子组件 5.2 父子 ...

  5. Android的组件化和模块化

    Android随着业务的增多,而且后续新的需求的增加,代码的修改会变得非常频繁 然后最近在看组件化和模块化 公司的业务没有那么大,所以这种方式我并没有采取 但是还是需要了解下他的使用机制 还有优缺点之 ...

  6. Android - 组件化、模块化开发

    转载请注明出处:https://blog.csdn.net/mythmayor/article/details/107184467 一.组件化与模块化介绍 组件化 组件:最初的目的是代码重用,功能相对 ...

  7. 前端组件化和模块化最大的区别是什么_7招提升你的前端开发效率

    前言 前端工程师其实是一个工作很杂的职位,除了要负责切图.写html/css/js外,还要解决一系列的浏览器兼容性.网页性能优化等问题,所以提高前端工程师的开发效率是势在必行的,也是前端工程化的体现. ...

  8. js组件化、模块化开发

    组件化 为什么要组件化开发 有时候页面代码量太大,逻辑太多或者同一个功能组件在许多页面均有使用,维护起来相当复杂,这个时候,就需要组件化开发来进行功能拆分.组件封装,已达到组件通用性,增强代码可读性, ...

  9. Vue基础知识+组件化开发+模块化开发总结

    三.内容: 一.MVVM View层 视图层,我们前端开发时候的DOM层 主要就是给用户展示各种信息 Model层 数据层:可能是我们固定的思数据,更多的是来自我们的服务器,在网路上请求下来的数据 V ...

最新文章

  1. [考试]20150528
  2. UML建模之EA入门
  3. react手机机端css_react工程搭建系列之---移动端适配与antd-mobile高清适配方案
  4. Java代理系列-静态代理
  5. 数列分段(洛谷P1181题题解,Java语言描述)
  6. vertica 数据库 linux,配置访问列式数据库vertica的php环境
  7. excel怎么批量插行_批量制作anki卡片最易上手方法
  8. python元组是有序还是无序_python-03 元组和字典
  9. Atitit.加密算法 des  aes 各个语言不同的原理与解决方案java php c#
  10. cudnn的安装 linux
  11. 在已有OpenStack集群中部署Manila(五):部署Manila Share节点之模式二(driver_handles_share_servers=True)
  12. 【浙大翁恺】C语言习题
  13. DockerFile的编写构建镜像步骤,常用命令和案例
  14. 微信小程序获取数据并展示
  15. opnet如何进行C语言编程,OPNET学习小记(五)
  16. IT行业里哪些岗位热门又高薪?
  17. 五个高效的工作方式,提高你的工作效率
  18. Windows 7 Service Pack 1已发布:但是您应该安装它吗?
  19. 数据正态分布化 + 基于回归算法的房价预测(含python代码)
  20. 小程序利用background-image设置背景

热门文章

  1. 关于Gson对日期的格式化
  2. 基于强化学习的自我完善聊天机器人
  3. 盘丝洞服务器维护,梦幻西游:明日维护公告解读!盘丝法宝调整,新增人物志玩法!...
  4. FTP服务器的配置,以及配置ftp支持ftps
  5. Dubbo服务端服务发布(一)Invoker创建
  6. CAP原理与传统的ACID
  7. 软件测试的目的/目标
  8. # Java 并发编程的艺术(二)
  9. 【OFD】ArrayBuffer 和 Uint8Array
  10. JAVA实现分治法的合并排序及解析