erp-dome/doc/面试学习笔记1

239 lines
5.7 KiB
Plaintext
Raw Normal View History

2024-08-23 19:07:11 +08:00
lession 1、插值表达式、指令、动态属性、v-html
{{name}}
<p :id="did"></p>
<div v-html="html">
<p>我是哈默</p>
</div>
v-html 会造成xss攻击
lession 2、计算属性
会做数据缓存
double2:{
get(){
return this.number*2 //原值改变,计算属性改变
},
set(value){
this.number=value/2 //计算属性改变,原值还原
}
}
lession 3、watch监听器-用来监听数值的变化
data(){
return{
name:'哈默',
info:{
hobby:'篮球'
}
}
}
watch:{
//字符串监听
name(newVal,oldVal){
console.log('name',newVal,oldVal);
},
//对象数据的监听
info:{
handler:function(newVal,oldVal){
console.log('info',newVal,oldVal)
},
deep:true //深度监听开关
}
}
lession 4、动态绑定 Class 和 Style
对象方式动态绑定样式
<li class="item" :class="{'active':isActive}">项目1</li>
数组方式绑定样式
<li class="item" :class="['active']">项目1</li>
行内样式动态绑定
<li class="item" :style="styleData">项目1</li>
data(){
return {
isActive:true,
styleData:{
background:'#efefef',
color:'#ffffff'
}
}
}
lession 5、v-if 和v-show 的区别
<p v-if="data==='a'"> a(v-if) </p>
<p v-show="data==='b'"> b(v-show) </p>
v-if 是直接决定页面元素是否存在
v-show是在样式级别控制元素是显示还是因此
lession 6、v-for 列表循环
数组遍历:
<li v-for="(item,index) in array" :key="item.id"></li>
对象遍历:
<li v-for="(value,key,index) in object" :key="key"></li>
object:{
name:'桃谷六仙'
hobby:'篮球'
}
v-if 和 v-for 联合使用
v-for 优先级比较高可以在v-for 的父元素写v-if判断
lession 7、事件
@click="logout(3,$event)"
logout(id,e){
alert(id)
console.log('e',e)
}
lession 8、父子组件通信方法prop $emit
通信方式总结:
父组件数据传递给子组件步骤:
1.父组件定义传递给儿子的数据
2.子组件用prop定义传递过来的数据的类型和变量的名称
3.父组件调用子组件,并进行属性值和变量名绑定
4.子组件调用父组件传递过来的数据
子组件给父组件传递数据的步骤:
1.子组件定义传递给父组件的数据对象和事件
2.父组件调用子组件,并且在调用标签绑定子组件传递过来的事件名称
3.在父组件的事件处理函数中接受子组件传递的数据对象
lession 9、兄弟组件通信方式
定义一个vue 实例
然后在兄弟组件中组件挂载的时候使用
eventBus.$on('addItem',this.handleAddTitle);
handleAddTitle(title){
console.log('title',title)
}
this.$emit('add',this.title)
eventBus.$emit('addItem',this.title)
lession 10、父子组件传值的5种方式
一、props+$emit()
二、回调函数方式(callback)
三、$parent+$children this.$children[0].data this.$parent.data
四、provide+inject 父组件 provide 子组件 inject
五、$attrs+$listeners 父、子、孙 三代组件 在子组件中用 v-bind="$attrs" 给孙组件 代传递父组件中的数据,在孙组件中之间用 {{$attrs.属性名}} 的方式使用 父组件中的数据
六、使用 ref 属性的方式 父组件 ref="childComp" this.$refs.childComp.属性名
lession 11、父子组件生命周期执行顺序问题
new vue() 生命周期
beforeCreate()
created()
beforeMount()
mounted()
beforeUpdate()
updated()
beforeDestory()
destroyed()
简化
created()
mounted()
updated()
destroyed()
存在父子组件的生命周期
parent:App created
child:List created
child:List mounted
parent:App mounted
结论:页面创建的时候 先父后子 挂载组件的顺序先子后父
parent:App before update
child:List before update
child:List updated
parent:App updated
结论:组件更新顺序 先父后子 更新完成的顺序 先子后父
lession 12、
1.nextTick 会在异步渲染完成后执行
2.异步渲染是批量进行渲染的
this.$nextTick(()=>{
const ulElem=this.$refs.ulRef;
const length=ulElem.childNodes.length;
console.log('length',length)
})
lession 13、slot 插槽
lession 14、vue3 和 vue2 的区别
Diff算法是如何实现的
配置项api options api
配置项型代码风格
很分散,逻辑不内聚,解决了耦合,没有解决
组合式api composition API
解决了高内聚问题
import {ref} from 'vue'
const useCmpute=(count)=>{
const plus=()=>{
count++;
}
const minus=()=>{
count--
}
return {
plus,minus
}
}
setup(){
const cout=ref(0);
{plus,minus}=useCompute(count);
return {
count,plus,minus
}
}
总结:
1. vue2和vue3双向数据绑定原理发生了改变
vue2 的双向数据绑定是利用ES5 的一个 API Object.definePropert()对数据进行劫持 结合 发布订阅模式的方式来实现的
vue3 中使用了 es6 的 ProxyAPI 对数据代理。
相比于vue2.x使用proxy的优势如下
defineProperty只能监听某个属性不能对全对象监听
可以省去for in、闭包等内容来提升效率直接绑定整个对象即可
可以监听数组,不用再去单独的对数组做特异性操作 vue3.x可以检测到数组内部数据的变化
2. 默认进行懒观察lazy observation
在 2.x 版本里不管数据多大都会在一开始就为其创建观察者。当数据很大时这可能会在页面载入时造成明显的性能压力。3.x 版本,只会对「被用于渲染初始可见部分的数据」创建观察者,而且 3.x 的观察者更高效。
3. 更精准的变更通知。
比例来说2.x 版本中,使用 Vue.set 来给对象新增一个属性时,这个对象的所有 watcher 都会重新运行3.x 版本中,只有依赖那个属性的 watcher 才会重新运行。
4. 3.0 新加入了 TypeScript 以及 PWA 的支持
5.vue2和vue3组件发送改变
reactivity API
Vue2使用选项类型APIOptions API
Vue3合成型APIComposition API