上海蔚来-前端-一面面经(附答案)
算法+八股+项目共40分钟左右
算法
力扣20题,有效的括号。
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
八股
-
flex
里的主轴和侧轴是什么?主轴是
flex
布局的主要轴线,由flex-direction
定义,有row
(默认,水平从左到右),row-reverse
(水平,从右到左),column
(垂直,从上到下),column-reverse
(垂直,从下到上)侧轴是主轴垂直的轴线,侧轴方向由主轴自动设置。
-
flex
代表什么?flex: 1
代表什么?flex
是一个简写属性,用于设置弹性项目如何分配剩余空间。它是flex-grow
,flex-shrink
和flex-basis
的简写。flex: 1
实际上是flex-grow: 1; flex-shrink: 1; flex-basis: 0;
的简写。这意味着该项目将尽可能地增长,占据可用的空间,并在空间不足时进行收缩。 -
async
和await
是什么?async
和await
是ES8提出的基于Promise解决异步的最终方案,让异步代码像同步代码一样async
是函数的修饰符,返回一个promise
对象,结果由async
修饰的函数返回值决定。await
必须写在async
中,await
右侧表达式一般为promise
对象,一般返回promise
成功的值。如果await
的promise
失败,则会抛出异常,需要使用try...catch
捕获 -
如果
await
返回失败的promise
,一定要用try...catch
接收吗?如果有多个await
怎么才能不阻塞主进程代码的执行?能不能用Promise.all
?一般建议使用
try...catch
接收,防止未捕获的异常影响程序运行。如果有多个await
操作并且不希望阻塞主进程,可以使用Promise.all
并行执行多个异步操作。async function fetchMultipleData() { try { const [data1, data2, data3] = await Promise.all([ fetch('https://api.example.com/data1').then(res => res.json()), fetch('https://api.example.com/data2').then(res => res.json()), fetch('https://api.example.com/data3').then(res => res.json()) ]); return { data1, data2, data3 }; } catch (error) { console.error('Error fetching data:', error); } }
-
什么是轮询?如果页面上有一份数据需要持续刷新,我们要轮询等待页面完成这个数据处理,此使怎么做?
轮询是一种定期发送请求以检查某个状态或获取数据的技术。在页面上实现轮询,可以使用
setInterval
函数,每 n 秒检查一次 -
cookie
和session
之间有什么不同?使用session
的时候需要用到cookie
吗?cookie
:存储在客户端浏览器中的小数据文件,可以跨会话存在,通常用于保存用户偏好、登录状态等信息。cookie
可以设置过期时间。session
:存储在服务器端的一种会话机制,用户访问网站时生成的唯一会话标识(session ID)保存在cookie
中。session
数据保存在服务器端,浏览器关闭后session
也会失效。 -
说说
sessionStorage
和localStorage
之间的区别?sessionStorage
:在一个浏览器会话中有效的数据存储,页面刷新后数据仍然存在,但关闭浏览器或标签页后数据就会消失。localStorage
:持久化存储数据,除非通过 JavaScript 删除,否则数据会一直存在,即使关闭浏览器也不会消失。 -
说说
Vue3
组件通信的方法?v-model:
的原理是什么?父传子:
-
props
:父传子通过:props=""
和definedProps(['props'])
;子传父属性值通过从父组件收到的方法传递回去 -
v-model
:组件内部
v-model
的本质<!-- 使用v-model指令 --> <input type="text" v-model="userName"> <!-- v-model的本质是下面这行代码 --> <input type="text" :value="userName" @input="userName =(<HTMLInputElement>$event.target).value" >
组件通信的
v-model
本质::moldeValue
+update:modelValue
事件父组件:
<!-- 组件标签上使用v-model指令 --> <Child v-model="userName"/> <!-- 组件标签上v-model的本质:发送并接收数据 --> <Child :modelValue="userName" @update:model-value="userName = $event"/>
子组件:
defineProps()
接收,defineEmits()
发送<template> <div class="box"> <!--将接收的value值赋给input元素的value属性,目的是:为了呈现数据 --> <!--给input元素绑定原生input事件,触发input事件时,进而触发update:model-value事件--> <input type="text" :value="modelValue" @input="emit('update:model-value',$event.target.value)" > </div> </template> <script setup lang="ts" name="AtguiguInput"> // 接收数据 defineProps(['modelValue']) // 声明事件,在上面的@input触发事件,发送数据 const emit = defineEmits(['update:model-value']) </script>
-
ref和refs
,子组件用defineExpose()
暴露,父组件通过ref()
可以进行修改,refs()
包含了所有子组件,可以一次性修改数据 -
默认插槽,具名插槽:
<slot>默认内容</slot>
,<slot name="s1"></slot>
子传父:
props
- 自定义事件
$event
:父组件自定义事件,通过@method=""
给子组件绑定;子组件通过defineEmits()
获得自定义事件,使用@click=emit()
给父组件传递数据 v-model
parent
,子组件通过@click="myfunc($parent)"
修改parent数据- 作用域插槽:子组件通过
slot
发送<slot :youxi="games" a="hhhh"></slot>
,父组件v-slot
接收所有参数对象<template v-slot="params">
,
祖孙:
$attrs
,需要经过儿子,儿子直接用v-bind="$attrs"
向孙子传递provide
,inject
:爷用provide
提供数据,孙用inject
接收数据
任意:
mitt
:安装包,接收数据的组件提前绑定好事件emitter.on()
,提供数据的组件合适时触发事件@click=emitter.emit()
pinia
:集中式管理,实现任意组件通信,核心:state, action, getter
,相当于组件中的data
,methods
,computed
吐槽:组件通信内容太多了。。。实际开发最常用的就只有
props
、自定义事件和pinia
-
项目
- 出于什么动机做的项目?
- 路由鉴权使用的是什么方法实现的?
echarts
用的是哪个版本?主要设置是什么?- 项目遇到的难点有哪些?
- 在
response header
响应头里面有哪些常见的属性? status
有哪些状态?
其他
- 平时如何学习前端?
- 你有什么想问的?