《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

目录
相关文章
|
10天前
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
|
4天前
|
JavaScript 开发者 UED
Vue入门到关门之第三方框架elementui
ElementUI是一个基于Vue.js的组件库,包含丰富的UI组件如按钮、表格,强调易用性、响应式设计和可自定义主题。适用于快速构建现代化Web应用。官网:[Element.eleme.cn](https://element.eleme.cn/#/zh-CN)。安装使用时,需在项目中导入ElementUI和其样式文件。
|
10天前
|
前端开发 JavaScript 搜索推荐
【专栏:HTML 与 CSS 前端技术趋势篇】HTML 与 CSS 在 Web 组件化中的应用
【4月更文挑战第30天】本文探讨了HTML和CSS在Web组件化中的应用及其在前端趋势中的重要性。组件化提高了代码复用、维护性和扩展性。HTML提供组件结构,语义化标签增进可读性,支持用户交互;CSS实现样式封装、布局控制和主题定制。案例展示了导航栏、卡片和模态框组件的创建。响应式设计、动态样式、CSS预处理器和Web组件标准等趋势影响HTML/CSS在组件化中的应用。面对兼容性、代码复杂度和性能优化挑战,需采取相应策略。未来,持续发掘HTML和CSS潜力,推动组件化开发创新,提升Web应用体验。
|
10天前
|
Dart 前端开发 测试技术
【Flutter前端技术开发专栏】Flutter开发中的代码质量与重构实践
【4月更文挑战第30天】随着Flutter在跨平台开发的普及,保证代码质量成为开发者关注的重点。优质代码能确保应用性能与稳定性,提高开发效率。关键策略包括遵循最佳实践,编写可读性强的代码,实施代码审查和自动化测试。重构实践在项目扩展时尤为重要,适时重构能优化结构,降低维护成本。开发者应重视代码质量和重构,以促进项目成功。
【Flutter前端技术开发专栏】Flutter开发中的代码质量与重构实践
|
10天前
|
存储 缓存 监控
【Flutter前端技术开发专栏】Flutter中的列表滚动性能优化
【4月更文挑战第30天】本文探讨了Flutter中优化列表滚动性能的策略。建议使用`ListView.builder`以节省内存,避免一次性渲染所有列表项。为防止列表项重建,可使用`UniqueKey`或`ObjectKey`。缓存已渲染项、减少不必要的重绘和异步加载大数据集也是关键。此外,选择轻量级组件,如`StatelessWidget`,并利用Flutter DevTools监控性能以识别和解决瓶颈。持续测试和调整以提升用户体验。
【Flutter前端技术开发专栏】Flutter中的列表滚动性能优化
|
10天前
|
Dart 前端开发 安全
【Flutter前端技术开发专栏】Flutter中的线程与并发编程实践
【4月更文挑战第30天】本文探讨了Flutter中线程管理和并发编程的关键性,强调其对应用性能和用户体验的影响。Dart语言提供了`async`、`await`、`Stream`和`Future`等原生异步支持。Flutter采用事件驱动的单线程模型,通过`Isolate`实现线程隔离。实践中,可利用`async/await`、`StreamBuilder`和`Isolate`处理异步任务,同时注意线程安全和性能调优。参考文献包括Dart异步编程、Flutter线程模型和DevTools文档。
【Flutter前端技术开发专栏】Flutter中的线程与并发编程实践
|
10天前
|
Dart 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的性能分析工具Profiler
【4月更文挑战第30天】Flutter Profiler是用于性能优化的关键工具,提供CPU、GPU、内存和网络分析。它帮助开发者识别性能瓶颈,如CPU过度使用、渲染延迟、内存泄漏和网络效率低。通过实时监控和分析,开发者能优化代码、减少内存占用、改善渲染速度和网络请求,从而提升应用性能和用户体验。定期使用并结合实际场景与其它工具进行综合分析,是实现最佳实践的关键。
【Flutter前端技术开发专栏】Flutter中的性能分析工具Profiler
|
10天前
|
前端开发 数据处理 Android开发
【Flutter 前端技术开发专栏】Flutter 中的调试技巧与工具使用
【4月更文挑战第30天】本文探讨了Flutter开发中的调试技巧和工具,强调其在及时发现问题和提高效率上的重要性。介绍了基本的调试方法如打印日志和断点调试,以及Android Studio/VS Code的调试器和Flutter Inspector的使用。文章还涉及调试常见问题的解决、性能和内存分析等高级技巧,并通过实际案例演示调试过程。在团队协作中,有效调试能提升整体开发效率,而随着技术发展,调试工具也将持续进化。
【Flutter 前端技术开发专栏】Flutter 中的调试技巧与工具使用
|
9月前
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
98 0
|
9月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
67 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置