-
计算属性和侦听器&methods
-
computed
- 定义:要使用的属性不存在需要听过已有的属性计算得来
- 原理:借助Object。defineProperty()方法提供的getter和setter
- 计算属性最终会出现在vm上,直接读取就可以进行调用
- 默认存在getter方法(不是说内部有这个函数,而是你如果只写一个函数就当作是getter),当计算属性要被修改,必须写setter函数去响应的修改,并且setter中要引起计算时依赖的数据发生变化
- get函数在初次读取的时候会执行一次,当依赖的数据发生变化的时候会再次被调用
- 注意
-
lop
- 默认不检测对象内部值的改变(只是一层,有属性可以设置为深层次的)
-
两种写法
- 创建vue实例时传入 watch:{}配置
- 通过实例对象vm ,vm.$watch()监视
- methods
-
三者区别
-
computed VS methods
- computed具有内部缓存机制(复用),效率更高,调试更方便
-
computed VS watch
- computed可以完成的功能,watch都可以完成
- 但是watch能完成的功能, computed不一定能实现,eg:watch可以进行异步操作
-
重要小点
- 所有被vue管理的函数,最好写成普通函数,这样保证this指向vm或实例对象
- 所有不被vue管理的函数(定时器的回调函数、ajax的回调函数、promise的回调函数)这些最好写成箭头函数,这样this指向的是window
-
基础知识
-
模版语法
-
插值语法:{{}xxx}
- 用于解析标签内容的(eg:<h1>{{xxx}}</h1>)
-
指令语法:v-xxx
- 用于解析标签的(eg:<a v-bind:href="xxx"></a>)
-
v-xxx:指令(核心)
-
v-bind
-
单向数据流通:data=>页面
- 可以动态绑定属性 eg::href=“xxx”
- class和style样式动态设置 :class='"xxx"
- 绑定数据 :value="xxx"
- xxx可以是对象、数组、变量
-
v-model
-
双向数据流通:data<=>页面 v-model:value=“xxx”可以简写为v-model=“xxx”
- 只可应用在输入元素中,input、textarea、chechked、radio、select
-
值绑定
- 对于单选按钮,复选框及选择框的选项,v-model 绑定的值通常是静态字符串 (对于复选框也可以是布尔值)
-
v-on
-
可以使用v-on:xxx或者@xxx绑定事件 ,xxx是事件名,事件的回调在methods中写(不要使用箭头函数,否则你的this会指向window,就不是vm了),最终会配置在vm对象上。
- eg: v-on:click="demo($event)"使用$event可以进行传参,$event是一个占位符
-
v-pre
- 跳过v-pre所在节点的编译过程,可以跳过没有使用指令语法,没有使用插值语法的节点,会加快编译
-
v-once
- 所在节点在初次动态渲染后,就视为静态内容,以后数据的变化,不会影响到v-once所在结构的更新,可以用于优化性能
-
v-cloak
- 使用css配合v-clock可以解决网速慢时页面展示出{{xxx}}问题
-
自定义指令
- 全局指令:Vue.directives(指令名,回调函数/配置对象)
- 局部指令:在Vue的构造函数中进行书写,directives:{指令名:回调函数/配置对象}
-
3个常用回调函数
- .bind :指令与元素成功绑定时调用
- .inserted 指令所在元素被插入页面时调用
- .update 指令所在模版结构被重新解析时调用
-
事件修饰符
- 事件修饰符(为v-on提供的)
- 按键修饰符
- 系统修饰符
- 鼠标按键修饰符
- 使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击
-
核心
-
数据代理
- 通过vm对象($或_开头 )来代理data对象中的属性的操作,原理是使用Object.definePropery
- Object.definePropery(<要代理的对象>,<要添加的key>,<一些配置>)Object.definePropery是给对象添加属性的,并且默认情况下添加的属性不可以枚举
-
v-for中的key
-
vue引入虚拟dom的理念,遍历时会进行新旧值比较,没有发生变化的就不对其进行操作,这样减少频繁操作dom,避免消耗时间
- 所以在设置key值的时候尽量不要设置为index值,index会随着对象或数组个数改变而改变,尽量设置为一个唯一的值
- 生命周期
-
vue数据监视
-
会监视data中所有层次的数据
-
如何检测对象中的数据
-
通过setter实现数据的监视,并且在new Vue()时就传入要监视的数据
- 对象创建后追加的属性,vue默认不做响应式处理
- 如需给后添加的属性做响应式,可以使用Vue.set(target,propertyName/index,value)或者vm.$set(target,propertyName/index,value)
-
如何检测数组中的数据
-
通过包裹数组更新元素的方法实现,本质就是完成以下两件事情:1.调用原生对应的方法对数组进行更新 2.重新解析模版,进而更新页面
- 不可以通过this.arr[0]="xxx",对数组进行更改,不会是响应式的
- 实在想改:1.可以使用Vue.set()或者vm.$set()方法,2.使用push(),pop() ,shift(), unshift(), splice(), sort(), reverse()
- 可以通过this.arr[0].name="xxx",对数组中的属性进行操作,仍然还是响应式
- 注意事项:Vue.set() 和vm.$set(),不能给vm或者vm的根数据添加属性
-
生命周期(本质是一个函数)
-
挂载流程
-
beforeCreate
- 此时无法通过vm访问到data中的数据、methods方法
-
created
- 可以通过vm访问到data中数据,methods中的方法
-
beforeMount
- 页面呈现的是未经vue编译的dom结构,所有对Dom的操作,最终都不会奏效
-
mounted
- 页面中呈现的是经过vue编译的dom,对dom的操作均有效。到这初始化阶段结束
- 一般在此阶段进行:开启定时器、ajax请求、发送网络请求、订阅消息,绑定自定义事件等初始化操作
-
更新流程(数据发生更改时)
-
before Update
- 数据是新的,但是页面是旧的,页面尚未和数据保持同步
-
updated
- 数据是新的,页面也是新的,页面和数据保持同步
-
销毁流程
-
beforeDestroy
- 此时vm中所有的data,methods,指令等等,都处于可用的状态,马上要执行销毁过程
- 一般在此阶段:关闭定时器,取消订阅消息,解绑自定义事件等收尾操作
- 一般不会在此阶段对数据进行操作,因为即使操作了,也不会触发更新流程
- destroyed
-
组件化编程
- 单文件组件
-
非单文件组件
-
基本使用
- 定义组件:Vue.extend(options ). options和new Vue(options)时传入的options是一样的
-
注册组件
- 局部注册
- new Vue()的时候传入components选项
- 全局注册
- Vue.component("组件名",组件)
-
VueComponent
- 通过Vue.extend生成的组件,本质上是一个VueComponent的构造函数,每次调用Vue.extend,返回的都是一个新的VueCommponent,不同组件是不同的对象
-
this指向
- 定义的组件中的data,methods,watch,computed中函数的this是VueComponent实例对象
- new Vue()中的this是vue实例对象
-
内置关系
- VueComponent.prototype.__proto===Vue.prototype
-
ref&props&mixin
-
ref
- 给元素或子组件打标识,应用在html标签上获取的是真实的dom,应用在组件的标签上获取的是组件实例对象vc
- 打标识:<h1 ref="xxx"></h1>
- 获取标识:this.$ref.xxx
-
props
-
父组件给子组件传递数据
- 传递数据:通过v-bind进行传递数据<Demo :name='xxxx'. :age="xxxx">
- 接收数据:1.只接收props:['name','age'] 2.限制类型props:{name:String,age:Number} 3.限制类型,限制必要性,指定默认值
- props是只读的
-
mixins混入
- 可以把多个组件共用的配置提取成一个混入对象
-
注册混入
- const mixins={xxxx}
-
使用混入
- 全局混入:Vue.minix(xxx) 局部混入:mixins:['xxx']
- 组件和混入对象包含同名选项,会进行合并,发生冲突的时候以组件优先
-
WebStorage
- localStorage
- sessionStorage
- 区别
-
相关api
- .setItem('key' , 'value')
- .getItem('key')
- .removeItem('key')
- .clear()
- (键值对均是string类型)可以使用JSON.Stringify(xxx) =>将xxx对象变为字符串 的形式 返回的数据是字符串格式,可以通过JSON.parse(xxx)进行解析