VUE

Vue

Vue学习笔记完整版

官网:https://cn.vuejs.org/


Vue的特点

  • 采用模块化模式,、提高代码的复用率,且维护更加友好

  • 声明式编码,让编程人员无需直接操作DOM,提高开发效率

  • 使用虚拟DOM(Virtual-DOM)+优秀的Diff算法,尽量复用DOM节点

Screenshot_20230312_131100_tv.danmaku.bili

Vue的配置对象

el:挂载点

  • el——就是element的简称

  • el用于指定当前Vue实例为那个容器,值通常为css的选择器

  • 一个Vue实例不能同时去接管两个容器

  • 一个Vue实例只能对接一个容器

  • Vue实例容器之间是一对一的关系

data:数据对象

  • Vue中用到的数据定义在data中

  • data中可以写复杂数据类型的数据

  • 渲染复杂数据类型是,遵守js的语法即可

toUpperCase方法是将小写字母变成大写字母的方法

在Vue的实例里面html标签里使用{{}}来接受的数据属于插值语法

另外还有一种获取数据的方式指令语法,但是指令语法是用于在标签属性上或者标签内部,而插值语法的数据是在标签文本内容里

插值语法:

{{}}
——用于指定标签体的内容

指令语法:

——用于解析标签(包括:标签的属性标签体的内容绑定事件等)

el与data的两种写法

通过实例化Vue可得知

image-20230312161500082

image-20230312161735986

  • 首先要对Vue进行实例化然后将其赋值给一个变量

  • el的第二种写法

    使用a.$mount(“”)替换el,这样做可以做其他事项

  • data的第二种写法:函数式——等到学到组件时候必须使用这种函数式的data不能使用对象式data

如果使用的是箭头函数来写data,上方打印的this就变成了window全局对象,

即:data:()=>{

console.log(this) //当前this就变成了window全局对象

return{

name:“李白”

}

}

以后学到组件时,data必须使用函数式(不能使用箭头函数和对象式),否则会报错

由Vue管理的函数一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了

常用的指令语法

  • v-bind——绑定元素的属性值可以用冒号替换——<p v-bind:title="this is a p"></p>——><p :totle="this is a p"></P>

  • v-if

  • v-for

  • v-show——格局获取到的值来切换元素是否显示

    • 案例:点击按钮切换图片的显示和隐藏

  • v-text——设置元素的文本值即innerText

  • v-html——设置元数的innerHTML

  • v-on——绑定事件可以简写为@——需要用到methods——methods是编写方法函数的的一个对象,与data属于同级别

  • v-model——只能运用在输入类元素上

    • 案例:双向绑定数据

VUE.js学习

学习本门课程需要掌握HTML、CSS、JavaScript、AJAX基础知识

官网地址https://cn.vuejs.org

开发版本引用

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

VUE基础

  • JavaScript框架

  • 简化DOM操作

  • 响应式数据驱动

第一个VUE程序

步骤:

  • 导入开发版本的vue.js

  • 创建vue实例对象,设置el属性和data属性

  • 使用简洁的模板语法把数据渲染到页面

el:挂载点

  • el——是用来对标签进行选择的,id选择器、class选择器、标签选择器等,在实际开发中建议使用id选择器,对于选择的对应标签只能支持双标签——即有开始标签和结束标签的,如div等,不能支持单标签,如audio标签等,因为在单标签内部不能书写其他内容,即包裹不了其他内容,但也不是什么双标签都能让el挂载到,如 标签和 标签

  • Vue实例的作用范围是el选项命中的元素及其内部的后代元素

  • 可以使用其他的选择器,但建议使用id选择器

  • 不要使用body标签和html标签

  • el——的作用是设置Vue实例挂载(管理)的元素

data:数据对象

  • Vue中用到的数据定义在data中

  • data中可以写复杂数据类型的数据

  • 渲染复杂数据类型是,遵守js的语法即可

Vue本地应用

  • 通过Vue实现常见的网页效果

  • 学习Vue指令,以案例巩固知识

  • Vue指指的是以 v- 开头的一组特殊语法

内容绑定、事件绑定

v-once

  • v-once所在的节点在初次动态渲染后,就视为静态内容

  • 以后数据的改变不会引起v-once所在节点结构内容的更新,可以用于优化性能

像上面的的例子,在第一个span标签里使用了v-once指令后,点击button执行函数click后,第二个span标签的值会发生改变,但第一个span不会发生改变

v-pre

  • 让Vue跳过其所在节点的编译过程

  • 可以利用它跳过没有使用指令语法,没有使用插值语法的节点,会加快编译,相当于vue不去解析当前节点

执行结果:

1 {{b}}

v-text

  • 这个指令是把数据设置给标签的文本值(textContent)

  • 支持字符串拼接,如{{massage+“!”}}

  • 默认写法会替换全部内容,使用差值表达式{{}}可以替换指定内容

  • 内部支持写表达式v-text:”message+ ‘!’ ”

v-html

  • 设置标签的innerHTML

  • v-textv-html指令的差异

    • v-text是直接显示data里面的内容的,data里面写什么就显示什么,而v-html里,如果data里面是符合html结构的的语句的话就会显示HTML语句,其余与v-text类似

  • 内容中的html结构会被解析为标签

  • v-text指令无论内容是什么只会解析为文本

  • 解析文本内容使用v-text,解析html结构使用v-html

v-on基础

  • 为元素绑定事件

  • v-on:可以使用@代替,如下所示

  • v-on指令作用是为元素绑定事件

  • 事件名不需要写on

  • 指令可以简写为@

  • 绑定方法定义在methods属性中

  • 方法内部通过this关键字可以在访问定义在data 中的数据

methods:逻辑
  • 在里面定义方法,v-on绑定的方法

案例:计数器

显示切换、属性绑定

v-show

  • 根据表达值的真假切换元素的显示和隐藏

  • 本质是切换display的值

  • 指令后面的内容最终都会解析为布尔值

  • 值为true时显示,为false时隐藏

v-if

  • 根据表达式的真假来切换元素的显示和隐藏(操作dom元素)

  • 本质是通过操作dom元素来切换显示状态

  • 当表达式的值为true的时候元素存在于dom树中,为false时从dom树中移除

v-bind

  • 设置元素的属性(比如src、title、class)

  • 语法:v-bind:属性名="表达式"

  • 使用的时候v-bind是可以省略的直接写成<img :title="imgtitle">的样式,注意的是标签名与指令后面必须要有一个空格相隔,切不可写成<img:title="imftitle">等模样

  • v-bind指令是为元素绑定属性

  • 完整写法是v-bind:属性名

  • 简写的话直接省略v-bind只保留 :属性名

  • 需要动态的增删class建议使用对象的方式

案例:图片切换

列表循环、表单元素绑定

v-for指令

  • 根据数据生成列表结构(并且是响应式类)

  • v-for的作用是根据数据生成列表结构

  • 数组经常和v-for结合使用

  • 语法是(item,index) in 数据——item代表每一项,其不必名为item命名可以任意,index代表索引,in是关键字,数据则为定义好的那个数组名(需要注意的是,如果遍历的是对象,那index(也可以自定义名字)就代表的是对象的属性名,item就对应的是属性值,与之前的数组对是相反的)

  • item和index可以结合其他指令一起使用

  • 数组长度的更新会同步到页面上时响应式的

使用v-for指令,还有一个重要的的东西——key,key的特殊主要是在Vue的虚拟DOM算法,在新旧的nodes对比时辨别VNodes,如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型的元素的算法,而使用key,它会基于key的变化量重新排列元素顺序,并且移出 key不存在的元素。

有相同父元素的子元素必须有独特的key,重复的key会造成渲染错误

常见的用例是结合v-for

  • 如果不想使用对象或者数组定义一个id属性,则可以让key的值等于对应的索引

v-for同样能遍历字符串

这时,item代表了字符串的每一个字,index就是每一个字对应的索引

v-for可以遍历指定次数——v-for="(i,index) in 10"

v-for指令

  • 用于展示列表数据

  • 语法:v-for=“(item,index) in xxx”:key=“yyy”

  • 可遍历:数组、对象、字符串、指定次数

在Vue中key的作用

  • key就是给节点一个标识——就相当于与人类生活中的身份证号

v-on补充

  • 传递自定义参数,事件修饰符

  • 更多事件修饰符参考地址 https://cn.vuejs.org/v2/api/#v-on

  • 要是想要传递参数在后面加上具体的值,如:<input type="button" @click="a(p1,p2)"/>

v-model

  • 获取和设置表单元素的值(双向数据绑定)

  • v-model指令作用是便捷的设置和获取表单元素的值

  • 绑定的数据会和表单元素值相关联

  • 表单元素的值和绑定的数据是双向绑定的无论修改谁另一个的值也会随之改变

案例:记事本

v-cloak指令

 

理解MVVM模型

  • M:模型(Model):对应data中的数据。

  • V:视图(View):模板

  • VM:视图模型(ViewModel):Vue实例对象)

Screenshot_20230312_164600

所以但要使用变量来接收Vue实例化对象时一般标准化使用vm来接收,即:

const vm= new Vue({})

因此也得出了在标签体里的内容也不仅仅可以写data里的属性了,可以也vm里有的东西,例如:

<div id="a">{{$options}}</div>

image-20230312165508842

  • M:模型(model)——data中的数据

  • V:视图(View)——模板代码

  • VM:视图模型(ViewModel)——Vue实例

  • data中的所有属性,最后都会出现在VM身上

  • vm身上所有的属性以及Vue原型上所有的属性,在Vue模板上都可以使用

数据代理

回顾Object.defineProperty方法

  • 数据代理使用到该方法

Object.defineProperty——给一个对象添加属性用的方法

数据代理的定义

数据代理:通过一个对象代理对另一个对象中属性的操作 (读/写)

例如:

Vue中的数据代理

  • Vue实例里的data,如果要使用的话,是要写成vm._data的方式,这样就可以直接调用里面的属性,如vm._data.name

  • Vue数据代理的好处——更加方便操作data中的数据

  • 基本原理:

    • 通过Object.defineProperty()把data对象中所有的属性添加到vm上,为每一个添加到vm上的属性,都指定一个getter和setter,在getter和setter内部去操作data中对应的属性

Screenshot_20230318_105733

事件处理

  • 使用指令——v-on可以简写为@,后面加上事件的类型

所有被Vue管理的函数最好都写成普通函数,否则函数里面的this关键字指向的是window全局对象

  • 函数写在methods配置项里面——需要注意的是,函数也可以写在data配置项里面,但是会让Vue执行消耗更多的性能,即会数据代理,而写在methods里面是不需要数据代理的

当需要使用参数时,则在对应的标签上加上(参数)即可,例如<div @click='add(1)></div>'

当需要传参且还需要使用event——即事件对象时,在括号里面添加上$event,例如<div @click='add($event,1)></div>'$event可以放在参数的前面也可以放在参数的后面

  • 事件回调需要配置在methods对象中,最终会在vm上

  • methods中配置的函数,不要用箭头函数,否则this就不是vm了

  • methods中配置的函数,不是被Vue管理的函数,this的指向是vm或组件实例对象

  • @click=“demo”和@click=“demo($event)”效果一样,只是后者能够传参

事件修饰符

  1. prevent:阻止默认事件

  2. stop:阻止事件冒泡

  3. once:事件只触发一次

  4. capture:使用事件的捕获模式

  5. self:只有event.target——获取操作该函数的对象,输出时打印的是操作函数的具体元素信息。是当前操作的元素才触发事件

    image-20230318131123377

  6. passive:事件的默认行为立即执行,无需等待事件回调执行完毕

如果要是有事件修饰符,则在事件后面加上即可,例如<button @click.stop='add(event)'</button>

  • 如果需要使用多个修饰符——例如需要阻止冒泡,也需要阻止默认事件时,就可以连着写修饰符,会按照顺序执行修饰符的功能

 

键盘事件

  • 键盘上对应的每个按键的编码,使用e.keyCode获取对应按键的编码

  • 例如——<button @keyup.enter="add"></button>当点击键盘上的回车键时会触发对应的函数,如果单独使用@keyup或者@keydown则点击键盘上的任何一个按键都会触发对应的函数

在Vue上,给出了常用的几个按键的别名,以下:

  • 回车——enter

  • 删除——delete

  • 退出——esc

  • 空格——space

  • 换行——tab(特殊,必须配合keydowe使用)

  • 上——up

  • 下——down

  • 左——left

  • 右——right

Vue未提供的别名的按键,可以使用按键的原始key值(注意,是key值——会直接获取到键盘上按键的名称,区别于keyCode获取按键的编码,有时按键上的名称不是单个单词,而是以驼峰命名组成的多个单词组成,这时就不能使用)去绑定,当注意要转为kebab-case(短横线命名)


系统修饰键(用法特殊):ctrl,alt,shift,meta(就是win键)——这四个按键配合keyup使用都会有问题的

配合keyup(键盘事件)使用:按下修饰的同时,再按下其他键,随后释放其他键,事件才会触发

配合keydown使用,正常触发


  • 也可以使用keyCode去指定具体的按键(目前不推荐)——mdn上明确标识已经弃用该方式,所以现在最好的方式时使用对应按键的名称去绑定按键执行操作

  • Vue.config.keyCodes.自定义键名=键码,可以去定制按键别名(也不太推荐该方法)


需要注意的是,如果需要使用组合键,例如需要使用按下ctrl和y键时才会触发事件时,可以连着写

计算属性与监视

计算属性-computed

计算属性(computed)也属于一个新的配置项,和data属于同级别的Vue属性

 

只要data中的数据发生变化Vue就会重新解析模板

 

注意点

  • 在计算属性里时,Vue已经帮我们做了数据缓存,所以在初始读取fullName时getter被调用,以后再被读取时就不用调用getter了。

  • 计算属性所依赖的值发生该变的时候getter也会被调用,比如以上的data里的数据发生改变了,导致了fullName的数据发生了改变了,那getter也就会被调用

所以在设计getter时,getter拥有两个特征(以上)

同样的,getter不能写成箭头函数的模样,否则this的指向就变成了window

注意

使用计算属性computed时,切记不要把computed里面的对象当做对象那样的方式来使用,例如使用fullName对象里面的方法——funName.get(),在计算属性里面这样的方式不被允许的,应当把对象当做变量来使用,就像案例里面那样的使用插值表达式{{fullName}}

  • 计算属性:

    • 定义:要用的属性不存在,要通过已有的属性计算得来

    • 原理:底层借助Object.definepeoperty方法提供的getter和setter

    • get函数什么时候执行?

      • 初次去读时会执行一次

      • 当依赖的数据发生变化时会被再次调用

    • 优势:与methods实现相比,内存有缓存机制(复用),效率更好,调用方便

    • 备注:

      • 计算属性最终会出现在vm上,直接读取即可

      • 如皋计算属性要被修改,那必须写在set函数去响应修改,且set中药引起计算时依赖的数据发生改变

计算属性的简写

  • 只有考虑读取不考虑修改的时候才能使用简写的方式

监视属性

  • 使用watch作为Vue的监视属性

还有另一种监视属性的写法,如下

监视属性watch:

  • 当被监视的属性变化时,回调函数自动调用,进行相关操作

  • 监事的属性必须存在,才能进行监视

  • immediate——初始化时让handler调用一下

  • 监视的两种写法

    • new Vue时传入watch配置

    • 通过vm.$watch监视

深度监视

深度监视:

  • Vue中的watch默认不监视对象内部值得改变(一层)

  • 配置deep:true可以检测内部值得变化(多层)

备注:

  • Vue自身可以监视对象内部的值得改变,但Vue提供的watch默认不可以

  • 使用watch时根据数据的饿具体结构,决定是否采用深度监视

监视的简写

  • 简写形式的前提是不需要deep和immediate配置项,也就是说,当你的监视属性里面只有handler时就可以开启简写

另一种写法:

绑定样式

  • 绑定class样式

绑定class样式适用于样式的类名不确定,需要动态指定

还可以这样写

  • 绑定style样式

  • 使用这样的写法,必须使用属性绑定style,且style里面的值是一个对象

 

生命周期

生命周期

  • 又名:生命周期的回调函数,生命周期函数,生命周期钩子

  • 是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数

  • 生命周期函数的名字是不可更改的,但函数的具体内容是程序员根据需求编写的

  • 生命周期函数中的this指向vm或组件实例对象

  • mounted——是一个函数,与methods和data属于同一级别

  • Vue完成模板的解析并把初始的真实的DOM元素放入页面后(挂载完毕)调用mounted

Vue组件化编程

Vue组件

Screenshot_20230406_122055_tv.danmaku.bili

组件的定义:实现应用中局部功能代码资源的集合

 

非单文件组件

一个文件中包含有多个组件

vue组件的三大步骤

  • 定义组件(创建组件)

  • 注册组件

  • 使用组件

如何定义组件

使用 Vue.extend({})创建,使用时注意,el配置项是不能写在里面的,data配置项要写成函数的形式,且数据写在return对象里面,组件被复用时数据存在引用关系,template配置定义组件的结构

如何注册组件(局部注册)

靠new Vue的时候传入components配置项

如何注册组件(全局注册)

使用Vue.component(a,b) a标识组件的变量名,b为定义好的组件名

 

案例:

image-20230406133910421

 

组件的注意点

  • 关于组件名:

  • 一个单词组成:

    • 第一种写法:首字母小写——school

    • 第二种写法:首字母大写——School

  • 多个单词组成

    • 第一种写法(kebab-case命名):my-school

    • 第二种写法(CamelCase命名):MySchool(需要Vue脚手架支持)

    组件名尽量回避HTML中已有元素的名称,可以使用name配置项指定组件在开发工具中呈现的名字

 

  • 关于组件标签

  • 第一种写法:<school></school>

  • 第二种写法:<school/>

不用使用脚手架时,<school/>会导致后续组件不能渲染

  • 一个简写方式:

const school=Vue.extend(options) 可简写为 const school = options

一个重要的内置关系

显示原型属性和隐式原型属性都指向原型对象

单文件组件

一个文件中只包含有一个文件——a.vue

如果要想让别人使用你的组件,必须使用暴露,Vue提供了三种暴露的方式:

  • 使用关键字export——分别暴露

  • 使用关键字export——统一暴露

  • 使用关键字export——默认暴露

一般来说,都是使用默认暴露,默认暴露往往是暴露一个,在调用的时候也比较简单

单文件组件的简写

App.vue

  • 汇总所有的组件,在该组件里注册其他所有的组件

main.js

  • 调用App.vue,是入口文件

index.html

  • 是整个项目的唯一一个html文件

完成上述的操作后并不能运行index.html文件,因为浏览器并不认识mian.js里的代码,做的这些是为了了解脚手架开发

脚手架的使用

  • cli——command line interface (命令行接口工具)

  • Vue脚手架时Vue官方提供的标准化开发工具

  • 最新的版本是4x

  • 文档:https://cli.vuejs.org/zh/

  • 创建vue项目——create xxx(项目名)

  • 选择vue版本

  • 切换到项目目录 ——cd xxx(项目名)

  • 运行项目——npm run serve

  • 停止项目,在终端使用ctrl+c快捷键

vue脚手架隐藏了所有的webpack相关的配置,若想查看具体的webpack配置项,请执行——vue inspect > output.js

一个名为one的Vue项目结构

image-20230731121716945

  • App.vue——所有vue组件都要在这里面进行注册和使用

  • components文件夹放置编写的组件

  • assets文件夹放置资源

  • 整个vue项目只有一个html文件即index.html文件

main.js里的render配置项

  • 如果项目中引入的vue是残缺版的vue,则使用render来解析

关于不同版本的vue

  • vue.js与vue.runtime.xxx.js的区别:

    • vue.js是完整版的Vue,包含:核心功能和模板解析器

    • vue.runtime.xxx.js是运行版的Vue,只包含:核心功能,没有模板解析器

  • 因为vue.runtime.xxx.js没有模板解析器,所以不能使用template配置项,需要使用render函数接收到createElement函数去指定具体内容

ref属性的使用

  • 在vue里是不推荐使用原生的JavaScript代码来进行dom操作的,若果需要要使用类似的dom操作,原生的JavaScript使用使用id或者class等来对元素进行绑定,在vue里使用ref属性进行标记,vue的vc会收集所有的ref标记的属性,要使用的时候可以直接使用

  • 同时ref属性可以使用在组件上,获取到的是组件的实例对象,如果使用的id给组件进行绑定,使用原生的JavaScript获取id会得到组件的html结构

ref属性被用来给元素或子组件注册引用信息(id的代替者)

应用在html标签上获取的真实的DOM元素,应用在组件上是组件的实例对象(vc)

props配置项

 

Leave a Reply

Your email address will not be published. Required fields are marked *

Other My Posts