vue2
前端工程化:
前端工程化是指:在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。
四个化:
模块化:js的模块化,css的模块化,资源的模块化
组件化:复用现有的UI结构、样式、行为
规范化:目录结构的划分、编码规范化、接口规范化、文档规范化、Git分支管理
自动化:自动化构建、自动部署、自动化测试
前端工程化的解决方案(目前主流):
1,webpack 2,parcel
webpack:
主要功能:
1,提供友好的模块化开发支持
2,代码压缩混淆
3,处理浏览器端javascript的兼容性、性能优化等
webpack插件安装:
1,webpack-dev-server:每当修改了源代码时候,进行保存后,会自动进行项目的打包和构建
2,html-webpack-plugin:1、自动将生产的index.html放到更目录中(内存中) 2、在生成的index.html中注入打包的bundle.js文件
3,webpack-cli
4,css-loader:由于webpack只能打包后缀名为.js的文件,而此插件可以打包处理后缀名为.css的文件
5,style-loader:同上
6,less-loader:打包处理后缀名为.less的文件
7,file-loader
8,url-loade:打包处理图片
9,babel-loader:由于webpack只能打包处理部分高级的后缀名为.js的文件,而此插件可以打包处理高级后缀名为.js的文件
10,@babel/core
11,@babel/plugin-proposal-decorators:此插件为babel-loader的插件
@:
1,在src中文件的层级关系,用@(绝对地址)来表示
2,在webpack.config.js中配置@对应的目录。通常对应src这一层目录。
vue2:
定义:是一套用于构建用户界面的前端框架
特性:
1,数据驱动视图 :在使用vue的界面中,vue会监听数据的变化,从而自动重新渲染页面的结构(数据驱动视图是单向的数据绑定)
2,双向数据绑定:可以辅助开发者在不操作DOM的前提下,自动把用户的填写的内容同步到数据源中,(只有表单元素才能使用v-model,否则不生效)
mvvm:
定义:是vue实现数据驱动视图、双向数据绑定的核心原理。mvvm指的是model、view和viewmodel,它把每个页面都拆分了这三部分
model:表示当前页面渲染时所依赖的数据源
view:表示当前页面渲染的dom结构
viewmodel:
1,表示vue的实例,它是mvvm的核心
2,工作原理:
2.1viewmodel把当前页面的数据源(model)和页面的结构(view)链接在了一起
2.2,当数据源发生变化时,也会被viewmodel监听到,vm会根据最新的数据源自动更新页面的结构
2.3,当表单元素的值发生变化时,也会被vm监听到,vm会把变化后最新的值自动同步到model数据源中
内容渲染指令:
1,v-text:会覆盖掉内部原有的内容
2,{{}}:差值表达式,将对应的内容渲染到元素的内容节点中,同时保留元素自身的默认值
3,v-html:可以把包含HTML标签的字符串渲染为页面的HTML内容
属性绑定指令:
1,v-bind:为元素的属性动态绑定属性值(可以简写为 : )
2,v-bind和{{}}还支持jacascript表达式的运算
3,在使用v-bind属性绑定期间,如果绑定的内容需要动态拼接,则字符串需要用单引号包裹起来
事件绑定指令:
v-on: 为元素添加页面监听事件,可以简写为@
事件修饰符:
1,prevent:用在@click.prevent,可以阻止默认事件
2,stop:阻止事件冒泡
3,capture:以捕获模式触发当前的事件处理函数
4,once:绑定的事件只触发一次
5,self:只有在event.target是当前元素自身时才触发事件处理函数
按键修饰符:
为键盘相关的事件添加修饰符,监听键盘事件,用来判断详细的按键(@keyup.enter = "函数")
双向绑定指令:
v-model:(只有表单元素才能使用v-model,否则不生效)
1,当数据源发生变化时,也会被viewmodel监听到,vm会根据最新的数据源自动更新页面的结构
2,当表单元素的值发生变化时,也会被vm监听到,vm会把变化后最新的值自动同步到model数据源中
v-model指令的修饰符:
1,number:自动将用户的输入值转为数值类型
2,trim:自动过滤用户输入的首尾空白字符
3,lazy:在“change”时而非“input”时更新
条件渲染指令:
1,v-show的:动态的为元素添加或移除display:none样式,来实现元素的显示和隐藏 (如何要频繁的切换元素的显示状态,用v-show性能会更好)
2,v-if:每次动态的创建或移除元素,实现元素的显示和隐藏 (如果刚进入页面的时候,某些元素默认不需要被展示,或者用户选择后期这个元素不被展示出来,此时v-if性能更好)
3,在实际开发中,不需要考虑性能问题,直接用v-if就行
循环渲染指令:
1,vue提供了v-for列表渲染指令,用来辅助开发者基于一个数组来循环渲染一个列表结构
2,v-for指令需要使用item in items形式的特殊语法,items是待循环的数组item是被循环的每一项
3,v-for指令还支持一个可选的第二个参数,即当前项的索引。语法格式为(item,index)in items
4,注意:v-for指令中的item项和index索引都是形参,可以根据需要进行重命名
5,用v-for就要加一个属性key,:key(item.id)
key的注意事项:
1,key的值只能是字符串或数字类型
2,key的值必须具有唯一性(即:key的值不能重复)
3,建议把数据项id属性的值作为key的值因为id属性的值具有唯一性且和数据一一对应)
4,使用index的值当作key的值没有任何意义(因为index的值不具有唯一性)
5,建议使用v-for指令时一定要指定key的值(即防止列表紊乱,又提升了性能)
过滤器:(私有过滤器和全局过滤器。仅在vue2.x和1.x受支持,在vue3.x的版本中剔除了过滤器相关的功能)
1,过滤器(filters)是vue为开发者提供的功能,常用于文本的格式化
2,用在两个地方:差值表达式和v-bind属性绑定
3,过滤器要被添加在javascript表达式的尾部,由“管道符”(|)进行调用
4,要定义到filters节点下,本质是一个函数
5,在过滤器函数中,一定要有return值
6,在过滤器的形参中,可以获取到“管道符”前面待处理的数值
7,filters节点下定义的过滤器,称为“私有过滤器”,因为它只能在当前vm实例所控制的el区域内使用
8,如果希望在多个vue实例之间共享过滤器,则可以使用全局过滤器
9,如果全局过滤器和私有过滤器名字一致,按照“就近原则”调用私有过滤器
10,Vue.filter("参数",(参数) => { } )
11,第一个参数:是全局过滤器的“名字”
12,第二个参数,是全局过滤器的“处理函数”
13,过滤器可以多个调用
14,过滤器可以接收参数
watch侦听器:
1,watch侦听器:允许开发者监视数据的变化,从而针对数据的变化做特定的操作
2,本质上是一个函数,要监视哪个数据的变化,就把数据名作为方法即可
3,数据名(newVal, oldVal) { } (方法格式侦听器)
4,newVal变化后的新值,oldVal变化前的旧值
5,侦听器分为:方法格式的侦听器和对象格式的侦听器
7,对象格式侦听器:可以通过 immediate 选项,让侦听器自动触发(在刚进入页面的时候,自动触发一次侦听器)
8,数据名:{ handler(newVal,newVal),immediate:true } (handler:侦听器的处理函数。数据发生变时候自动进入这个函数)
9,方法格式侦听器,在监听的是一个对象时,如果对象中的属性发生了变化,那么不会触发侦听器
而对象格式的侦听器可以通过deep选项,让侦听器深度监听对象中每一个属性的变化 ( 数据名:{ handler(newVal,newVal){ },deep:true } )
10,如果只是想监听对象中单个属性的变化,则可以按照如下的方法定义watch侦听器:' 对象.属性名 ':{ handler(newVal,newVal){ }
计算属性:
1,计算属性指的是:通过一系列运算之后,最终得到一个属性值
2,这个动态计算出来的属性值可以被模板结构(差值表达式 和v-bind)methods方法使用
3,计算属性格式:computed:{ 数据名(){ } }
axios:
1,axios是一个专注于网络请求的库
单页面应用程序:
1,简称SPA(Single Page Application),指的是一个Web网站中只有唯一的一个HTML页面,所有的功能与交互都在这唯一的一个页面内完成
vue-cli:
1,是Vue.js开发的标准工具。它简化了程序员基于webpack创建工程化的Vue项目的过程
2,在终端中使用npm install -g @vue-cli 命令下载
3,在终端输入 vue create 项目的名称 来创建指定名称的项目
4,在终端输入 npm run serve 或者 npm run build 来运行项目
·vue 项目中src目录的构成:
assets文件夹:存放项目中用到的静态资源文件,例如:css样式表、图片资源
components文件夹:程序员封装的、可复用的组件,都要放到components目录下
main.js 是项目的入口文件。整个项目的运行,要先执行main.js
App.vue 是项目的根组件
·vue项目的运行流程:
在工程化的项目中,vue要做的事情很单纯:通过main.js把App.vue渲染到index.html的指定区域中
1,App.vue:是用来编写待渲染的模板结构
2,index.html:需要在其中预留一个el区域
3,main.js把App.vue渲染到index.html所预留的区域中
vue组件:
1,组件化开发:根据封装的思想,把页面上可重用的UI结构封装为组件,从而方便项目的开发和维护
2,vue是一款支持组件化开发的前端框架
3,vue中规定:组件的后缀名是.vue。之前接触到的App.vue文件本质上就是一个vue的组件、、
4,vue组件由三部分组成:template:组件的模板结构。 script:JavaScript行为。 style:组件的样式
5,在组件中,this就表示当前组件的实例对象
6,组件在被封装好之后,彼此是相互独立的,不存在父子关系
7,在使用组件的时候,根据彼此额嵌套关系,形成了父子关系,兄弟关系
8,使用组件的三个步骤:
1,使用import语法导入需要的组件
2,使用components节点注册组件
3,以标签形式使用刚才注册的组件
9,通过components注册的是私有子组件
1,在组件A的components节点下,注册了组件F,则组件F只能用在组件A中。不能用在组件C中
10,注册全局组件
1,在main.js中导入需要全局注册的组件:import 组件的注册名字 from '需要被全局注册的组件的地址 '
2,写入 Vue.component( ' 被接收的组件名 ',接收的组件名 )
11,自定义属性 props
1,props是“ 自定义属性 ”,允许使用者通过自定义属性,为当前组件指定初始值
2,自定义属性的名字,是封装者自定义的 格式 props:[ ' 自定义属性的名字 ' ]
3,props中的数据,可以直接在模板结构中被使用
4,vue规定:组件中封装的自定义属性是只读的,程序员不能直接修改props的值。否则会报错
5,如果要修改,可以把修改的值转存到data中
6,在声明自定义属性时,可以通过default来定义属性的默认值,这样当用户在没传值时,可以使用默认的属性值 格式 props:{ 自定义属性A:{ default:值 } }
7,在声明自定义属性值时,可以通过type来定义属性的值类型。如果传递过来的值不符合此类型,则会在终端报错
8,声明自定义属性值 格式 type:Number
9,required必填项 格式 requirde:true
10,props是组件的自定义属性,在封装通用组件的时候,合理的使用props可以极大地提高组件的复用性
12,组件之间的样式冲突问题
1,默认情况下,写在.vue组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题。
2,导致组件之间样式冲突的根本原因是:
1,单页面应用程序中,所有组件的DOM结构,都是基于唯一的index.html页面进行呈现的
2,每个组件中的样式,都会影响整个index.html页面中的DOM元素
3,在style中使用scoped属性,可以自动的为每一个元素添加一个相同的自定义属性
4,可以用deep去修改被通用组件的默认样式 格式: / deep / 要修改的元素
13,组件的生命周期&生命周期函数
1,生命周期是指一个组件从创建 > 运行 > 销毁的整个阶段,强调的是一个时间段
2,生命周期函数:是有vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行
3,beforeCreate(){ }:创建实例化组件 阶段的第一个生命周期
4,created(){ }:经常在这里调用methods的方法,请求服务器的数据,并把得到的数据,转存到data中,供到template模板渲染的时候使用(模板结构在此阶段还未生成)
5,mounted:把内存中的html结构,已经成功的渲染到了浏览器中,此时已经包含了当前组件的DOM结构
6,beforeUpdate:在数据变化后,将最新的数据,重新渲染组件的模板结构
7,updated:已经更新了最新的数据,完成了组件的DOM结构的重新渲染
8,beforeDestroy:将要销毁此组件,此时尚未销毁,组件还处于正常的状态
9,destroyed:组件已经被销毁,此组件在浏览器中对应的DOM结构已被完全移除
13,组件之间的数据共享:
1,组件之间的关系
1,父子关系
2,兄弟关系
2,父组件向子组件共享数据
1,父组件向子组件共享数据需要使用到自定义属性
3,子组件向父组件共享数据
1,使用自定义事件
2,在子组件中定义一个函数,写入:this$emit(' 自定义事件名 ‘ ,this.数值)
3,在父组件中,在组件标签里面添加事件,在事件中写入函数名;在methods中添加一个函数,将接收的参数值赋予data里的数据,从而完成数据的共享
4,组件之间的数据共享
1,创建eventBus.js模块,并向 外共享一个Vue的实例对象 import Vue from ' vue '; export default new Vue( )
2,在数据的发送方,调用bus.$emit(’ 事件名称 ‘,要发送的数据 )方法触发自定义事件
3,在数据接收方,在created函数调用bus.$on(’ 事件名称 ‘,事件处理函数)方法注册一个自定义事件
ref引用:
1,什么是ref引用:
1,ref引用:ref用来辅助开发者在不依赖与jQuery的情况下,获取DOM元素或组件的引用。
2,每个vue的组件实例上,都包含一个$refs对象,里面存储着对应的DOM元素或组件的引用。默认情况下,组件的$refs指向同一个空对象
3,$refs不仅可以获取DOM元素还可以获取组件的数据和方法
2,$nextTick( ):等待DOM重新渲染完成之后在执行里面的回调函数
动态组件:
1,动态组件:动态切换组件的显示与隐藏
2,vue提供了一个内置的< component > 组件,转门用来实现动态组件的渲染(组件的占位符)
3,< component >中的is属性的值,表示要渲染组件的名字
4,动态组件在切换中,会销毁之前的组件,可以用 keep-alive 来保存之前的组件 格式< keep-alive > < component > < /component > < /keep-alive >
5,keep-alive对应的生命周期函数:
1,当组件被缓存时,会自动触发组件的 deactivated 生命周期函数
2,当组件被激活时,会自动触发组件的 activated 生命周期
3,include属性用来指定: 只有名称被匹配的组件会被缓存,多个组件之间用英文逗号分隔
4,exclude属性:与include相反,名称被匹配的组件不会被缓存,但是不要同时使用这两个属性
5,如果在声明组件的时候,没有为组件指定组件名,则组件的默认名是注册时的名字
6,当提供了name属性的值后,组件的名称,就是name属性的值
插槽:
1,插槽:是vue为组件的封装者提供的能力,允许开发者在防装组件时,把不确定的、希望由用户指定的部分定义为插槽。
2,在组件中定义插槽格式为:< slot > </slot>
3,slot的name属性在不指定的情况下,默认为default,在App.vue中使用的组件,提供的内容都会被填充到default中去
4,v-slot可以在使用指定的插槽时,可以在被使用的标签中的template中写入v-slot = ' 指定的名称 '
5,template是一个虚拟元素,知识起到包裹性质的作用,并不会渲染为实质性html元素
6,v-slot:可以简写为:#
7,name属性名为default的标签中的内容为默认内容,如果被使用的组件中没有内容,则渲染默认内容,在官方的定义中默认内容为后备内容
8,具名插槽:为插槽起名,也就是name属性中指定名字
9,在封装组件的时,为预留的< slot >提供属性对应的值,这种用法,叫做“ 作用域插槽 ”
自定义指令:
1,vue允许开发者自定义指令,自定义指令分为:全局自定义指令,私有自定义指令
2,私有自定义指令:
1,在每个vue组件中,可以在directives节点下声明私有自定义指令
2,当指令第一次被绑定到元素上的时候,会立即触发bind函数
3,bind函数中形参的el表示当前指令绑定的DOM元素
4,bind函数中形参的binding,通过binding.value表示获取当前指令绑定的值
5,bind函数只调用一次,当指令第一次绑定到元素时调用,当DOM更新时bind函数不会被触发。update函数会在每次DOM更新时被调用
6,如果bind和update函数中的逻辑完全相同,那么对象格式的自定义指令可以简写为函数的形式