web前端——Vue

杂项知识点

  1. vue的实例属性和实例方法用$修饰。如vm.$watch(对象){}。$set
  2. 过滤器 又称管道符 : | ←就是这个竖线! 叫管道符

    将一串左侧数据拿去处理,处理完之后继续拿来用,且不会影响原来的数据,也不会改变。

  3. v-model绑定的值不能是props传过来的值,因为props是不可以修改的!

Vue基础

1、初始vue:

  • 想让vue工作,就要创建一个vue实例,且要传入一个配置对象。
  • root容器中的代码依然符合html规范,只不过混进了一些特殊的vue语法。
  • root容器中的代码被称为【vue模板】
  • Vue实例和容器是一 一对应的。
  • 真实开发中只有一个Vue实例,并且会配合组件一起使用。
  • {{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性。
  • 一旦data中的数据发生改变,那么页面中的用到该数据的地方都会自动更新。

        区分js表达式和js代码:

                1、js表达式:一个表达式会生成一个值,可以放在任何一个需要值的地方。如:a,a+b,demo(1),x===y?'a':'b'。

                2、js代码(语句):if(){},for(){}

web前端——Vue_第1张图片

2、Vue特点

  • 采用组件化模式,提高代码复用率,且让代码更好地维护。
  • 声明式编码,让编码人员无需直接操作DOM,提高开发效率。
  • 使用虚拟DOM+优秀的Diff算法,尽量复用DOM节点。

3、模板语法

  • 插值语法

                功能:解析标签体内容。

                写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。

  • 指令语法

                功能:用于解析标签(标签属性,标签体内容,绑定事件)。

                举例:v-bind:href=“xxx” 课简写为  :href=“xxx”。可直接读取data中的所有属性

web前端——Vue_第2张图片

 4、数据绑定

  • 单向绑定:数据只能从data流向页面,而不能从页面改变data中数据。
  • 双向绑定:数据不仅能从data流流向页面,还可以从页面流向data。

        备注:1、双向绑定v-model=一般都应用在表单类元素中,(input、select等表单)

                   2、v-model:value=可以简写成v-model=,因为v-model默认收集的是value值。

web前端——Vue_第3张图片

 5、el和data

  • el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串

        el的两种写法:

                        1、new Vue时候紧接着配置el属性。

                        2、先创建new实例,随后再通过vm.$mount('#root')指定el的值。

  • data中用于存储数据,数据供el所指定的容器去使用。

        data的两种写法

                        1、对象式

                        2、函数式。使用组件式,必须采用函数式。

一个重要原则:由Vue管理的函数,不要使用箭头函数,若使用箭头函数,this就不再是Vue实例。

web前端——Vue_第4张图片

 6、MVVM模型

        M:模型。data中的数据。data中所有属性,最后都出现在vm身上。

        V:视图。模板代码。

        VM:视图模型(工具)。Vue实例。vm身上所有的属性及Vue原型上所有属性,在Vue模板中都可以直接使用。

web前端——Vue_第5张图片

7、数据代理

回顾Object.defineproperty方法:设置或增加属性

web前端——Vue_第6张图片

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

  • Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写)
  • Vue中数据代理的好处:更加方便地操作data中的数据。
  • 基本原理:        

        通过Object.defineProperty()把data对象中所有属性添加到vm实例上。

        为每一个添加到vm上的属性,都指定一个getter/setter。

        在getter/setter内部去操作(读/写)data中对应的属性。

8、事件处理

事件的基本使用

  • 使用v-on:xxx或@xxx绑定事件,其中xxx是事件名。
  • 事件的回调需要配置在methods对象中,最终会在vm实例上。
  • methods中配置的函数,不要用箭头函数。否则this就不是vm实例了。
  • methods中配置的函数,都是被Vue所管理的函数,this的指向是vm实例或组件实例对象。
  • @click=“demo”和@click=“demo($event)’”效果一致,但后者可以传参。

 事件修饰符

  • prevent:阻止默认事件。
  • stop:阻止事件冒泡(常用)
  • once:事件只触发一次(常用)
  • capture:使用事件的捕获模式
  • self:只有event.target是当前操作的元素时才触发元素。
  • passive:事件的默认行为立即执行,无需等待时间回调执行完毕

web前端——Vue_第7张图片

 键盘事件

  • Vue中常用的按键别名:

        回车:enter

        删除:delete(删除和退格键位)

        退出:esc

        空格:space

        换行/切换:tab(必须配合keydown使用)

        上up 下down 左left  右right

  • Vue未提供别名的按键,可以使用按键原始的key值去绑定,但要注意转为kebab-case(短横线命名)。
  • 系统修饰键:ctrl、alt、shift、meta

                1、配合keyup使用:按下修饰键的同时,再按下其他键,随后配合释放其他键,事件才被触发。

                2、配合keydown使用:正常触发事件。

  • 也可以使用keyCode去指定具体的按键(不推荐)
  • Vue.config.keyCodes 自定义键名=键码,可以去定制按键别名

web前端——Vue_第8张图片

9、计算属性(computed)

  • 定义:要用的属性不存在,要通过已有属性计算得来
  • 原理:底层借助了Object.defineproperty方法提供的getter和setter方法。
  • get函数什么时候执行:

                1、初次读取时会执行一次。

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

  • 优势:月methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
  • 备注:

                1、计算属性最终会出现在vm实例上,直接读取使用即可。

                2、如果计算属性要被修改,那必须的写set函数去响应修改,切set中要引起计算时依赖  的数据发生改变。

完整写法:

web前端——Vue_第9张图片

 简写:

web前端——Vue_第10张图片

10、监听属性(watch)

  • 监听属性watch:

        当被监听的属性发生变化时,回调函数自动调用

        监听的属性必须存在,才能进行监视。

        监听的的两种写法:1、new Vue时写入watch配置。2、通过vm.¥watch监听

web前端——Vue_第11张图片

  •  深度监听:

        vue中的watch默认不监听对象内部值的改变(只监听一层)

        配置的deep:true可以监听对象内部值变化(可以监听多层)

web前端——Vue_第12张图片

  • 面试题:computed和watch之间的区别:

        某种意义上讲,watch>computed,因为watch可以异步操作(例如使用定时器,当需要在数据变化时执行异步或开销较大的操作时, watch 方式是最有用的。其允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。)。

  • 重要原则:

        1、所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。

        2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。

11、绑定样式(CSS)

  • class样式

        写法::class="xxx"  xxx可以是字符串、对象、数组。

        (字符串写法适用于:类名不确定,要动态获取)

        (对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。)

        (数组写法适用于:要绑定多个样式,个数确定,名字也确定。)

  • style样式

        :style=“{fontSize:xxx}”其中xxx是动态值。

        :styel=“{a,b}” 其中a和b是样式对象。

web前端——Vue_第13张图片

12、条件渲染

  • v-if

        写法:v-if=“表达式”,v-else-if=“表达式”,v-else。表达式为true时,此元素执行

        适用于切换频率较低的场景,表达式为false的DOM元素直接移除

        写法的三者一起使用,中间不能被打断。

  • v-show

        写法:v-show=“表达式”

        适用于切换频率较高的场景。表达式为false的DOM元素未被移除,而是被隐藏

  • 使用v-if时,元素可能无法获取到,而v-show一定可以获取到。

web前端——Vue_第14张图片

13、列表渲染

  • v-for遍历指令:

        1、用于展示列表数据

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

        3、可遍历:数组、对象、字符串(很少)、指定次数(很少用)。

web前端——Vue_第15张图片

  • 面试题:vue中的key有什么作用(key的内部原理):

web前端——Vue_第16张图片web前端——Vue_第17张图片

  •  Vue监视数据的原理:

        1、Vue会监视data所有层次的数据。

        2、监测对象:通过setter实现监视,且要在new Vue时就要传入要监测的数据。

                

        3、 监测数组:通过包裹数组更新元素的方法实现      。  

                                (调用原生对应的方法对数组进行更新;重新解析模板,更新页面)

        4、数组变化原生方法:push(),pop(),shift(),unshift(),splice(),sort(),reverse()。Vue方法:Vue.set()或vm.$set()。

        5、特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象添加属性!!!

web前端——Vue_第18张图片

 14、收集表单数据

  • 若:,则v-model收集的是value值,用户输入的就是value值。
  • 若:type为radio,则v-model收集的是value值,该value值是人为配置好的。
  • 若:type为checkbox:

        当没有配置input的value属性时,收集的就是checked(勾选or未勾选,结果是布尔值

        当陪值了value值时:       

                v-model的初始值是非数组,那么收集的是checked(勾选or未勾选,结果是布尔值)

                v-model的初始值是数组,收集的是value组成的数组。

  • v-model的三个修饰符:

        1、lazy:失去焦点再收集数据。

        2、number:输入字符串转为有效的数字。

        3、trim:输入首尾空格过滤。

web前端——Vue_第19张图片

15、过滤器

  • 定义:对要现实的数据进行特定格式化后再显示(用于一些简单逻辑的处理)。
  • 语法:

        1、注册过滤器:Vue.filter(name,callback)或new Vue(filters:{})

        2、使用过滤器:{{xxx丨过滤器名}}。

  • 备注:

        1、过滤器也可以接受额外参数,多个过滤器可以串联。

        2、并没有改变原来的数据,而是产生新的相应数据。

web前端——Vue_第20张图片web前端——Vue_第21张图片

16、内置指令

回顾学过的指令:

web前端——Vue_第22张图片

  • v-text指令:

        1、作用:向其所在的节点中渲染文本内容。        

        2、与插值语法的区别:v-text会替换掉节点中的内容,只保留文本,插值语法{{}}不会

  • v-html指令:

        1、作用:向指定节点中渲染包含html结构的内容。

        2、与插值语法的区别:

                v-html会替换掉节点节点中的内容,插值语法{{}}不会。

                v-html可以识别html结构

        3、v-html有安全性问题。

                在网站动态渲染任意HTML是危险的,容易导致XSS攻击。

                一定要在可信的内容上使用v-html,永不要用在用户提交的内容上。

  • v-cloak指令(没有值):

        1、本质是一个特殊属性,Vue实例接管此节点后,会删掉v-cloak属性

        2、使用css配合v-cloak可以解决网速慢时网页展示出{{xxx}}问题。

  • v-once指令:

        1、v-once所在节点在初次渲染后,就视为静态内容了,不再改变。

        2、以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

  • v-pre指令:

        1、跳过其所在节点的编译过程。

        2、可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。

17、生命周期

生命周期内涵:

  • 又名:生命周期回调函数、生命周期函数、“钩子”、
  • 生命周期函数式Vue在关键时刻帮我们调用的一些特殊名称的函数。
  • 生命周期函数的名字不可更改,但函数的具体内容是程序猿根据需求编写的。
  • 生命周期函数中的this指向的是vm或组件实例对象

常见的生命周期函数(钩子):

  • mounted:可进行 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等初始化操作
  • beforeDestory:清楚定时器、解绑自定义事件、取消订阅消息等收尾工作

关于销毁Vue实例:

  • 销毁后借助Vue开发者工具看不到任何消息。
  • 销毁后自定义事件会失效,但原生DOM时间依然有效。
  • 一般不会在beforeDestory操作数据,因为即便操作数据,也不会再触发更新流程了。

web前端——Vue_第23张图片web前端——Vue_第24张图片

web前端——Vue_第25张图片

18、非单文件组件

Vue中使用组件的三大步骤:

        1、定义组件(创建组件)

        2、注册组件

        3、使用组件(写组件标签)

  •  一、如何定义一个组件?

        使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个option几乎一样,但也有区别。区别如下:

                el不要写:最终所有的组件都要经过一个vm的管理,由vm中的el决定服务       哪个容器。

                data必须写成函数:避免组件被复用时,数据存在引用关系。

                (使用template可以配置组件结构)

  • 二、如何注册组件

        局部注册:靠new Vue的时候传入components选项

        全局注册:通过Vue.component(“组件名”,组件)

  • 三、编写组件标签:web前端——Vue_第26张图片

Vue中使用组件的三大注意点:

  • 一、关于组件名:

        一个单词组成:

                第一种写法(首字母小写):school

                第二种写法(首字母大写):School

        多个单词组成:

                第一种写法(-连字符):my-school

                第二种写法(驼峰):MySchool(需要脚手架支持)

        备注:

                组件名尽可能回避HTML中已有的元素名称。

                可以使用name配置项指定组件在开发者工具中呈现的名字。

  • 关于组件标签

        第一种写法:

        第二种写法:

        不用使用脚手架时,会导致后续组件不能渲染。       

  • 一个简写方式:

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

关于VueComponent

web前端——Vue_第27张图片

 一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype。

脚手架

脚手架文件结构

    ├── node_modules 
    ├── public
    │   ├── favicon.ico: 页签图标
    │   └── index.html: 主页面
    ├── src
    │   ├── assets: 存放静态资源
    │   │   └── logo.png
    │   │── component: 存放组件
    │   │   └── HelloWorld.vue
    │   │── App.vue: 汇总所有组件
    │   │── main.js: 入口文件
    ├── .gitignore: git版本管制忽略的配置
    ├── babel.config.js: babel的配置文件
    ├── package.json: 应用包配置文件 
    ├── README.md: 应用描述文件
    ├── package-lock.json:包版本控制文件

关于不同版本的Vue

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

        1、Vue.js是完整版的Vue,包含:核心功能+模板解析器。

        2、Vue.runtime.xxx.js是运行版的VUe,只包含:核心功能;没有模板解析器。

  • 因为Vue.runtine.xxx.js没有模板解析器,所以不能使用template这个配置项,需要使用render函数接受到的createElement函数去指定具体内容。

Vue.config.js配置文件

  • 使用vue inspect>output.js可以查看到Vue脚手架的默认配置。
  • 使用Vue.config.js可以对脚手架进行个性化定制。

ref属性

  • 被用来给元素或子组件注册引用信息(id的替代者)。
  • 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)。
  • 使用方法:

        1、标签中:```

ref="xxx">.....

``` 或 ``````。

        2、获取:this.$refs.xxx

props配置项

  • 功能:让组件接受外部传来的数据。
  • 传递数据:
  • 接收数据:

        1、第一种方式(只接收):props:["name"]

        2、第二种方式(限制类型):props:{name:String}

        3、第三种方式(限制类型、限制必要性、指定默认值):                                                     web前端——Vue_第28张图片

 (props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求却是需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。)。

minin(混入)

  • 功能:可以把多个组件共用的配置提取到一个混入对象。
  • 使用方法:

        1、定义混入:web前端——Vue_第29张图片

        2、使用混入:

插件

  • 功能:用于增强Vue。
  • 本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。
  • 定义插件

        对象.install=function(vue,options){

                添加全局过滤器

                Vue.filter(...)

                添加全局指令

                Vue.directive(...)

                配置全局混入

                Vue.mixin(...)

                添加实例方法

                Vue.prototype.$myMethod=function(){...}

                Vue.protoytpe.$myProperty=xxxx

        } 

  • 使用插件:Vue.ues()

scoped样式

  • 作用:让样式在局部生效,防止冲突。
  • 写法: