《Vue入门到精通系列之二》--- 组件化开发与前端模块化(二)

简介: 《Vue入门到精通系列之二》--- 组件化开发与前端模块化

7.插槽slot


7.1.编译作用域


在真正学习插槽之前,我们需要先理解一个概念:编译作用域。

官方对于编译的作用域解析比较简单,我们自己来通过一个例子来理解这个概念:

我们来考虑下面的代码是否最终是可以渲染出来的:


< my-cpn v-show=“isShow”>< /my-cpn>中,我们使用了isShow属性。

isShow属性包含在组件中,也包含在Vue实例中。


答案:最终可以渲染出来,也就是使用的是Vue实例的属性。

为什么呢?


官方给出了一条准则:父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。

而我们在使用< my-cpn v-show=“isShow”>< /my-cpn>的时候,整个组件的使用过程是相当于在父组件中出现的。

那么他的作用域就是父组件,使用的属性也是属于父组件的属性。

因此,isShow使用的是Vue实例中的属性,而不是子组件的属性。


956e085ae10e43a9b272a3ecd624bb7b.png


7.2.为什么使用slot


slot翻译为插槽:


在生活中很多地方都有插槽,电脑的USB插槽,插板当中的电源插槽。

插槽的目的是让我们原来的设备具备更多的扩展性。

比如电脑的USB我们可以插入U盘、硬盘、手机、音响、键盘、鼠标等等。


组件的插槽:


组件的插槽也是为了让我们封装的组件更加具有扩展性。

让使用者可以决定组件内部的一些内容到底展示什么。

栗子:移动网站中的导航栏。

移动开发中,几乎每个页面都有导航栏。

导航栏我们必然会封装成一个插件,比如nav-bar组件。

一旦有了这个组件,我们就可以在多个页面中复用了。


但是,每个页面的导航是一样的吗?No,我以京东M站为例


269547e389164c0ab618c9449312dd21.png


7.3.如何封装这类组件呢?slot


如何去封装这类的组件呢?


它们也很多区别,但是也有很多共性。

如果,我们每一个单独去封装一个组件,显然不合适:比如每个页面都返回,这部分内容我们就要重复去封装。

但是,如果我们封装成一个,好像也不合理:有些左侧是菜单,有些是返回,有些中间是搜索,有些是文字,等等。


如何封装合适呢?抽取共性,保留不同。


最好的封装方式就是将共性抽取到组件中,将不同暴露为插槽。

一旦我们预留了插槽,就可以让使用者根据自己的需求,决定插槽中插入什么内容。

是搜索框,还是文字,还是菜单。由调用者自己来决定。


这就是为什么我们要学习组件中的插槽slot的原因。


7.4.slot基本使用


了解了为什么用slot,我们再来谈谈如何使用slot?


在子组件中,使用特殊的元素就可以为子组件开启一个插槽。

该插槽插入什么内容取决于父组件如何使用。


我们通过一个简单的例子,来给子组件定义一个插槽:


< slot>中的内容表示,如果没有在该组件中插入任何其他内容,就默认显示该内容

有了这个插槽后,父组件如何使用呢?


b45e3c3937ae4955a2b3ab15fde9e350.png


7.5.具名插槽slot


当子组件的功能复杂时,子组件的插槽可能并非是一个。


比如我们封装一个导航栏的子组件,可能就需要三个插槽,分别代表左边、中间、右边。

那么,外面在给插槽插入内容时,如何区分插入的是哪一个呢?

这个时候,我们就需要给插槽起一个名字


如何使用具名插槽呢?


非常简单,只要给slot元素一个name属性即可

< slot name=‘myslot’>< /slot>


我们来给出一个案例:

这里我们先不对导航组件做非常复杂的封装,先了解具名插槽的用法。


323de33f92614a2dad207f5aa101b87b.png


7.6.作用域插槽:准备


作用域插槽是slot一个比较难理解的点,而且官方文档说的又有点不清晰。

这里,我们用一句话对其做一个总结,然后我们在后续的案例中来体会:


父组件替换插槽的标签,但是内容由子组件来提供。


我们先提一个需求:


子组件中包括一组数据,比如:pLanguages: [‘JavaScript’, ‘Python’, ‘Swift’, ‘Go’, ‘C++’]


需要在多个界面进行展示:


某些界面是以水平方向一一展示的,

某些界面是以列表形式展示的,

某些界面直接展示一个数组


内容在子组件,希望父组件告诉我们如何展示,怎么办呢?


利用slot作用域插槽就可以了


我们来看看子组件的定义:


b6a3f6fb5bf4448e9c983e4fe23a7584.png


7.7.作用域插槽:使用


在父组件使用我们的子组件时,从子组件中拿到数据:

我们通过< template slot-scope=“slotProps”>获取到slotProps属性

在通过slotProps.data就可以获取到刚才我们传入的data了


fb9f5ba4767d491d9364ea14f8e69dc2.png


二、模块化开发


1.为什么需要模块化开发


1.1.JavaScript原始功能


在网页开发的早期,js制作作为一种脚本语言,做一些简单的表单验证或动画实现等,那个时候代码还是很少的。


那个时候的代码是怎么写的呢?直接将代码写在


比如全局变量同名问题:看下边的例子

另外,这种代码的编写方式对js文件的依赖顺序几乎是强制性的


但是当js文件过多,比如有几十个的时候,弄清楚它们的顺序是一件比较同时的事情。

而且即使你弄清楚顺序了,也不能避免上面出现的这种尴尬问题的发生


f29748a097d9431a85e1a4a263ec10dc.png


1.2.匿名函数的解决方案


我们可以使用匿名函数来解决方面的重名问题

在aaa.js文件中,我们使用匿名函数


9b2dadccd2a448e2923fccd641d6ded1.png


望在main.js文件中,用到flag,应该如何处理呢?

显然,另外一个文件中不容易使用,因为flag是一个局部变量


1.3.使用模块作为出口


我们可以使用将需要暴露到外面的变量,使用一个模块作为出口,什么意思呢?

来看下对应的代码:

我们做了什么事情呢?


非常简单,在匿名函数内部,定义一个对象。

给对象添加各种需要暴露到外面的属性和方法(不需要暴露的直接定义即可)。

最后将这个对象返回,并且在外面使用了一个MoudleA接受。


接下来,我们在man.js中怎么使用呢?


我们只需要使用属于自己模块的属性和方法即可

这就是模块最基础的封装,事实上模块的封装还有很多高级的话题:

但是我们这里就是要认识一下为什么需要模块,以及模块的原始雏形。

幸运的是,前端模块化开发已经有了很多既有的规范,以及对应的实现方案。

常见的模块化规范:

CommonJS、AMD、CMD,也有ES6的Modules


fe64d18c81a34195900d80b1e086e4b9.png


2.CommonJS


模块化有两个核心:导出和导入

CommonJS的导出:


aaa94589137945fc875aadcba2246977.png


CommonJS的导入:


6c265e9e0f1c49bc832d98a0007b545b.png


3.ES6的export指令


3.1.export基本使用


export指令用于导出变量,比如下面的代码:


b05c9a85b177414095df422a9b362bdb.png

上面的代码还有另外一种写法:

81257d909913441c885185e9ae8af220.png


3.2.导出函数或类


上面我们主要是输出变量,也可以输出函数或者输出类

上面的代码也可以写成这种形式:


62f0e4676196493b9e447ebd43ccfd12.png


3.3.export default


某些情况下,一个模块中包含某个的功能,我们并不希望给这个功能命名,而且让导入者可以自己来命名


这个时候就可以使用export default


2d890ceceaa747c4a2757dbef34779c2.png


我们来到main.js中,这样使用就可以了


这里的myFunc是我自己命名的,你可以根据需要命名它对应的名字


489f7aebe59b422ba228b2554d68f243.png


另外,需要注意:

export default在同一个模块中,不允许同时存在多个。


4.ES6的import指令


4.1.import使用


我们使用export指令导出了模块对外提供的接口,下面我们就可以通过import命令来加载对应的这个模块了

首先,我们需要在HTML代码中引入两个js文件,并且类型需要设置为module


02257777d8a246f88796f28f69c269f6.png


import指令用于导入模块中的内容,比如main.js的代码


799fc45ec7094920a0d351147aea4316.png


如果我们希望某个模块中所有的信息都导入,一个个导入显然有些麻烦:

通过可以导入模块中所有的export变量


但是通常情况下我们需要给
起一个别名,方便后续的使用


0db8f5cab071479f976d7843d30905e8.png

目录
相关文章
|
1月前
|
JSON 监控 前端开发
AMIS:百度开源的前端低代码神器,18.4k star 背后的开发效率提升利器
AMIS(前端低代码框架)是百度开源的低代码前端框架,基于纯 JSON 配置即可生成完整后台页面,包括表单、表格、图表、CRUD 列表,支持可视化拖拽编辑。,星标数已达 18.4k,百度内部已沉淀超过 5 万个页面,广泛应用于审核系统、数据管理后台、模型监控等落地场景
387 0
|
4月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
388 1
|
5月前
|
移动开发 前端开发 JavaScript
Vue与React两大前端框架的主要差异点
以上就是Vue和React的主要差异点,希望对你有所帮助。在选择使用哪一个框架时,需要根据项目的具体需求和团队的技术栈来决定。
328 83
|
4月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
238 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
6月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
270 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
4月前
|
JavaScript 前端开发 编译器
Vue与TypeScript:如何实现更强大的前端开发
Vue.js 以其简洁的语法和灵活的架构在前端开发中广受欢迎,而 TypeScript 作为一种静态类型语言,为 JavaScript 提供了强大的类型系统和编译时检查。将 Vue.js 与 TypeScript 结合使用,不仅可以提升代码的可维护性和可扩展性,还能减少运行时错误,提高开发效率。本文将介绍如何在 Vue.js 项目中使用 TypeScript,并通过一些代码示例展示其强大功能。
188 22
|
5月前
|
监控 前端开发 小程序
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
411 12
|
6月前
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
JSON 前端开发 数据可视化
前端开发者狂喜!30K star开源组件库,界面美观度/开发速度双碾压!
嗨,大家好,我是小华同学。Layui 是一款开源前端 UI 组件库,具有极简设计、强大功能和卓越性能,支持布局、表单、表格、弹层等六大模块,组件高度可定制。它无需复杂构建工具,直接面向浏览器开发,极大提升开发效率与界面美观度。适合新手和老手,快来试试吧!
235 0
|
JavaScript 前端开发
一周精通Vue(二)组件访问、插槽、组件作用域、模块化
vue、组件访问、插槽、组件作用域、模块化、vue基础、快速上手vue、vue详细讲解
16434 0

热门文章

最新文章