《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

目录
相关文章
|
7月前
|
JSON 监控 前端开发
AMIS:百度开源的前端低代码神器,18.4k star 背后的开发效率提升利器
AMIS(前端低代码框架)是百度开源的低代码前端框架,基于纯 JSON 配置即可生成完整后台页面,包括表单、表格、图表、CRUD 列表,支持可视化拖拽编辑。,星标数已达 18.4k,百度内部已沉淀超过 5 万个页面,广泛应用于审核系统、数据管理后台、模型监控等落地场景
1314 0
|
6月前
|
人工智能 前端开发 JavaScript
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
852 18
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
639 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
10月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
551 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
637 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
JSON 前端开发 数据可视化
前端开发者狂喜!30K star开源组件库,界面美观度/开发速度双碾压!
嗨,大家好,我是小华同学。Layui 是一款开源前端 UI 组件库,具有极简设计、强大功能和卓越性能,支持布局、表单、表格、弹层等六大模块,组件高度可定制。它无需复杂构建工具,直接面向浏览器开发,极大提升开发效率与界面美观度。适合新手和老手,快来试试吧!
643 0
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1312 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
580 0
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
642 6

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    877
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    402
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    305
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    274
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    399
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    584
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    614
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    189
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    533
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    345