目录
1. Object.defineProperty()
2.计算属性
3.监视属性
4.computed和watch的区别
5.双向数据绑定
6._el和data的俩种写法
7.事件修饰符
8.键盘事件
9.条件渲染
10.列表过滤
11.过滤器
12.常用指令
13.生命周期
14.组件
15.ref属性
16.props配置
17.mixin属性
18.vue中的插件
19.WebStorage
20.消息的发布与订阅
20.Vue动画库
21.插槽
(1)给一个对象添加一个属性
Object.defineProperty()传三个参数:
借助Object.defineProperty()
,使number和person俩个值进行了关联
通过get()获取age
,通过set
去修改age
(2)数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)
1.定义:要通过已有属性计算得来
2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter
3.get函数什么时候执行?
(1)初次读取fullName值时
(2)所依赖的数据发生改变时
4.优势:与methods实现相比,内部有缓存机制,效率更高,调试方便
5.备注:
(1)计算属性最终会出现在vm上,直接调用即可
(2)如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生变化
1.当被监视的属性发生变化事,回调函数自动调用,进行相关操作
2.监视的属性必须存在,才能进行监视
3.监视的俩种写法:
(1)new Vue时传入watch配置
(2)通过vm.$watch监视
var vm = new Vue({
watch:{
isHot:{
immediate:true, //初始化时handler调用一下
handler(newValue,oldValue){
console.log("监视了",newValue,newValue)
}
}
}
})
// 简写形式
isHot(newValue,oldValue){
console.log("监视了",newValue,newValue)
},
vm.$watch('isHot',{
immediate:true,
handler(newValue,oldValue){
console.log("监视了",newValue,newValue)
}
})
// 简写形式
vm.$watch('isHot',function(newValue,oldValue){
console.log("监视了",newValue,newValue)
})
4.深度监视
深度监视:
(1)Vue中的watch没人不监视对象内部值的改变(一层)
(2)配置deeep:true可以监测对象内部值的改变(多层)
备注:
(1)Vue自身可以监视对象内部值的改变,但Vue提供的watch默认不可以
(2)使用watch时根据数据的具体结构,决定是否采用深度监视
data(){
return{
numbers:{
a:'11',
b:'22'
}
}
},
watch:{
numbers:{
deep:true,
handler(newValue,oldValue){
console.log("深度监视")
}
}
}
1.computed能完成的功能,watch都可以完成
2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作
3.computed中的函数所依赖的属性没有变化时,调用时会从缓存中读取,而watch在每次监听的值发生变化的时候都会执行回调
4.computed必须要有return返回,而watch不用必须用return
5.computed默认第一次加载的时候就开始监听;watch默认第一次加载不做监听,如果需要第一次加载做监听,添加immediate属性
6.使用场景:computed----当一个属性受多个属性影响的时候,使用computed-----购物车商品结算。watch–当一条数据影响多条数据的时候,使用watch-----搜索框.
原则:
1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象
2.不被vue管理的函数(定时器的回调函数、ajax的回调函数、promise的回调函数),最好写成箭头函数,这样this的指向才是vm或组件实例对象
v-model:只能用于表单元素
data中的数据一发生改变,vue就会重新解析模板
(1)插值方式
全名:{{firstName}} - {{lastName}}
(2)计算属性方式
全名:{{fullName}}
(3)methods方式
全名:{{fullName()}}
计算属性与methods实现相比,内部有缓存机制,效率更高,调试方便
(1)_el的俩种写法
const v = new Vue({
el:"#app", //第一种写法
data:{
num:''
}
})
v.$mount('#app') //第二种写法
(2)data的俩种写法
new Vue({
el:"#app",
//第一种写法,对象式
data:{
num:''
}
})
new Vue({
el:"#app",
//第二种写法,函数式(使用组件时必须使用函数式写法,否则会报错)
data(){
console.log(this) //vue的实例对象
return{
num:''
}
})
1.prevent :阻止默认行为(常用)
2.stop:阻止事件冒泡(常用)
3.once:事件只触发一次(常用)
4.capture:使用事件的捕获模式
5.self:只有event.target是当前操作的元素才触发事件
6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕(在移动端项目比较多)
//阻止事件冒泡
//先阻止事件冒泡再阻止默认事件
1.Vue常用的按键别名
回车 = 》enter
删除= 》delete (捕获“删除)和”退格“键
退出= 》esc
换行= 》tab
空格= 》space
上= 》up
下= 》down
左 = 》 left
右 = 》right
2.系统修饰键(用法特殊):ctrl 、alt 、shift、meta
(1)配合keyup使用:按下修饰符的同时,再按下其他键,随后释放其他键,事件才被触发
(2)配合keydown使用:正常使用
3.Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名
1.v-if
写法(1)v-if = "表达式"
(2)v-else-if = "表达式"
(3)v-else="表达式"
适用于:切换不频繁的场景
特点:不展示DOM元素,直接移除
注意:v-if可以和v-else-if、v-else一起使用,但要求结构不能被打乱
2.v-show
写法:v-show = "表达式"
适用于:切换频繁的场景
特点:只是利用dispaly样式,把DOM隐藏
3.备注
(1) 使用v-if时,元素可能无法获取到,而使用v-show一定可以获取到,
(2) v-show 在template元素中不起作用
v-show条件渲染
v-if条件渲染
111111111
222222222
333333333
(2)监视属性实现过滤
- {{item.name}}
(3)列表排序
- {{item.name}} {{item.age}}
定义:对要显示的数据进行特定格式化后再显示
语法:
1.注册过滤器:Vue.filter(name,callback) 或 new Vue(filters:{})
2.使用过滤器:{{xxx | 过滤器}} 或 v-bind:属性 = "xxx | 过滤器名"
备注:
1.过滤器可以接受额外参数、多个过滤器也可以串联
2.并没有改变原本数据,是产生新的对应的数据
body>
现在是:{{fmtTime}}
现在是:{{getFmtTime()}}
现在是:{{time | timeFormater}}
现在是:{{time | timeFormater('YYYY年MM日DD日')}}
现在是:{{time | timeFormater('YYYY年MM日DD日') | mySlice}}
(1)v-once指令
只会执行一次渲染,当数据发生改变时,不会再变化
(2)v-show指令
接受一个表达式或一个布尔值。相当于给元素添加一个display
属性
(3)v-if指令v-else指令、v-else-if指令
v-if和v-show有同样的效果,v-if
是重新渲染,v-show
使用display
属性来控制显示隐藏。
频繁切换的话使用v-show
减少渲染带来的开销。
v-else指令、v-else-if指令与v-if指令配合使用
(4)v-for指令
v-for可用来遍历数组、对象、字符串。
(5)v-html指令、v-text指令
v-text
是渲染字符串,会覆盖原先的字符串
v-html
是渲染为html。
{{}}
双大括号和v-text
都是输出为文本
(6)v-bind指令
v-bind指令主要用法是动态更新HTML元素上的属性,链接的href属性被动态的设置了,当数据变化的时候,就会重新渲染。
简写形式::<属性>="<变量>"
(7)v-on指令
v-on
用于事件绑定
语法: v-on:<事件类型>="<函数名>"
简写:@<事件类型>="<函数名>"
(8)v-model指令
数据双向绑定指令,限制在 、
、components中使用
生命周期图示
{{n}}
1.非单文件组件(很少用,了解即可)
定义组件名:
(1)第一种写法(kebab-case命名):my-school
(2)第二种写写法(CamelCase):MySchool(需要脚手架支持)
备注:可以使用name配置指定组件在开发者工具中的名字
2.关于VueComponent
(1)非单文件组件本质是一个名为VueComponent的构造函数,是Vue.extend生成的
(2)在使用组件时,Vue解析时会帮我们创建组件的实例对象,即Vue帮我们执行的:new VueComponent(options)
(3)特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent
(4)关于this的指向:
组件配置中:data函数,methods中的函数、watch中的函数、computed中的函数,this均是【VueComponent实例对象】
new Vue()配置中:data函数,methods中的函数、watch中的函数、computed中的函数,this均是(Vue实例对象)
3.Vue和VueComponet的内置关系
让组件实例对象可以访问Vue原型上的属性、方法
VueComponent.prototype.__proto__ === Vue.prototype
1.被用来给html元素和子组件注册引用信息的(id属性的替代者)
2.应用在html元素时,获取的是dom元素对象,如果应用在组件标签上,那么获取的是组件实例对象
3.使用方式:
打标志:
或
获取:this.$refs.xxx
功能:让组件接收外部传过来的数据
(1)传递数据:
(2)接收数据:
第一种接收方式(只接收):
props:['name']
第二种方式(限制类型):
props:{
name:String
}
第三种方式(限制类型、限制必要性。指定默认值)
props:{
name:{
type:String, //类型
required:true, //必要性
default:‘jsom’ //默认值
}
}
备注:props是是只读的,Vue底层会检测你对props的修改,如果进行了修改,会发出警告,要是需要修改,那么先复制props的内容到data中,然后再修改data中的数据
功能:可以把多个组件共用的配置提取成一个混入对象
使用方式:新建一个mixin.js文件,定义混合
export const mixin={
methods:{
showName(){
alert(this.name)
}
}
然后在组件中应用:
全局混入:Vue.mixin(mixin)(注意需要先导入mixin.js文件)。
局部混入:mixin:[mixin] (注意需要先导入mixin.js文件)。
注意:当新加入的mixin.js文件中的属性和组件中的属性冲突时,如data属性、methods属性等,是以组件中的属性为准的,但当生命周期钩子出现冲突时,是都应用的,且mixin.js文件中的钩子先使用。
插件通常会为Vue添加全局功能,用于增强Vue
本质:包含install方法的一个对象,install的第一个参数是Vue,第二个参数是插件使用者传递过来的参数
定义插件,一般有一下几种
添加全局方法或者属性
添加全局资源:指令/过滤器/过渡等
通过全局 mixin方法添加一些组件选项
添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。
使用插件:Vue.use()
1.存储内容大小一般为5MB(不同浏览器不一样)
2.浏览器通过Window.localStorage和Window.sessionStorage属性实现本地存储机制
3.相关API
(1)xxx.Storage.setItem('key','value');该方法接受一个键和值作为参数,把键值对添加到存储中,如果键名存在,则更新其对应的值
(2)xxx.Storage.getItem('key','value');该方法接受一个键名参数,返回键名对应的值
(3)xxx.Storage.removeItem('key','value');该方法接受一个键名参数,并把该键名从存储中删除
(4)xxx.Storage.clear('key','value');该方法会清空存储中所有数据
4.备注:
(1)sessionStorage存储的内容会随着浏览器窗口关闭而消失
(2)localStorage存储的内容,需要手动清除才会消失
(3)xxx.Storage.getItem(xxx)如果xxx对应的value获取不到,那么getItem的返回值是null
(4)JSON.parse(null)的结果依然是null
1.一种组件间通信的方式,适用于任意组件间通信
2.使用步骤:
(1)安装pubsub:npm i pubsub-js
(2)引入:import pubsub from 'pubsub-js'
3.接收数据:
mounted(){
this.pubId = pubsub.subscribe('hello',(msgName,data)=>{
console.log('有人发布了hello消息,hello消息的回调执行了',msgName,data)
})
},
4.提供数据:
methods:{
sendStudentName(){
pubsub.publish('hello',数据)
}
}
5.最好在beforeDestroy钩子中取消订阅
mounted(){
this.pubId = pubsub.subscribe('hello',(msgName,data)=>{
console.log('有人发布了hello消息,hello消息的回调执行了',msgName,data)
})
},
beforeDestroy(){
pubsub.unsubscribe(this.pubId)
}
1.安装
npm install animate.css --save
yarn add animate.css
2.引入
import 'animate.css';
3.使用
你好啊!
1.作用:让父组件可以向子组件指定位置插入html结构,也是组件间通信的方式,适用于父组件===>子组件
2.分类:默认插槽、具名插槽、作用域插槽
3.使用方式
(1)默认插槽
父组件
html结构
子组件
默认内容
(2)具名插槽
父组件
html结构1
html结构1
子组件
我是一些默认值,当使用者没有传递具体结构时出现
我是一些默认值,当使用者没有传递具体结构时出现
3.作用域插槽
1.理解:数据在组件的自身,但根据生成的结构需要组件的使用者来决定
3.具体编码
Categroy组件
{{title}}分类
我是一些默认值
App.vue
- {{item}}
- {{item}}