3.20
css
(1)css的变量怎么使用
第一个参数是自定义属性名称;第二个参数是可选的,但是必须声明值。这个声明值的功能时 当自定义属性值没有被定义时,作为一个默认值或备用值应用。
(2)position有那些值
absolute
:生成绝对定位的元素,相对于 static
定位以外的第一个父元素进行定位fixed
:生成绝对定位的元素,相对于浏览器窗口进行定位relative
:生成相对定位的元素,相对于其正常位置进行定位static
默认值。没有定位,元素出现在正常的流中inherit
规定从父元素继承 position
属性的值vue
(3)响应式原理
整体思路是数据劫持+观察者模式
对象内部通过
defineReactive
方法,使用Object.defineProperty
将属性进行劫持(只会劫持已经存在的属性),数组则是通过重写数组方法来实现。当页面使用对应属性时,每个属性都拥有自己的dep
属性,存放他所依赖的watcher
(依赖收集),当属性变化后会通知自己对应的watcher
去更新(派发更新)。
(4)移动端适配 有5种方法
第一种方法:viewport适配 通过设置initaial-scale,将所有设备布局视图的宽度调整为设计图宽度
第二种方法:借助media实现rem适配 @media screen and (min-width: 320px)
第三种方法:Js配合修改rem适配
第四种方法:JS动态修改CSS预处理器(less)
var screen = document.dicumentElement.clientWidth;
var size = screen / 16;
document.documentElement.style.fontSize = size + 'px';
第五种方法:Js动态修改配合rem适配 不需要再在less定义变量,只需要进行js获取配合查找替换px即可。
(5)父子组件加载顺序:
1.父子组件加载顺序:
父 beforeCreated -> 父 created -> 父 beforeMounted -> 子 beforeCreated -> 子 created -> 子 beforeMounted ->父 mounted
2.父组件更新顺序:
父 beforeUpdate -> 父 updated
3.子组件更新顺序:
父 beforeUpdate -> 子 beforeUpdate -> 子 update -> 父 updated
4.父子组件销毁顺序:
父 beforeDestory -> 子 beforeDestory -> 子 destoryed -> 父 destoryed
props
与 $emit
进行传递,也可选择ref
$bus
,其次可以选择$parent
进行传递attrs
与listeners
或者 Provide
与 Inject
vuex
存放共享的变量(5)小程序跳转到公众号页面的渲染机制?/订单支付流程
(6)vue怎么监听数组
在Vue中 通过Object.defineProperty来劫持对象属性的setter和getter操作,并创建一个监听器,当数据变化的时候发出通知。
var data = {
name:'hello',
age:18
}
Object.keys(data).forEach(function(key){
Object.defineProperty(data,key,{
enumerable:true, // 是否能在for...in循环中遍历出来或在Object.keys中列举出来。
configurable:true, // false,不可修改、删除目标属性或修改属性性以下特性
get:function(){
console.log('获取数据');
},
set:function(){
console.log('监听到数据发生了变化');
}
})
});
data.name //控制台会打印出 “获取数据”
data.name = 'world' //控制台会打印出 "监听到数据发生了变化"
js
(7)垃圾回收机制
目的:间歇不定期地寻找不再使用的变量,并释放掉它们指向的内存。
标记清除(mark and sweep)
这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了
引用计数(reference counting)
在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间
(8)事件循环机制
(9)闭包的原理
闭包是一个函数以及其捆绑的周围环境状态的组合。闭包让开发者可以从内部函数访问外部函数作用域的变量。
比如:父函数里面套一个子函数,则父函数不能读取到子函数的变量,子函数可以读取到父函数的变量,这样就形成了闭包。闭包的特定是可以保存变量,防止变量被垃圾回收,确定是闭包使用不规范可能会导致内存泄漏。
(10)token无痛刷新
有两个方案:
方案一:后端需要返回一个token过期的时间,在请求发起拦截每个请求,判断token的有效时间是否过期,如果已过期,则暂时将请求挂起,先刷新token后再继续请求。
方案二:先不管token是否过期,直接请求,如果返回401(后端定义的),去刷新token,在重新调之前的接口。
场景题
页面列表渲染过长怎么办,小程序有限制
同程旅游
(11)vue2和vue3的区别
1、vue2和vue3的双向数据绑定原理发生了改变。
vue2双向数据绑定是是利用ES5 的一个 API Object.definePropert()对数据进行劫持 结合 发布订阅模式的方式来实现的。
Vue3.x 是用 ES6 的语法 Proxy对象来实现双向数据绑定的,可以检测到数组内部数据的变化。
2、Vue3支持碎片。
3、Composition API
Vue2 与vue3 最大的区别是vue2使用选项类型api,对比vue3合成型api。旧得选项型api在代码里分割了不同得属性:data,computed,methods等;
4、建立数据data
vue2是把数据放入data中,vue3就需要使用一个新的setup()方法,此方法在组件初始化构造得时候触发。使用一下三个步骤来简=建立反应性数据: 1. 从vue引入reactive;使用reactive() 方法来声明数据为响应性数据;3. 使用setup()方法来返回我们得响应性数据,从而template可以获取这些响应性数据。
5、生命周期
vue2 --------------- vue3
beforeCreate -> setup()
Created -> setup()
beforeMount -> onBeforeMount
mounted -> onMounted
beforeUpdate -> onBeforeUpdate
updated -> onUpdated
beforeDestroyed -> onBeforeUnmount
destroyed -> onUnmounted
activated -> onActivated
deactivated -> onDeactivated
6、父子传参不同,setup()函数特性
setup()函数接收两个参数:props、context(包含attrs、slots、emit)
setup函数是处于生命周期beforeCreated和created俩个钩子函数之前
执行setup时,组件实例尚未被创建(在setup()内部,this不会是该活跃实例得引用,即不指向vue实例,Vue为了避免我们错误得使用,直接将setup函数中得this修改成了undefined)
与模板一起使用时,需要返回一个对象
因为setup函数中,props是响应式得,当传入新的prop时,它将会被更新,所以不能使用es6解构,因为它会消除prop得响应性,如需解构prop,通过使用setup函数中得toRefs来完成此操作。
父传子,用props,子传父用事件 Emitting Events。在vue2中,会调用this$emit然后传入事件名和对象;在vue3中得setup()中得第二个参数content对象中就有emit,那么我们只要在setup()接收第二个参数中使用分解对象法取出emit就可以在setup方法中随意使用了。
在setup()内使用响应式数据时,需要通过 .value 获取
import { ref } from 'vue'
const count = ref(0)
console.log(count.value)
1 import { ref } from 'vue'
2 const count = ref(0)
3 console.log(count.value)
从setup() 中返回得对象上得property 返回并可以在模板中被访问时,它将自动展开为内部值。不需要在模板中追加.value。
setup函数只能是同步的不能是异步的。
Proxy 用于修改某些操作的默认行为,也可以理解为在目标对象之前架设一层拦截,外部所有的访问都必须先通过这层拦截,因此提供了一种机制,可以对外部的访问进行过滤和修改)
7、computed和watch的区别,哪个可以异步操作?
computed
是计算属性,依赖其他属性计算值,并且 computed
的值有缓存,只有当计算值变化才会返回内容。watch
监听到值的变化就会执行回调,在回调中可以进行一些逻辑操作。computed
,对于监听到值的变化需要做一些复杂业务逻辑的情况可以使用 watch
。8、 keep-alive 组件有什么作用
keep-alive
组件包裹需要保存的组件。keep-alive
组件来说,它拥有两个独有的生命周期钩子函数,分别为 activated
和 deactivated
。用 keep-alive
包裹的组件在切换时不会进行销毁,而是缓存到内存中并执行 deactivated
钩子函数,命中缓存渲染后会执行 actived
钩子函数。