# Vue_workspace **Repository Path**: li-kewei123/vue_workspace ## Basic Information - **Project Name**: Vue_workspace - **Description**: 关于Vue的代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-02-21 - **Last Updated**: 2023-05-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 目标计划: ``` coderwhy老师全套课程链接:https://pan.baidu.com/s/1enC95F9XoSY5bWlFhulv9Q?pwd=q5m5 提取码:q5m5 最新接口地址:baseURL = "http://123.207.32.32:7888/api/hy66" 看一下我下面两个接口的使用方法,建议先在浏览器测试,学会接口的使用,再去修改自己的代码。 ``` ![1681983632536](images\vue0074.png) # 前置知识 ```html Vue: 和之前操作DOM的方式完全不一样,思想都不一样,编程范式(模式)也不一样。 从零学习Vue开发。 需要具备一定的HTML、CSS、JavaScript基础。 ES6语法 promise。new promise(写异步,有专门处理成功的回调,好处理失败的回调) 。 axios 以后我们基本上是写ES6的语法,很少写ES5的语法,通过Babel工具来让ES6语法转成ES5让浏览器支持。 给浏览器使用的还是ES5的语法,项目中开发过程中都是ES6语法。ES6肯定比ES5更好用。 ES6语法规范:结构赋值、模板字符串、箭头函数等 ES6模块化:默认暴露、分别暴露、统一暴露、恩enpate\ispote等--可能会拼错 包管理器:npm、yarn、cnpm等会一个就行 原型和原型链(原理):重点 数组的常用方法:过滤一个数组、加工一个数组、筛选最值等 Typescript: 比起ES6更好用。 jQuery: 过去的20多年,大家都在使用jQuery,可能一些老项目里面会有jQuery。 慢慢正在退出历史的舞台。 Github仓库里面,jQuery组织宣布在慢慢移除jQuery代码,已经不在使用jQuery。 慢慢退出,现在jQuery处于慢慢向三大框架的过渡阶段。 因为有些公司还在使用jQuery,所以现在我们都要学习jQuery和三大框架。 当我们引入vue.js之后,会把vue注册成为一个全局变量,类似于jQuery对象。 原来引入jQuery的时候,全局多了$和jQuery两个关键词。 但是不学前置知识,也可直接上手Vue,只是理解不是那么深刻。学习Vue也会讲一些命令给其串下去。 ``` # 目标 合计232集每日10集 第一集还没看,是综合类的,后面继续看。 ``` 1.Vue基础 2.vue-cli Vue脚手架,专门做工程化开发的。 3.vue-router,用于在Vue中实现前端路由的。 4、vuex,应用足够复杂时,借助vuex保管数据 ``` # 一、关于Vue.js ![img](images\vue0032.png) ## 1、Vue.js的重要性 ``` 原来: 前端和后端都能写页面。 很多东西都要使用命令行工具来干,前端开发原来不受重视,不需要掌握命令行工具。7-8k薪资。 自从Chrome V8引擎出来后,各种服务器端框架(例如Node.JS)就出来了,前端就流行了。12k薪资。 自从有了node,后端Java能干的事,前端都能干。例如: Java可以搭建一个服务,tomacat可以搭建一个web服务。 node.js也能搭建一个web服务。 后端工程师:后端接口 例如:controller、Service、Dao等接口封装好等待前端请求。 但是Java主要是往分布式方向发展的,分布式会发展的越来越好。 前端工程师:15-16年前端就开始比较流行啦 直接访问controller就行,通过路径访问请求,发送请求,得到想要的数据即可。 数据在页面中渲染前端工程师来管。 前端体系:后端可以做的前端都可以做。 用途: 目前市场上比较流行的前后端分离的开发模式,大多前端都是vueJS做的,具体的优点请大家看官方文档。 10家公司7-8家基本都是Vue。 如果你现在正在换工作,你会发现招聘前端的需求中,10个有8个都对Vue有或多或少的要求。 ``` ![img](images\vue0001.png) ![img](images\vue0002.png) ![img](images\vue0003.png) ![img](images\vue0004.png) ## 2、老项目特点 ``` 原来可能使用的原生开发或者jQuery开发,重构Vue老项目。 一个完整的项目里面,既有jQuery代码,也有Vue.js代码。 一点一点的引入,把Vue.js作为应用的一部分嵌套进去,带来更加丰富的交互体验。 渐进式:可以从一点一点的进行重构,直至重构的界面越来越多。 Vue.js的交互体验确实是比jQuery的交互体验更好。 问题:如果对项目进行全方面的重构的话,任务量是非常大的。 解决方法:可以分页面进行重构。 其中一个页面:继续使用jQuery,不对其进行重构。 另外一个界面:引入Vue.js框架,慢慢去除界面里面的JQuery代码,直至全部去除。 ``` ## 3、新项目特点 ``` 新项目:新项目决定使用Vue的技术栈 如果你希望将更多的业务逻辑使用Vue实现,那么Vue的核心库以及其生态系统。 Vue全家桶包括:基础语法(Vue核心Core)、组件、Vue路由(Vue-router)、Vuex等。 全家桶可以满足更大项目、更复杂业务逻辑都可以使用全家桶来开发,也可以满足你各种各样的需求。 启发: 以后出来的w.js需要自学的时候,来重构原来项目,也需要学习原来的老项目。 可以把Vue.js作为项目的一部分,也可以全部使用Vue.js框架进行开发。 总结: 不断学习,但是很多技术是相通的。 大部分公司不会给自己时间去学习框架,多数公司都是满足进度要求,抓紧时间做。一般学习框架,一边做项目。 大部分公司是不会给自己时间来学习的,项目来了直接上手去做。 ``` ## 4、Vue和Angular的区别? ``` 三大框架中,目前比较重要的是Vue,比其他两个还重要。 Vue.js在国内使用的很多,面试也问的很多。 在Vue里面,Vue和Vue.js是没有区别的。Angular1.x版本叫Angular,后面的版本叫Angular。 公司开发中,很少公司使用Angular,多数使用Vue,即便使用Angular.js,也是使用最新版本。 相比其它的 MVVM 框架(例如angular.js也是MVVM框架),Vue.js 更容易上手。 后起之秀:Vue之前有React,React之前有Angular。Vue框架参考了React和Angular。 Angular: 学习Angular框架的时候,还需要学习jQuery。 Angular和Angular.js的区别? Angular:新的版本,不在使用ES6,直接使用TypeScript。1.x以后的版本叫Angular。 在国内,使用Angular的新版本是比较多的。 Angular.js:原来学习还在使用ES5。1.x版本叫Angular.js。 在国内,Angular.js在公司里面使用的比较少。 原来学习的是Angular.js,一般学习完Angular.js还要学习一下Angular。 在Vue中,Vue和Vue.js是没有区别的。 ``` ## 5、Vue和jQuery的区别? ``` 编程范式和编程模式完全不一样。 ``` ## 6、Vue的官网 英文官网:https://vuejs.org/ 网址后缀为`org`的一般是开源的 中文官网3.0:https://cn.vuejs.org/ 中文官网2.0:https://v2.cn.vuejs.org/ ```html Vue官网:已经把Vue3作为默认版本,原来是Vue2作为默认版本,使用时需要切换Vue版本。 现在目前企业或者市场主流开发依然使用的Vue2,但是Vue3绝对是未来发展的趋势。 Vue2过渡到Vue3的阶段。Vue2在4年间迭代更新70多次(从2.0.0-2.6.74)。 目前要求:Vue2(是经典版本,即将淘汰但也要会)+Vue3(趋势) Vue CLI2和Vue CLI3虽然都有了,但是一些老的项目在使用Vue CLI2,一些新的项目在使用Vue CLI3了。 前面讲解的时候,可以使用Vue CLI2的知识讲解,后面在做项目的时候,可以使用Vue CLI3来进行项目。 ``` ![img](images\vue0005.png) ## 7、Vue的读音 ``` Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 不要读错,以后面试的时候也不要读错。 例如:读x三个音,读叉一个音。读叉code。读起来更简单。 iPhone x 读 iPhone 叉 xcode是一款IOS开发的IDE。 ``` ## 8、Vue的作者 ``` 一位华裔前 Google 工程师,尤雨溪是Vue.js框架的作者,HTML5版Clear的打造人,独立开源开发者。 他认为,未来App的趋势是轻量化和细化,能解决问题的应用就是好应用。而在移动互联网时代大的背景下,个人开发者的机遇在门槛低,成本低,跨设备和多平台四个方面。 尤雨溪毕业于上海复旦附中,在美国完成大学学业,本科毕业于Colgate University,后在Parsons设计学院获得Design & Technology艺术硕士学位,后任职于纽约Google Creative Labs(谷歌创意实验室),曾经任职Meteor Development Group(Meteor开发小组)。 由于工作中大量接触开源的JavaScript项目,最后自己也走上了开源之路,现全职开发和维护Vue.js。 2014年2月,开发了一个前端开发库Vue.js。Vue.js 是构建 Web 界面的JavaScript库,是一个通过简洁的API提供高效的数据绑定和灵活的组件系统。 2016年9月3日,在南京的JSConf上,Vue作者尤雨溪正式宣布加盟阿里巴巴Weex团队,尤雨溪称他将以技术顾问的身份加入 Weex 团队来做 Vue 和 Weex 的JavaScript runtime整合,目标是让大家能用 Vue 的语法跨三端(桌面应用/Web 应用/手机 App)。 尤玉溪大学专业并非是计算机专业,在大学期间他学习专业是室内艺术和艺术史,后来读了美术设计和技术的硕士,正是在读硕士期间,他偶然接触到JavaScript,从此被这门编程语言深深吸引,开启了自己的前端生涯。 他的Github上面,他不仅仅是做了Vue,还做了其他。尤玉溪的作品不仅仅有Vue,还有其他。 更多看:百度百科。 2016年开始应该是互联网飞速发展的几年,同时也是Web前端开发非常火爆的一年,Web 前端技术发展速度让人感觉几乎不是继承式的迭代,而是一次次的变革和创造。 这一年中有很多热门的前端开发框架,下面为大家总结2016年至今最受欢迎的几款前端框架。 2016年前端特别火爆,Java比前端更难学,2016年angular.js相当火爆,但是自从前端三大框架出来后,angular.js的热度就降了一些。 ``` ![img](images\vue0033.png) ![img](images\vue0034.png) ``` Taylor otwell是Python领域的大牛。他的粉丝基本都是学习编程的,明星代言,就火起来了。 Vue的图标颜色是绿色,代表着勃勃生机。 他不想自己一个人或者公司使用这一个小框架,于是对外发布。其实刚发布那时,没人会关注一个小框架,Taylor是PHP里面一个知名框架作者,一直都很有名气,粉丝比较多。 后起之秀:Vue之前有React,React之前有Angular。Vue框架参考了React和Angular。 Angular三大框架里面最早流行的,2015年左右很火,后面React火了,尤玉溪觉得Angular太笨重了。 Vue2.0版本发布后,慢慢就火起来了。大型公司会使用Anguar和React。出去面试10家里面有8.5家都是Vue。 Vue2在4年间更新了70多次版本,从2.0.0-2.7.x,现在处于Vue2到Vue3的过渡阶段,Vue3是未来的趋势。 Vue早期只关注于视图层核心库,慢慢的加功能,例如Vue路由、状态管理、Vue脚手架爱等,慢慢的发展成为一个渐进式框架。 ``` ## 8、理解Vue的渐进式框架 ``` 特点:从简单到复杂。 一点一点的来,可以把Vue当成一个核心库来使用,只用核心功能。 阶梯式向前,渐进式就是指我们可以由浅入深、由简单到复杂的方式去使用vue.js. 渐进式意味着你可以将Vue作为你应用的一部分嵌入其中,带来更丰富的交互体验。 把Vue的整个前端生态拿过来使用,重构/构建前端页面。 一个界面可能既有原生代码、jQuery代码、Vue代码。 例如:公司要引入一批设备,先从某个部门引入试用,慢慢推广到全部替换。 使用Vue构建新项目: 如果你希望将更多的业务逻辑使用Vue实现,那么Vue的核心库以及其生态系统。 使用Vue的全家桶:Core+Vue-router+Vuex,也可以满足你各种各样的需求。 Vue核心+Vue路由+Vue状态管理 可以满足大项目、复杂业务逻辑的开发。 可以进入一些基于Vue插件进行开发。 ``` ## 9、理解构建用户界面 ``` Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 简言之:构建用户界面,就是把得到的数据通过Vue里面的一套东西(插值表达式、指令等)转换为用户可以看到的界面。 至于数据是来自后台服务器还是数据mock,请求方式是异步还是同步,都不在Vue的职责范围之内。 面试题:谈谈对于构建用户界面的理解? 前端开发的工作职责是:在合适的时候发送对应的请求,获取对应的数据,以界面的形式展示给用户看。 写微信小程序步骤:(1)写静态页面 (2)对接后台数据 答:把得到的数据转换成用户可以看到的界面。模板结合数据形成一个界面。MVVM构成了用户界面。 ``` ![img](https://cdn.nlark.com/yuque/0/2023/png/26441951/1673168363995-354796ab-f5fd-4241-b5ef-85e167089d4d.png) ## 10、学习Vue的工具介绍 ``` postman工具:前端写一个东西查看效果是否好。可以直接发送请求查看是否给到了数据,只要结果传通了,其他交给前端了。也可以发权限、身份认证、权限拦截等都可以测出来。 ``` ## 11、Vue的特点 数据和界面进行解耦、虚拟DOM、组件化。 (1)采用组件化模式,提高代码复用率、且让代码更好维护。组件之间分别封装起来,互不影响。 一个.vue文件就是一个组件。 ![img](D:\workspace\vue_workspace\images\vue0006.png) (2)声明式编码,让编码人员无需直接操作DOM,提高开发效率。 操作案例: ![img](D:\workspace\vue_workspace\images\vue0007.png) 方法一:JS操作(命令式编码) ``` 让你往前走一步,老师发一句命令,你往前走一步,不发出命令你就不走了,说一下动一下。 下图少了任何一步都不行,少了任何一步都不行 ``` ![img](D:\workspace\vue_workspace\images\vue0008.png) 方法二:Vue操作(声明式编码) 口渴直接喝水。 ```html ``` (3)使用虚拟DOM+优秀的`Diff`算法,尽量复用DOM节点。 ![img](D:\workspace\vue_workspace\images\vue0009.png) ``` 如果数据发生变化,上面的就不好使用了。 下图是把原来有的覆盖掉了,不方便,也会影响效率。本可以直接添加差异化的东西,这样显的很方便。 如果数据量比较大,用原生JavaScript写的效率就非常低下啦。 ``` ![img](D:\workspace\vue_workspace\images\vue0010.png) ``` 如果改用Vue去实现,比较方便,中间多了一个环节叫做虚拟DOM。 可以把虚拟DOM理解为内存里面的一个数据。 如果数据不变化,一直是死数据,张三、李四、王五,虚拟DOM对我们没有帮助。 但是数据有变化,虚拟DOM就有作用。 Diff算法会进行比较。 ``` ![img](images\vue0011.png) ``` Vue里面的高级功能是jQuery不具备的,这些高级功能后面会解释到。 解耦视图和数据:一会写代码可以理解。 可复用的组件:学到组件化开发可以理解。开发一个组件,可以在多个界面使用。 前端路由技术:Vue-router会讲到。 状态管理:什么是一个状态管理?有哪些状态需要管理? 虚拟DOM:Vue的底层实现。 这些特点,不需要一个个去记住,我们在后面的学习和开发中都会慢慢体会到的,一些技术点我也会在后面进行讲解。 ``` ## 12、Vue.js 是什么 Vue (读音 /vjuː/,类似于 **view**) 是一套用于构建用户界面的**渐进式框架**。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与[现代化的工具链](https://v2.cn.vuejs.org/v2/guide/single-file-components.html)以及各种[支持类库](https://github.com/vuejs/awesome-vue#libraries--plugins)结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。 如果你想在深入学习 Vue 之前对它有更多了解,我们[制作了一个视频](https://v2.cn.vuejs.org/v2/guide/#),带您了解其核心概念和一个示例工程。 如果你已经是有经验的前端开发者,想知道 Vue 与其它库/框架有哪些区别,请查看[对比其它框架](https://v2.cn.vuejs.org/v2/guide/comparison.html)。 ``` 初步解释:与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。 深层次解释:Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。 ``` ![img](images\vue0030.png) Vue核心功能:是一个视图模板引擎,但这不是说Vue就不能成为一个框架。 如下图所示,这里包含了Vue的所有部件,在声明式渲染(视图模板引擎)的基础上,我们可以通过添加组件系统、客户端路由、大规模状态管理来构建一个完整的框架。更重要的是,这些功能相互独立,你可以在核心功能的基础上任意选用其他的部件,不一定要全部整合在一起。可以看到,**所说的“渐进式”,其实就是Vue的使用方式,同时也体现了Vue的设计的理念。** ![img](images\vue0031.png) ``` Vue的库:由核心库和一系列相关的插件组成 Vue核心库:比较轻量,可以实现一些基础的功能,可只使用核心功能,如果需要一些其他的功能,我们可以在核心库的基础上添加进来其他的插件。 另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。 Vue.js是以数据驱动和组件化的思想构建的。 ``` ## 13、Vue.js安裝 ``` 框架使用步骤:使用任何一个第三方框架,第一步都需要下载,安装,引用等。 ``` 方式一:直接CDN引入 适用于把项目发布出去,CDN引入代码下载效率更高,CDN会选择更近的服务器,把jQuery或者Vue代码下载下来。 ```JavaScript 使用到数据代理proxy (2)vm身上所有的属性及Vue原型上所有的属性,在 Vue模板中都可以直接使用。 ``` ### 14.3 计数器的MVVM ``` 我们的计数器中就有严格的MVVM(Model View ViewModel)思想 View依然是我们的DOM Model就是我们我们抽离出来的obj ViewModel就是我们创建的Vue对象实例 它们之间如何工作呢? 首先ViewModel通过Data Binding让obj中的数据实时的在DOM中显示。 其次ViewModel通过DOM Listener来监听DOM事件,并通过methods中的操作,来改变obj中的数据。 有了Vue帮助我们完成VueModel层的任务,在后续的开发,我们就可以专注于数据的处理,以及DOM的编写工作了。 ``` ![img](D:\workspace\vue_workspace\images\vue0017.png) ### 14.4 抽离data ```html

测试一下1:{{$options}}

测试一下2:{{$emit}}

测试一下3:{{_c}}

``` 总结: 所有的属性都绑定到了vm身上,vm实际上就是Vue实例对象。 只要是绑定到vm身上的属性,在模板中都能显示出来。 ### 14.5 拓展 ![img](D:\workspace\vue_workspace\images\vue0018.png) ``` 其实这种开发方式,就是我们常说的MV*模式 MVC、MVVM、 MVP等都是MV*的衍生物 搞清楚了这种代码组织结构的目的,就会明白这些模式本质上都是一回事。 让数据与视图间不会发生直接联系。 其实说到这里,你应该知道“DOM流存在缺陷的原因,在“DOM流”中其实是把dom当做Model,我们直接从dom中获取数据,随后又改变dom来更新视图,视图和模型其实是混在一起了,代码组织自然很混乱,不易维护。 而这种MV*的代码组织方式,渐渐的就演变成了所谓的框架。 团队开发中会选择使用框架的一个重要的原因,因为框架提前设定好的代码的组织结构让实际开发项目的代码有一个相对明确地方,这样不用担心因为团队中某个人疏忽或特有编码习惯, 造成代码整体的混乱。 这里说句题外话,依照现在对框架的认识,严格来说Bootstrap并不是一个框架,其实只是一个CSS工具集,主要用来做界面美化。 Jquery也并不涉及代码的结构组织,只是把一些重复的操作进行简化 (如 DOM操作 Ajax操作等),再加上对于兼容性的解决,所以只是用来方便操作的JS库。 现在利用`MV*`的代码组织方式,我们拥有了可以应对需求变化的健壮代码。 在使用过程中,开发人员逐渐发现在应对有频繁数据更新的需求时,我们总在做着同样的工作—获取DOM,依照新的数据来更新视图。 这些工作繁琐且重复,实质上耗费了开发人员的精力。 为了解决这个问题,基于MV*的模式的MVVM框架诞生—Knockout。 它利用实例的形式,把model层内容传入到实例所谓的view model中,利用binding方法完成view model与view之间的双向绑定,view mode中数据变化时,view发生变化,反之亦然。 这段对于Knockout描述可能有点抽象, 毕竟上没有上代码,但你至少知道Knockout框架能替我们完成了从数据更新后视图相应的更新就行了,如下图所示。 ``` ![img](D:\workspace\vue_workspace\images\vue0019.png) ``` 你可能会感叹,具有这么先进理念和功能的框架,自己怎么没用过,甚至之前没有听说过。 这是因为Knockout诞生的时候超越了它的时代,还记得这段开头提到MVVM框架产生的原因吗—应对有频繁数据更新的需求,而在当时前端页面的大部分就只涉及静态展示和简单交互,不存在频繁的数据变更,使用Jquery 足矣。 就这样,Knockout在当时并没有流行起来,不过这个框架现在依然存在,感兴趣的可以去看看,上手也很简单 。 直到最近几年,随着随着关于数据频繁变动的需求越来越多,人们又开始重视这种自动更新视图的理念了。 Vue就是继承这种理念的众多框架之一。如下图所示,在具有响应式系统的Vue实例中,DOM状态只是数据状态的一个映射 即 UI=VM(State) ,当等式右边State改变了,页面展示部分UI就会发生相应改变。很多人初次上手Vue时,觉得很好用,原因就是这个。不过需要注意的是,Vue的核心定位并不是一个框架,设计上也没有完全遵循MVVM模式,可以看到在图中只有State和View两部分, Vue的核心功能强调的是状态到界面的映射,对于代码的结构组织并不重视, 所以单纯只使用其核心功能时,它并不是一个框架,而更像一个视图模板引擎,这也是为什么Vue开发者把其命名成读音类似于view的原因。 ``` ![img](images\vue0020.png) ``` 框架:某些程序员把一些基础功能封装好,包含了特定的功能和特定的界面,自己在使用时,不用纠结底层实现,按照特定规范等直接拿来使用即可。 ``` ## 15、方法和函数的区别 方法:methods 方法和实例对象是挂钩的 函数:function 开发中不区分函数和方法 js里面:既有方法,也有函数 Java里面:只有方法,直接没有函数的概念 ```JavaScript ``` ## 16、Vue的生命周期 ``` Vue的生命周期里面做了很多复杂的操作。 生命周期:事务从诞生到消亡的整个过程。 Vue也有自己的生命周期,也会做很多事情,一般是不会销毁的,因为Vue里面有一个循环,我们也有办法让Vue销毁。 人也是有生命周期的,会做一系列的事情。例如:吃饭、上学、找工作、结婚生子... ``` ![img](D:\workspace\vue_workspace\images\vue0024.png) 图示生命周期: ``` 官方提供的生命周期函数: 绿色部分:Vue内部在做的事情。 红色部分:在Vue实例中我们可以实现的函数。 组件生命周期函数也是类似的,不过组件生命周期函数是会销毁的。 ``` ```html
``` ![1678457537983](images\vue0023.png) ![](D:\workspace\vue_workspace\images\16.png) ## 17、Vue源码 Vue的源码:https://github.com/vuejs/vue 下载源码注意事项: ``` 下载源码的时候不要直接进去就download,我们要先选择分支,再下载。 Branch dev 开发中版本,我们在公司开发,不会使用正在开发中的版本。 我们使用的一定是一个稳定的版本。 release 测试、释放:该版本是很稳定的。 公司里面版本分为:debug版本(开发阶段)、release版本(发布时候) debug/release 一个稳定的版本开发完成之后,我们会打一个tag标签,tag的版本是真正发布的版本。 ``` ![img](D:\workspace\vue_workspace\images\vue0021.png) ``` 文件/src目录/core目录/index.js---->入口文件 index.html-----整个网页html的入口 index.js-----整个网页js的入口 ``` ```JavaScript //index.js代码 import Vue from './instance/index' //导入Vue // 省略不必要代码 export default Vue//ES6的导出Vue new Vue实际上new的就是new导出的这个Vue ``` ```JavaScript // 文件/src目录/core目录/instanse/render-helpers/index.js部分代码 // 原来定义一个对象 function Person(options参数) { } // 执行函数并传递对象 new Person({}) // 现在定义一个对象,就是我们new Vue的东西 //同理 function Vue(options) { // 判断是生产环境还是开发环境 if (__DEV__ && !(this instanceof Vue)) { warn('Vue is a constructor and should be called with the `new` keyword') } // 初始化,并把options传进去 this._init(options)//_init()是一个函数 } ``` ```javascript // instanse/render-helpers/init.js部分代码 export function initMixin(Vue: typeof Component) { // 在Vue的原型上放了一个init Vue.prototype._init = function (options?: Record) { const vm: Component = this // a uid vm._uid = uid++ // 继续调用其他的init函数,做其他的一些操作 // 初始化操作,例如初始化状态 initLifecycle(vm) initEvents(vm) initRender(vm) //callHook 通过这个来回调,看生命周期 //beforeCreate还没有完全创建出来之前 callHook(vm, 'beforeCreate', undefined, false /* setContext */)//做完上面3行代码,给这个回调 initInjections(vm) // resolve injections before data/props // 初始化状态 initState(vm) initProvide(vm) // resolve provide after data/props //callHook 通过这个来回调,看生命周期 callHook(vm, 'created')//做完上面3行代码,给这个回调 // hook钩子有回调的意思,生命周期函数也叫钩子函数 // 传过来的函数,我通过钩子来回调你 } } ``` # 二、体验Vue.js ## 1、体验Vue.js的响应式 (1)Vue的源码里面肯定是定义了一个Vue的函数: ```javascript function Vue(){} //同理 //传递普通类型的参数进去 function Person(name,age){} ``` (2)后面我们就可以直接写构造函数:通过new关键字创建Vue实例的时候,传入一个对象 ```JavaScript //参数是一个对象 new Vue({}) new Person({}) // 普通类型的参数。 let vm = new Person('张三', 18) // 对象类型的参数。 const x = new Vue({}) //当年引入jQuery全局也是多了两个人,一个是$,一个是jQuery关键词 //引入Vue,全局多了一个内置对象or构造函数Vue //全局多出来Vue对象或者构造函数:函数两个身份->函数和对象 ``` (3)可以使用一个变量来接收: ```JavaScript // 在ES6中,一般不使用var,使用let和const var app = new Vue({}) // let定义变量 let app = new Vue({}) // const定义常量,以后不需要改动app,所以设置为常量 const app = new Vue({}) ``` (4)let和`const`的区别: 注意:var是有很多的缺陷的,没有变量的作用域的概念,使用的时候非常不好用,是JavaScript设计早期的一个缺陷。 在`ES6`中改变了,使用let和`const`。 ```JavaScript let name = '张三' name = '李四' const age = 18 age = 19//报错 var height = 1.88 height = 2.01 ``` (5)原理分析 通过Vue管理,去解析div里面的语法。 特殊语法,例如插值表达式里面有一个变量,回来data里面找数据,进行解析。 ```html

Vue实例不会来管理:{{age}}

Vue实例会来管理:{{msg}}

数组转换为字符串直接展示:{{movies}}


{{item}}



``` 如果服务器返回的数据发生改变,界面不用更改,会根据新的数据在div里面展示新的数据。 ![img](D:\workspace\vue_workspace\images\vue0013.png) 后面给数组追加元素的时候, 新的元素也可以在界面中渲染出来。 ![img](D:\workspace\vue_workspace\images\vue0014.png) ``` 和jQuery比较: 上面案例展示中只是更改另外数据,没有往ul里面添加代码。 如果是jQuery来操作,需要再创建一个li,往li里面再添加最后一条数据。 现在展示: 只需要告诉Vue数据怎么展示,声明出来就行。 自动创建li,并自动放在指定的位置上。 界面会自动添加。 我们越来越不愿意写jQuery代码了。 再也不需要在JavaScript代码中完成DOM的拼接相关操作。 而且,更重要的是,它还是响应式的。 也就是说,当我们数组中的数据发生改变时,界面会自动改变。 依然让我们打开开发者模式的console,来试一下 ``` ![img](D:\workspace\vue_workspace\images\vue0015.png) (6)原生js或jQuery的做法:编程范式是命令式编程 ```javascript //命令式编程:一步一步的告诉你怎么做,命令式的告诉你 1.创建一个div元素,设置id属性 2.定义一个变量message 3.将message变量放在前面的div元素中显示 4.修改message的数据:今天天气不错 5.将修改后的数据再次替换到div元素中 ``` (7)总结 ``` 当数据发生改变的时候,界面会自动发生一些响应,界面会自动发生改变。 体验vue响应式:数据发生改变时,界面会自动发生改变。 代码做了什么事情? 我们来阅读JavaScript代码,会发现创建了一个Vue对象。 创建对象的时候,可以传入一些参数,这里传入的参数是对象类型的参数。对象里面又包含其他一些属性。 创建Vue对象的时候,传入了一些options:{} {}中包含了el属性:该属性决定了这个Vue对象挂载到哪一个元素上,我们这里是挂载到了id为app的元素上。 {}中包含了data属性:该属性中通常会存储一些数据。 这些数据可以是我们直接定义出来的,比如像上面这样。 这些数据也可能是来自网络,从服务器加载或者请求过来的,再把数据放到data里面。 浏览器执行代码的流程: 执行到10~13行代码显然出对应的HTML 执行第16行代码创建Vue实例,并且对原HTML进行解析和修改。 ``` 注意:代码是从上往下解析的,当解析到插值表达式的依旧是插值表达式,一旦解析到变量,就把变量拿上去。 ## 2、模板语法 计算属性 事件监听 条件判断 循环遍历 阶段案例 v-model ### 2.1 插值操作 ``` 总结:Vue模板语法有两大类 (1)插值语法: 功能:用于解析标签体内容,放置在标签体中。 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中所有的属性。 (2)指令语法: 功能:用于解析标签(包括:标签属性、标签体内容、给标签绑定事件. . . . . .) 举例:v-bind:href="xxx" 或 简写为 :href="xxx" ,xxx同样要写js表达式, 且可以直接读取到data中的所有属性。 ``` #### 2.1.1 Mustache Mustache: 胡子,胡须 ```html

Hello,{{message}}!

{{firstName + lastName}}

{{18+2}}

{{firstName + ' ' + lastName}}

{{firstName}} {{lastName}}

{{getFullName()}}

{{fullName}}

{{fullName1}}

{{counter * 2}}

> ``` 案例演示: ![img](D:\workspace\vue_workspace\images\vue0025.png) #### 2.1.2 v-once ``` once 一次 但是,在某些情况下,我们可能不希望界面随意的跟随改变 这个时候,我们就可以使用一个Vue的指令 该指令后面不需要跟任何表达式(比如之前的v-for后面是由跟表达式的) 该指令表示元素和组件(组件后面才会学习)只渲染一次,不会随着数据的改变而改变。 ``` ```html  
   

{{message}}

               

{{message}}

 
    ``` 效果展示: ![img](D:\workspace\vue_workspace\images\vue0026.png) #### 2.1.3 v-html ``` 某些情况下,我们从服务器请求到的数据本身就是一个HTML代码 如果我们直接通过{{}}来输出,会将HTML代码也一起输出。 但是我们可能希望的是按照HTML格式进行解析,并且显示对应的内容。 如果我们希望解析出HTML展示 可以使用v-html指令 该指令后面往往会跟上一个string类型 会将string的html解析出来并且进行渲染 ``` ```html
百度一下

{{url}}


``` 演示效果: ![img](D:\workspace\vue_workspace\images\vue0027.png) #### 2.1.4 v-text v-text作用和Mustache比较相似:都是用于将数据显示在界面中 v-text通常情况下,接受一个string类型 ```html

Hello,{{message}}!

Hello,!

``` #### 2.1.5 v-pre ``` v-pre用于跳过这个元素和它子元素的编译过程,用于显示原本的Mustache语法。 比如下面的代码: 第一个h2元素中的内容会被编译解析出来对应的内容 第二个h2元素中会直接显示{{message}} ``` ```html

{{message}}

{{message}}

百度的标签和链接是:百度一下
``` 效果展示: ![img](D:\workspace\vue_workspace\images\vue0028.png) #### 2.1.6 v-cloak ``` 在某些情况下,我们浏览器可能会直接显然出未编译的Mustache标签。 该指令在学习Angular的时候学过。 cloak: 斗篷 clock:时钟 以后我们也不会使用v-cloak指令,以后写的模板都会渲染成一些函数,我们以后真正使用的是虚拟DOM。 ``` 当用户在运用到`{{message}}`的时候,js里面的代码报错了,就不能获取到该变量,显示的是`{{message}}`。给用户感觉肯定是不友好的,用户看不懂`{{message}}`是什么意思。 解决办法:还在执行到`{{message}}`代码的时候,让其隐藏起来,当运行到js代码的时候,在显示出来。 例如:在Vue解析之前,div中有一个属性v-cloak ```html

{{message}}

演示效果:1秒钟后才会显示出来Vue.js ``` 改进方法:在Vue解析之后,div中没有一个属性v-cloak ```html ``` 第21步:修改默认的class值(单独改) ```vue 首页 关于 ``` 修改默认的class值(整体改) ```js const router = new VueRouter({ routes, mode:'history', linkActiveClass:'x' }) ``` 第22步:通过代码跳转路由 push方法:可以返回 ```vue ``` repalce方法:不可以返回 ```vue ``` 第23步:动态路由 实现效果: ``` http://localhost:8080/user/zhangsan http://localhost:8080/user/lisi ``` 在index.js中配置: ```js const routes = [ { // path: '/user',//原始 // path: '/user/:user_id/',//都行 path: '/user/:userId/',//驼峰原则 component: User } ] ``` App.vue: ```vue 首页 关于 用户 ``` 效果展示:像这样配置是找不到组件的,点击用户会出现空白现象。 ![1680233497811](images\vue0039.png) 修改:App.vue ```vue 用户 ``` ```vue ``` 第24步:使用路由懒加载到router/index.js中 方式一:推荐---->方便管理 ```js // import Home from '../components/Home.vue' // import About from '../components/About' // import User from '../components/User.vue' const Home = () => import('../components/Home.vue') const About = () => import('../components/About') const User = () => import('../components/User') ``` 方式二:不推荐 ```js const routes = [ { path: '/user/:abc/', component: () => import('../components/User') } ] ``` 第25步:组件中的路由嵌套 (1)创建子组件 ```vue ``` ```vue ``` (2)配置嵌套路由 ```js // router/index.js const HomeNews = () => import('../components/HomeNews') const routes = [ { path: '/home', component: Home, children:[ { path:'', redirect:'message' }, { path:'news',//以后会自动拼接成/home/news的 component:HomeNews }, { path:'message', component:() => import('../components/HomeMessage') } ] } ] ``` (3)在首页中显示路由出口 ```vue ``` 第25步:参数传递 ``` URL = scheme://localhost:80/path?query#fragment scheme:http协议、ftp协议、tcp协议。 post:请求的网页默认是80端口,80端口浏览器是可以省略的 path:服务器放资源的路径 fragment:片段,做GPU开发就有片段 https:www.bai.com:80 80即使端口 http://localhost:8080/profile?name=likewei&age=18 http://localhost:8080/profile/userId/?name=likewei&age=18 /profile/userId/是path userId是params ``` ```vue ``` ```VUE ``` 第26步:动态标题解决办法 方式一:麻烦 ```vue ``` ```VUE ``` 方式二:全局导航守卫 ```js //router/index.js router.beforeEach() 点击beforeEach跳转 // router.d.ts beforeEach(guard: NavigationGuard): () => void 按住Ctrl点击NavigationGuard // type相当于typedefine,给NavigationGuard起别名(内容) // extends 继承 // 是一个泛型------TS语言里面的 export type NavigationGuard = ( //参数1 to: Route, //参数2 from: Route, //参数3 next: NavigationGuardNext ) => any //箭头函数执行的代码 afterEach(hook: ( //参数1 to: Route, //参数2 from: Route //参数3:因为跳转完了,到最后就不需要跳转了 ) => any): () => void ``` ```js //router/index.js const routes = [{ path: '/home', component: Home, meta: { title: '首页页面' } }, { path: '/about', component: About, meta: { title: '关于页面' }, beforeEnter: (to, from, next) => { console.log('进入了'); next() } } ] const router = new VueRouter({ routes, mode: 'history', linkActiveClass: 'x' }) // 前置钩子(hook),前置守卫(guard)----组件还没渲染出来就把标题改了 // router.beforeEach(function(to,from,next)){} // 简写 router.beforeEach((to, from, next) => { // 从from跳转到to // 一级组件展示 // document.title = to.meta.title next() //必须要写,覆盖内部写好的,才能执行跳转下一步,不写就不动了 // 实战:如果用户登录,可以进入该页面 console.log(to); // 二级组件展示 matched[0]拥有取第一个 document.title = to.matched[0].meta.title }) // 后置钩子(hook)----在跳转后进行的回调 router.afterEach((to, from) => { console.log(from + '后执行'); }) ``` ## 5、vue-router源码解析 ``` 在package.json中看到的版本不一定是当前使用的版本。具体可以到node_modules/vue-router里面查找。 看源码的时候,最好先从package.json中开始看,从哪里指向。 ``` router/index.js ``` 开发中执行Vue.use(VueRouter)时,就会执行VueRouter.install ``` src\index.js 入口 ```js // 定义VueRouter export default class VueRouter { static install: () => void; } VueRouter.install = install // 按住Ctrl点击install跳转到install.js ``` install.js ```js // 传入Vue类 export function install (Vue){ _Vue = Vue // 翻译 Vue.prototype.$router = return this._routerRoot.router; // 源码 Object.defineProperty(Vue.prototype, '$router', { get () { return this._routerRoot._router } }) // 翻译 Vue.prototype.$route = return this._routerRoot.route; // 源码 Object.defineProperty(Vue.prototype, '$route', { get () { return t his._routerRoot._route } }) // 注册全局组件,全局都可以使用 // 组件写法通常是HomeMsg写成 Vue.component('RouterView', View) Vue.component('RouterLink', Link) } ``` 所有组件都继承着Vue的原型: ```js // src/main.js Vue.prototype.test = function(){ //Vue和所有组件都多出来一个test方法 console.log('test'); } Vue.prototype.$router= '哈哈哈哈' ;//涉及到内部执行顺序问题,因为内部有一个,我们自己在这里又定义一个 Vue.prototype.$color= 'red' ; ``` ``` 任何一个组件中可以调用 this.test() this.name ``` 往对象里面添加属性: ```js // 方式一 const obj = { name: '张三' } // 方式二:定义属性 Object.defineProperty(obj,'age',18) ``` ## 6、插槽 ``` 插槽的使用:讲了两个 第一个是插槽的基本使用。 第二个是具名插槽: 掌握了具名插槽之后我们就可以封装很多的独立组件了 而且我们封装的组件适应性也很强,可以在很多的地方使用该独立组件。 ``` 一般的插槽: ``` 在生活中很多地方都有插槽,电脑的USB插槽,插板当中的电源插槽。 插槽的目的是让我们原来的设备具备更多的扩展性。 比如电脑的USB我们可以插入U盘、硬盘、手机、音响、键盘、鼠标等等。 ``` 组件的插槽: ``` 定义组件的时候也是可以定义插槽的。 组件的插槽也是为了让我们封装的组件更加具有扩展性。 让使用者可以决定组件内部的一些内容到底展示什么。 一般在自定义可复用组件的时候,会用到插槽。 ``` 第01步:插槽的基本使用 ```html
``` 第02步:实现要求 ``` 让组件具有扩展性 ``` ![1680436001219](images\vue0041.png) 封装原理: ![1680436968093](images\vue0042.png) ``` 例如:移动网站中的导航栏。 移动开发中,几乎每个页面都有导航栏。 导航栏我们必然会封装成一个插件,比如nav-bar组件。 一旦有了这个组件,我们就可以在多个页面中复用了。 但是,每个页面的导航是一样的吗?No,我以京东M站为例 ``` ![1680437048025](images\vue0043.png) 第03步:实现代码 ``` 如何去封装这类的组件呢? 它们也很多区别,但是也有很多共性。 如果,我们每一个单独去封装一个组件,显然不合适:比如每个页面都返回,这部分内容我们就要重复去封装。 但是,如果我们封装成一个,好像也不合理:有些左侧是菜单,有些是返回,有些中间是搜索,有些是文字,等等。 如何封装合适呢?抽取共性,保留不同。 最好的封装方式就是将共性抽取到组件中,将不同暴露为插槽。 一旦我们预留了插槽,就可以让使用者根据自己的需求,决定插槽中插入什么内容。 是搜索框,还是文字,还是菜单。由调用者自己来决定。 有些一样,有些不一样。一样的东西封装到组件里面,不一样的东西预留为插槽。 这就是为什么我们要学习组件中的插槽slot的原因。 ``` 第03步:直接写一个slot是没用的 浏览器是不会渲染出来的。 ```html ``` 第04步:替换代码 ```html
哈哈哈 呵呵呵呵
``` 第05步:给slot默认值 ``` 如果没有传递就会显示插槽里面默认的值。 如果有指定就会显示外面的内容。 ``` ```html

按钮

``` 第06步:全部替换 ```html

1

2 3
``` 第07步:总结 ``` 了解了为什么用slot,我们再来谈谈如何使用slot? 在子组件中,使用特殊的元素就可以为子组件开启一个插槽。 该插槽插入什么内容取决于父组件如何使用。 我们通过一个简单的例子,来给子组件定义一个插槽: 中的内容表示,如果没有在该组件中插入任何其他内容,就默认显示该内容 有了这个插槽后,父组件如何使用呢? ``` ![1680438376710](images\vue0044.png) 相关代码: ```html
傻蛋 老总
Vue
好家伙 niubi
``` 第08步:具名插槽的使用 ```html
``` 第09步:替换元素,结果三个都改为标题了。 ```html
标题
``` 需求:我们只需要其中的某一个,不要改其他的。 第10步:给插槽起名字 ```html
标题
``` ```html
标题1 标题2
``` 第11步:总结 ``` 掌握了具名插槽,就可以去封装很多独立组件,封装的组件适用应很强。 当子组件的功能复杂时,子组件的插槽可能并非是一个。 比如我们封装一个导航栏的子组件,可能就需要三个插槽,分别代表左边、中间、右边。 那么,外面在给插槽插入内容时,如何区分插入的是哪一个呢? 这个时候,我们就需要给插槽起一个名字 如何使用具名插槽呢? 非常简单,只要给slot元素一个name属性即可 我们来给出一个案例: 这里我们先不对导航组件做非常复杂的封装,先了解具名插槽的用法。 ``` ![1680448245219](images\vue0045.png) 相关代码1: ```html
``` 相关代码2:具名插槽 ```html

来来来

``` 第12步:编译作用域 ```html
``` ``` 在真正学习插槽之前,我们需要先理解一个概念:编译作用域。 官方对于编译的作用域解析比较简单,我们自己来通过一个例子来理解这个概念: 我们来考虑下面的代码是否最终是可以渲染出来的: 中,我们使用了isShow属性。 isShow属性包含在组件中,也包含在Vue实例中。 答案:最终可以渲染出来,也就是使用的是Vue实例的属性。 为什么呢? 官方给出了一条准则: 父组件模板的所有东西都会在父级作用域内编译;使用的变量都是使用父级的变量。 子组件模板的所有东西都会在子级作用域内编译。使用的变量都是使用子级的变量。 而我们在使用的时候,整个组件的使用过程是相当于在父组件中出现的。 那么他的作用域就是父组件,使用的属性也是属于父组件的属性。 因此,isShow使用的是Vue实例中的属性,而不是子组件的属性。 ``` ![1680450197690](images\vue0046.png) 第13步:作用域插槽 ```html
``` 不像那样展示: ```vue
javascript- C++- python-
``` 解决方法:从子组件里面获取到,在父组件里进行展示 ```vue
{{item}}
``` 让子组件传递过去给父组件: ```vue
{{slot.data.join('%%')}}
``` join函数使用: ```js const vm = new Vue({ components: { cpn: { template: '#cpn', data() { return { pLanguage: ['java', 'python', 'javascript', 'c++', 'c#', 'go', 'swift'] } }, created() { // join() 数组转换为字符串,多个元素以-进行连接 this.pLanguage.join('&&') } } } }) ``` 总结:作用域插槽 ``` 作用域插槽是slot一个比较难理解的点,而且官方文档说的又有点不清晰。 这里,我们用一句话对其做一个总结,然后我们在后续的案例中来体会: 父组件替换插槽的标签,但是内容由子组件来提供。 我们先提一个需求: 子组件中包括一组数据,比如:pLanguages: ['JavaScript', 'Python', 'Swift', 'Go', 'C++'] 需要在多个界面进行展示: 某些界面是以水平方向一一展示的, 某些界面是以列表形式展示的, 某些界面直接展示一个数组 内容在子组件,希望父组件告诉我们如何展示,怎么办呢? 利用slot作用域插槽就可以了 我们来看看子组件的定义: ``` ![1680484795547](images\vue0047.png) ``` 在父组件使用我们的子组件时,从子组件中拿到数据: 我们通过