computed 和 watch
computed 和 watch 的区别
- computed有缓存,若data不改变是不会重新计算。watch
- watch的深度监听
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17computed: {
fullname () {
return this.firstname + ' ' +this.secondname
},
computedObj1 () {
console.log('computedObj1 is change!')
return this.obj
},
compuptedObj2:{
get() {
return this.num * 2
},
set(value) {
this.num = value / 2
}
},
},
1 | watch: { |
style 和 class
v-if 和 v-show 的区别
v-for
可以遍历数组和对象
为什么要使用key?
v-for
和v-if
为什么不能一起使用?v-for
的优先级比v-if
高,所以列表item
很多的时候,会先将所有列表item
渲染出来,然后再一个个的v-if
判断。对性能影响会较差。
event的使用,$event
在vue
中,的$event
是原生的,事件被挂载到当前元素上面了。
事件修饰符:
在vue
中的事件是有修饰符的,我最常用的是@click.stop,可以阻止事件冒泡。
事件修饰符也可以串联写。
按键修饰符:
v-model
包括 表单的v-model
和 自定义v-model
1. 表单的v-model
1 | <input type = "text" v-model="name"/> |
是下面写法的语法糖,相当于:
1 | <input type = "text" @input="name = $event.target.value" :value="name"> |
2. 自定义组件v-model
vue2
和vue3
写法略微不同
父子组件通信 props $emit
父传子
父组件
1 | <TableChoise @deleteItem="deleteItemEvent" :list="Lists"/> |
js部分
1 | deleteItemEvent(item){ |
子组件
1 | <div @click="deleteItemSon($event,list)"></div> |
js部分
1 | props: { |
子传父
1 | methods: { |
组件间的通信 自定义事件
1. eventBus
2. 自定义事件
event.\$on('自定义事件名',触发的事件)
定义自定义事件event.\$off('自定义事件名')
卸载自定义事件event.\$emit('自定义事件名',参数)
触发自定义事件
3. 依赖注入 provider/inject
(1)写法
根组件中:
1 | // 依赖注入 |
任意子孙组件中:
1 | inject: ['message'], |
依赖注入默认不是相应式的。
vue2.0如何实现响应式的依赖注入?
两种方法,一种可以将根组件的this当做依赖传入,然后用this调用响应式变量。
另一种可以将依赖当做函数传入
父组件
1 | provide () { |
任一子孙组件
1 | inject: ['parents','parentName'], |
子孙组件vue模板
1 | <input type = "text" value = "" v-model = "parents.message"/> |
组件生命周期
created mounted有什么区别?
created是创建了变量,js中存在了template,但还没有开始渲染
mounted是网页已经绘制完成了,已经渲染了
父子组件的生命周期钩子调用顺序?
自定义v-model
首先,要知道input 和 change两个事件的区别,input是在文本框的值改变时立即触发,而change是在文本框失去焦点时触发。
vue2.2+版本后,新增加了一个model选项,model选项允许自定义prop和event。官方原文是这样的:允许一个自定义组件在使用 v-model 时定制 prop 和 event。默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。
vue2和vue3写法不同。
$nextTick
因为vue是异步框
架,在data改变后,dom不一定会立即渲染。
如果此时想去获取dom中的数据,可能会获取不到。
但如何知道开始渲染了?就在nextTick中获取
1 | this.$nextTick(function() { |
动态/异步组件
动态组件:
有时候不知道要加载什么组件,可以动态加载
1 | <component :is="data中定义的变量,可以根据具体情况修改"> |
异步组件:
很常用。
内网开发的对内部人员用的网站,像echarts这种很大的组件,会严重影响性能。因为是vue是单文件实现多页切换,首页可能用不到图表也去加载的话,就会影响性能,此时就可以去异步加载。
1 | import { defineAsyncComponent } from 'vue' |
1 | <xxx> |
slot
作用域插槽
具名插槽
keep-alive
1 | <!-- aaacomponent可以被缓存,bbbcomponent不能被缓存,exclude优先级高于include,exclude和include内部可以写正则去控制 --> |
mixin
多个组件有相同的逻辑,可以放入mixin中。
组件中:
1 | import myMixin from './mixin' |
在mixin.js中
1 | export default { |
缺点:
- 变量来源不明确,引的多了不知道从哪儿来的
- 多个
mixin
引入,如果是不同人开发的话,很有可能里面有变量名冲突。 mixin
有可能出现多对多的关系,就是多个组件引入了一个mixin
,一个组件还可以引入多个mixin,代码一旦复杂度提升,就会开始头疼了。。。
vue3和vue2的区别
v-model
1 | <template> |
1 |
|