前端面试——八股文

一、Vue2篇

1. 关于生命周期

1.1 生命周期有哪些?发送请求在created还是mounted?
请求接口测试:https://fcm.52kfw.cn/index.php?_mall_id=1&r=api/default/district

Vue2.x系统自带有8个

beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
beforeDestroy
destroyed

发送请求在created还是mounted?

这个问题具体要看项目和业务的情况了,因为组件的加载顺序是,父组件引入了子组件,那么先执行父的前3个生命周期,再执行子的前4个生命周期,那么如果我们的业务是父组件引入子组件,并且优先加载子组件的数据,那么在父组件中当前的请求要房mounted中,如果当前组件没有依赖关系那么放在哪个生命周期中请求都是可以的。
1.2 为什么发送请求不在beforeCreate里?beforeCreate和created有什么区别?

为什么发送请求不在beforeCreate里?

因为:如果请求是在methods封装好了,在beforeCreate调用的时候,beforeCreate阶段是拿不到methods里面的方法的(会报错了)。

beforeCreate和created有什么区别?

beforeCreate没有$data
created中有$datacreated是可以拿到methods的方法的
beforeCreate拿不到methods的方法
1.3 在created中如何获取dom
1. 只要写异步代码,获取dom是在异步中获取的,就可以了。例如:setTimeout、请求、Promise.xxx()等等...
2. 使用vue系统内置的this.$nextTick
1.4 一旦进入组件会执行哪些生命周期?
beforeCreate
created
beforeMount
mounted
1.5 第二次或者第N次进去组件会执行哪些生命周期?
1.6 父组件引入子组件,那么生命周期执行的顺序是?
父:beforeCreate、created、beforeMount
子:beforeCreate、created、beforeMount、mounted
...
父:mounted
1.7 加入keep-alive会执行哪些生命周期?

在当前组件的基础上额外增加2个生命周期(8+2)

activated 

deactivated

如果当前组件上加入keep-alive会执行5个生命周期

beforeCreate、created、beforeMount、mounted,activated 
...

1.8 你在什么情况下用过哪些生命周期?说一说生命周期使用场景

created ==> 单组件请求

mounted ==> 同步可以获取dom,如果子后父

activated  ==> 判断id是否相等

destroyed ==> 初始化上一次历史记录

2. 关于组件

2.1 组件传值(通信)的方式

父传后代 ( 后代拿到了父的数据 )
1. 父组件引入子组件,绑定数据<List :str1='str1'></List>子组件通过props来接收props:{str1:{type:String,default:''}}***这种方式父传子很方便,但是父传给孙子辈分的组件就很麻烦(父=》子=》孙)这种方式:子不能直接修改父组件的数据2. 子组件直接使用父组件的数据子组件通过:this.$parent.xxx使用父组件的数据这种方式:子可以直接修改父组件的数据3. 依赖注入优势:父组件可以直接向某个后代组件传值(不让一级一级的传递)
后代传父 (父拿到了后代的数据)
1. 子组件传值给父组件子组件定义自定义事件 this.$emit
2. 父组件直接拿到子组件的数据<List ref='child'></List>this.$refs.child
平辈之间的传值 ( 兄弟可以拿到数据 ) 通过新建bus.js文件来做

父传子:

父代码:孙子想要同样的效果同理就好

第二种父传子的形式:

父代码:

依赖注入

子传父:

平辈传值

2.2 父组件直接修改子组件的值

<List ref='child'></List>
this.$refs.child.xxx = 'yyyy';

2.3 子组件直接修改父组件的值

子组件中可以使用:this.$parent.xxx去修改
2.4 如何找到父组件
this.$parent
2.5 如何找到根组件

2.6 keep-alive
2.7 slot
匿名插槽 :插槽没有名字
具名插槽 :插槽有名字

 

作用域插槽 : 传值

 

2.8 如何封装组件

3. 关于Vuex

3.1 Vuex有哪些属性
state ==> 全局共享属性
getters ==> 针对于state数据进行二次计算
mutatioins ==> 存放同步方法的
actions    ==> 存放异步方法的,并且是来提交mutations
modules    ==> 把vuex再次进行模块之间的划分
3.2 Vuex使用state值
this.$store.state.xxx
辅助函数:mapState

以上俩种方式都可以拿到state的值,那么区别是什么?

使用this.$store.state.xxx是可以直接修改vuex的state数据的使用辅助函数的形式,是不可以修改的

 

 

3.3 Vuex的getters值修改

面试官可能会这样问:组件使用了getters中的内容,组件使用采用v-model的形式会发生什么?

getters是不可以修改的

 

 

3.4 Vuex的mutations和actions区别
相同点:mutations和actions都是来存放全局方法的,这个全局方法return的值拿不到
区别:mutations ==》 同步actions   ==》 返回的是一个Promise对象,他可以执行相关异步操作mutations是来修改state的值的,actions的作用是来提交mutations
3.5 Vuex持久化存储

为什么刷新后又回到1

Vuex本身不是持久化存储的数据。Vuex是一个状态管理仓库(state:全局属性)==》就是存放全局属性的地方。
实现持久化存储:1. 自己写localStorage  2. 使用vuex-persistedstate插件
插件使用方式:https://www.xuexiluxian.cn/blog/detail/dae4073b07144d3c9abb3e2cc8495922

4. 关于路由

4.1 路由的模式和区别
路由的模式:history、hash
区别:
1. 关于找不到当前页面发送请求的问题history会给后端发送一次请求而hash不会
2. 关于项目打包前端自测问题hash是可以看到内容的history默认情况是看不到内容的
3. 关于表象不同hash:#history:/
4.2 子路由和动态路由
4.3 路由传值
4.4 导航故障
官网说明:https://v3.router.vuejs.org/zh/guide/advanced/navigation-failures.html#%E6%A3%80%E6%B5%8B%E5%AF%BC%E8%88%AA%E6%95%85%E9%9A%9C

解决:

import VueRouter from 'vue-router'
const routerPush = VueRouter.prototype.push
VueRouter.prototype.push = function (location) {return routerPush.call(this, location).catch(error => error)
}
4.5 $router和$route区别
$router不仅包含当前路由还包含整个路由的属性和方法$route包含当前路由对象
4.6 导航守卫
1. 全局守卫beforeEach 路由进入之前afterEach 路由进入之后2. 路由独享守卫beforeEnter 路由进入之前3. 组件内守卫beforeRouteEnter 路由进入之前beforeRouteUpdate 路由更新之前beforeRouteLeave 路由离开之前

 

5. 关于API

5.1 $set
面试官:你有没有碰到过,数据更新视图没有更新的问题==》$set
this.$set(target,key,修改后的值)

 

5.2 $nextTick
$nextTick返回的参数[函数],是一个异步的。功能:获取更新后的dom源码|原理:
$nextTick( callback ){return Promise.resolve().then(()=>{callback();})
}
5.3 $refs
来获取dom的
5.4 $el
$el 获取当前组件的根节点
5.5 $data
$data 获取当前组件data数据的
5.6 $children
$children 获取到当前组件的所有子组件的
5.7 $parent
找到当前组件的父组件,如果找不到返回自身
5.8 $root
找到根组件
5.9 data定义数据
数据定义在data的return内和return外的区别:1. return外:单纯修改这个数据是不可以修改的,因为没有被get/set
2. reutnr内:是可以修改的
5.10 computed计算属性
computed计算属性的结果值,可以修改吗?可以的,需要通过get/set写法当前组件v-model绑定的值是computed来的,那么可以修改吗?可以的,需要通过get/set写法
5.11 watch
watch:{obj:{handler(newVal,oldVal){console.log( 'obj',newVal , oldVal )},immediate:true,deep:true},
}
5.12 methods和computed区别
computed是有缓存机制的,methods是没有缓存机制的(调用几次执行几次)

6. 关于指令

6.1 如何自定义指令
全局:
Vue.directive('demo', {inserted: function (a,b,c) {console.log( a,b,c );}
})
局部:
<script>
export default {directives: {demo: {bind: function (el) {console.log( 1 )}}}
}
</script>
6.2 vue单项绑定
双向绑定:v-model
单项绑定:v-bind
6.3 v-if和v-for优先级
vue2中:v-for > v-if
vue3中:v-if > v-for

7. 关于原理

7.1 $nextTick原理
$nextTick功能:获取更新后的dom
$nextTick( callback ){return Promise.resolve().then(()=>{callback();})}
7.2 双向绑定原理

8. axios二次封装

二、Vue3篇

1. Vue2和Vue3区别

1. Vue2 和 Vue3 双向绑定 方法不同Vue2 : Object.defineProperty()***后添加的属性是劫持不到的Vue3 : new Proxy()***即使后添加的也可以劫持到***还不需要循环3. $set在vue3中没有,因为new Proxy不需要4. 关于写法vue2是选项式APIvue3可以向下兼容(选项式API),也可以组合式api或Setup语法糖形式5. v-if和v-for优先级不同了6. $ref和$children也不同7. 如果大家还知道其他api不同点,随便说说就可以了

2,vue3如果用setup写怎么组织代码? 

说明:hooks(就是函数式),主要让功能模块细分(提升项目的维护性)解决问题:<script setup>//代码==》比较乱</script>
面试题:你们vue3写代码的方式 ==〉setup形式解决:hooks

 3.vue3如果用setup写如何获取类似于vue2中的this?

import {  getCurrentInstance } from 'vue'
let app = getCurrentInstance();
console.log( app.appContext.app.config.globalProperties.$loading )

4.vue3常用api有哪些?

1. createApp() ==》 创建一个应用实例。说明:等于Vue2的==》new Vue()使用场景:写插件(封装全局组件会使用)
2. provide/inject ==》依赖注入说明:其实就是传值使用场景:某一个父组件传值 到后代组件,如果层级过多传递麻烦,所以使用缺点:不好维护和查询数据来源
3. directive说明:自定义指令场景:后台管理系统中的按钮权限控制( 一个用户拥有某些权限,但是只能查看和修改,不能删除)
4. mixin说明:1.全局混入 2. 局部场景:可以添加生命周期,我在小程序的分享功能会用到缺点:不好维护和查询数据来源
5. app.config.globalProperties说明:获取vue这个全局对象的属性和方法场景:自己封装插件的时候需要把方法添加到对象中
6. nextTick说明:等待下一次 DOM 更新刷新的工具方法 :nextTick返回一个Pormise,回调函数是放在Promise中的,所以是异步执行的场景:就是把dom要更新,那么vue是数据驱动dom,所以数据的赋值就要在nextTick进行
7. computed说明:计算属性场景:有缓存
8. reactive、ref说明:来定义数据的和vue2的data类似
9. watch说明:监听(Vue3不需要深度监听)
10. markRaw()说明:不被new Proxy代理,说白了就是静态的数据
11. defineProps() 说明:父组件传递的值,子组件使用setup的形式,需要用defineProps接收
12. defineEmits()当前组件使用setup形式,自定义事件需要使用defineEmits
13. slot说明:分为 1. 匿名 2. 具名 3. 作用域场景:后台管理系统,左侧是固定菜单,右侧是不固定内容,那么右侧就是slot

5.请介绍一下vue3常的响应式数据类型

ref :基本类型
reactive :复杂类型
toRef :解构某一个值
toRefs : 解构多个值

6.请介绍一下teleport组件及其使用场景

teleport组件是一个传送门
假如自己写弹出框,需要在页面居中位置展示,不受当前组件的限制,可以把盒子传送到body中

7.面试题:v-if和v-show区别 

1. 展示形式不同
v-if是 创建一个dom节点
v-show 是display:none 、 block2. 使用场景不同
初次加载v-if要比v-show好,页面不会做加载盒子
频繁切换v-show要比v-if好,创建和删除的开销太大了,显示和隐藏开销较小

面试题:nextTick是什么?

获取更新后的dom内容

面试题:scoped原理

1. 作用:让样式在本组件中生效,不影响其他组件。
2. 原理:给节点新增自定义属性,然后css根据属性选择器添加样式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413683.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣375.猜数字大小 II

力扣375.猜数字大小 II dp dp[i][j]是说依次以从i到j的数字作为分割点(猜的数)&#xff0c;必定赢的游戏所用钱的最小值。 枚举每一列&#xff0c;从下往上算出dp[i][j]&#xff0c;最终答案为dp[1][n] class Solution {public:int getMoneyAmount(int n) {if(n 1)retu…

做影像组学+深度学习技术研究如何发表高分论文,案例解析

论文简介 标题&#xff1a;Longitudinal MRI-based fusion novel model predicts pathological complete response in breast cancer treated with neoadjuvant chemotherapy: a multicenter, retrospective study&#xff08;纵向MRI结合新模型预测新辅助化疗乳腺癌的病理完全…

CSND文章质量分批量查询

简介 CSDN 质量分是一项公开的 CSDN 博文内容质量分析服务&#xff0c;其综合分析了内容的标题、段落结构、正文长度、代码格式及复杂度、链接和超文本内容比例及质量等因素&#xff0c;为 IT 技术文章提供客观公共的质量分析结果 用途 可用与对文章质量做评估可申请创作者 …

【web网页制作】中国传统文化书法主题html网页制作开发div+css(6页面附效果源码)

HTMLCSS传统文化主题书法网页制作 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果菜单切换效果PageA、整体页Page1、主页Page2、行书页Page3、楷书页Page4、隶书页Page5、篆书页Page6、草书页 &#x1f40b;三、网页架构与技术…

Python | Leetcode Python题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; class Solution:def lexicalOrder(self, n: int) -> List[int]:ans [0] * nnum 1for i in range(n):ans[i] numif num * 10 < n:num * 10else:while num % 10 9 or num 1 > n:num // 10num 1return ans

【电子数据取证】Linux软件包管理器yum和编辑器vim

文章关键词&#xff1a;电子数据取证、手机取证、安卓取证、云取证 在Linux系统中&#xff0c;我们会进行一些软件的安装以及对一些服务或软件的配置&#xff0c;这时就需要用到Linux的yum以及编辑器&#xff0c;下面我们就来看一下这两个功能。 Linux软件包管理器yum 一、什…

模型 错位竞争(战略规划)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。与其更好&#xff0c;不如不同。 1 错位竞争的应用 1.1 美团的错位竞争策略 美团&#xff0c;作为中国领先的电子商务平台&#xff0c;面临着阿里巴巴等电商巨头的竞争压力。为了在市场中获得独特的…

Leetcode3243. 新增道路查询后的最短距离 I

Every day a Leetcode 题目来源&#xff1a;3243. 新增道路查询后的最短距离 I 解法1&#xff1a;广度优先搜索 暴力。 每次加边后重新跑一遍 BFS&#xff0c;求出从 0 到 n−1 的最短路。 代码&#xff1a; /** lc appleetcode.cn id3243 langcpp** [3243] 新增道路查询…

URP custompasscustom render objects

https://dbbh666.blog.csdn.net/article/details/141296728?spm1001.2014.3001.5502 上一次 custom render pass的时候&#xff0c;直接是quad的渲染&#xff0c;如果想把任意对象绘制到FBO怎么写呢 参考这两个高手的文章&#xff0c;总结一下 https://www.bilibili.com/read…

前端速通面经八股系列(一)—— CSS篇

CSS高频面经目录 一、CSS基础1. CSS选择器及其优先级2. CSS中可继承与不可继承属性有哪些3. display的属性值及其作用4. display的block、inline和inline-block的区别5. 隐藏元素的方法有哪些6. link和import的区别7. transition和animation的区别8. display:none与visibility:…

win10环境下gvim离线配置插件的一些补充

0 总述 在上一篇博客&#xff0c;即《Windows系统下使用gvim配置LaTeX快速书写环境》一文中&#xff0c;本小白试图模仿神级人物Gilles Castel&#xff0c;打造vim下的 LaTeX \LaTeX LATE​X书写环境。实话实说&#xff0c;东施效颦了。虽不至于一无所得&#xff0c;但也仅仅算…

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一&#xff1a;为什么要继承 ①代码重用&#xff1a;继承允许我们重用、扩展或修改父类的属性和方法&#xff0c;而无需重…

未使用CMSIS之前的stm32标准库中SystemHandler的宏定义

背景&#xff1a; 在stm32的标准库还叫STM32F10xxx_FWLib_V2.0.3的那个年代 文件 STM32F10xFWLib_V2.0.3/FWLib/library/inc/stm32f10x_nvic.h 中有对System Handlers的定义。具体内容如下&#xff1a; /* System Handlers -------------------------------------------------…

【Altium Designer程序开发】生成XML多级数据库文件 V2.0

此工具用于生成多级多节点的XML数据库文件&#xff0c;主要功能用于测试XML文件的生成速度的&#xff0c;运行环境在Altium Designer中&#xff0c;可用于Altium Designer全系列的版本中。 程序界面如下图所示&#xff0c;每一级节点表示每个父Node的子Node的数量&#xff0c;节…

Java面试题:equals和==的区别与联系分别是什么?

1. 运算符 是一个运算符&#xff0c;其用于比较两个变量的内存地址是否相等&#xff1b;对于基本数据类型(int、char、Boolean等)&#xff0c;比较的是它们的值&#xff1b;而对于引用数据类型的话(String、Object、ArrayList等)&#xff0c;比较的是引用&#xff0c;也就是对…

【函数模板】函数模板的类型推导

一、类型的自动推导 当函数模板的返回值被指定或与传入的参数的类型一致&#xff0c;那么可以直接调用函数模板&#xff0c;而不需要显式的指定参数。 //函数推导 template<typename T, typename R> T Add(T a, R b) {return a b; }void Test1() {//自动推导int x 1;…

Linux下递归设置目标目录及其子目录和文件的权限

〇、背景 本文旨在简单介绍一个在Linux环境下批量修改目录及其子目录和文件的权限的方法。 一、实现 首先新建一个shell脚本文件&#xff0c;使用指令$ vi chmod.sh&#xff0c;然后在文件中输入下述代码。 #!/bin/bashOFFSET_INDEX" " DIR_MODE755 FILE_MODE664…

笔记整理—内核!启动!—uboot部分(1)

常规启动时&#xff0c;各镜像都在SD卡中的各种分区中&#xff0c;内核放在kernel分区&#xff0c;从SD卡到DDR的连接处&#xff08;内核不需要进行重定位&#xff0c;直接从链接处启动&#xff09;。uboot从sd卡分区读使用movi命令。 使用fastboot指令可以查看分区情况&#x…

Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡

线性模型&#xff08;Linear model&#xff09; 通常模型的修改来自于对问题的理解&#xff0c;即领域知识 基本定义&#xff1a;把输入特征x乘上一个权重&#xff0c;再加上一个偏置就可以得到预测的结果。 优点&#xff1a;简单易理解&#xff0c;可理解性好&#xff08;权重…

C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例2

C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例2 文章目录 C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例21、概述2、实现效果3、主要代码4、源码地址 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 &#x1f448; 1、概述 支持多线程…