同程旅游面试题

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进行传递
  • 祖先与后代组件数据传递可选择attrslisteners或者 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 钩子函数。

 

你可能感兴趣的:(旅游,vue.js,前端)