《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

目录
相关文章
|
9天前
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
106 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
7天前
|
Dart 前端开发 容器
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
12天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
12天前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
43 10
|
8天前
|
缓存 前端开发 IDE
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
13天前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
52 1
|
4月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
273 14
|
4月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
76 0
|
4月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
4月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。

热门文章

最新文章