vue面试题

本文详细梳理了Vue面试中常见的问题,包括rem换算原理、路由懒加载、移动端300毫秒延迟处理、生产与开发模式区别、路由模式、参数传递、Git操作、组件通信、Vuex模块及辅助函数等核心知识点,帮助读者深入理解Vue的实战技巧。

vue面试题和答案

1、rem 换算原理

我通常会写一个js文件,在这个文件中,当浏览器尺寸变化的时候,window.onresize事件会,根据浏览器的宽
来计算fontSize的值 clientWidth/一个值 来确定fontsize 的大小 fontsize的大小 就是1rem的值
屏幕越大,fontsize越大,1rem 的值也越大,这样就做到了 一个等比例的适配。

2、路由懒加载(按需/异步加载)

开发时,项目最后打包会变得非常大,影响页面加载,特别是首页加载速度。
这个时候把不同路由对应的组件分割成不同的代码 然后当路由被访问的时候才加载对应组件,这样就更加高效了。
方式一:const Foo = () => import(’./Foo.vue’);
方式二:const home = r => require.ensure([], () => r(require(’…/page/home/home’)), ‘home’);

3、移动端页面300毫秒延迟处理

FastClick 是 FT Labs 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。FastClick的实现原理是在检测到touchend事件的时候,会通过DOM自定义事件立即出发模拟一个click事件,并把浏览器在300ms之后的click事件阻止掉。

vue项目中 安装 FastClick插件 取消300毫秒延迟事件
if (‘addEventListener’ in document) {
document.addEventListener(‘DOMContentLoaded’, function() {
FastClick.attach(document.body);
}, false);
}

4、生产模式,开发模式有什么不同?

生产模式,开发模式的ip地址,服务器路径,图片路径,路由模式会有不同

5、如何判断 是生产模式还是开发模式?

通过判断:process.env.NODE_ENV的值
如果==development 属于开发模式
如果==production 属于生产模式
然后根据不同的模式,导出routerMode,baseUrl,imgBaseUrl 这些路径

6、vue 路由模式
路由模式分为两种history 和hash
hash —— 即地址栏 URL 中的 # 符号
特点:hash虽然出现在 URL 中,但不会被包括在HTTP 请求中,对后端完全没影响,
因此改变hash不会重新加载页面。
history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。
它们提供了对历史记录进行修改的功能。当它们执行修改时,虽然改变了当前的 URL,
但浏览器不会立即向后端发送请求。

7、vue 路由传参数 params 和query的区别

params 传参数语法:this.router.push(name:′cs′,params:geohash:geohash)必须使用name传递接收参数语法:this.router.push({name:'cs', params:{geohash:geohash}}) 必须使用name 传递 接收参数语法:this.router.push(name:cs,params:geohash:geohash)使namethis.route.params.路由参数名

query  传参数语法:this.$router.push({path:'/cs', query:{geohash:geohash}}) 
       接受参数语法:this.$route.query.路由参数名

1、params是路由的一部分,必须要在路由后面添加参数名。 query是拼接在url后面的参数,不用设置参数名。
2、params一旦设置在路由,params就是路由的一部分,如果这个路由有params传参,但是在跳转的时候没有传这个参数,会导致跳转失败或者页面会没有内容。
3、:to='/city/+item.id 这种拼接的方式  属于params传参数 

$route 与$router 的区别
$route 是只读,获取路由对象信息的时候使用
$router 是操作路由跳转的时候使用

8、什么是git?有哪些常用指令?

git是状态管理系统分为两种 本地仓库和远程仓库
当使用本地仓库时使用git init 创建个仓库,把想管理的项目和文件通过git add 文件名储存到我们的暂存区
通过git commit 添加到本地仓库中,每添加一次就产生一个新的版本,多个版本是时候有利于我们管理,
通过git reset --hard 版本id可以跳到这个版本;

9、如何将本地git 提交到远程仓库?写出具体操作指令

1、通过git init创建git仓库
2、通过git remote add origin 地址 添加上传地址
3、把要上传的项目 git add 文件名保存在暂存区
4、通过 git commit 提交到本地仓库
5、使用git pull origin master 同步到远程仓库
6、通过git push -u origin master 提交

10、git如何解决本地冲突,和远程提交冲突。

本地仓库有的时候合并的时候会冲突;远程仓库在git pull origin master时候会产生冲突。
这个时候我选择使用编辑器中的终端中使用git指令操作;
会有几个选项;这个时候如果冲突了我可以手动去选择是都保留还是保留其中一个

11、路由跳转 有几种方式
router-view 实现路由内容的地方,引入组件时写到需要引入的地方
需要注意的是,使用vue-router控制路由则必须router-view作为容器。
router-link是路由跳转最基本的方式,浏览器在解析是把它解析成为a标签,需要在router文件中index.js中引入规则
1.router-link:<router-link to='需要跳转到的页面的路径>

2.this.router.push(path:’/user’)常用于路由传参,实现携带参数的跳转常用语路有传参,query的引入方式,params只能用name来引入路由,而query要用path引入query的传递方式类似于我们ajax中get传参,在浏览器地址栏中显示参数,params则类似于post,在浏览器地址栏中不显示参数3.this.router.push({ path:’/user’})常用于路由传参,实现携带参数的跳转 常用语路有传参, query的引入方式,params只能用name来引入路由,而query 要用path引入 query的传递方式 类似于我们ajax中get传参,在浏览器地址栏中显示参数,params则类似于post,在浏览器地址栏中不显示参数 3.this.router.push(path:/user)queryparamsnamequerypathqueryajaxgetparamspost3.this.router.replace{path:‘/’ }
4.this.$router.go(-1)

12、组件通信 -父传子,子传父,兄弟 如何实现, (写出关键代码)

父传子:
1、在父组件中给子组件的标签绑定一个属性,属性上挂载需要传输的变量

2、在子组件中通过props:[‘自定义属性’]来接收这个数据
3、数据可以直接使用了 接的什么就使用什么

	子传父:(在子组件中调用父组件的方法)

	在子组件中调用父组件的方法

	1、在父组件上的子组件标签绑定一个自定义事件  给这个事件挂载需要调用的方法
	2、在子组件的方法中通过this.$emit("自定义事件名")来调用这个方法,如果父组件的方法中有参数 那么$emit第二个参数的位置就是我们要传递的参数

	子传父的本质就是调用父组件的方法  然后把值当成实参给父组件传递

	兄弟组件传值
	方式1:
	先子传父,然后再父传子

	方式2:(中央通信bus)数据从组件A传输到组件B
		1、创建一个空的vue实例来担任总线的位置

		2、把总线引入到组件A中
			然后再组件方法中通过派发事件 来发送数据
			Bus.$emit("事件名","消息")

		3、把总线引入到组件B中
			在钩子函数created中来监听来自A的事件
			bus.$on("事件名",(参数)=>{
				then挂载的从A过来的数据	
			})

13、props 如何做类型验证

props 是父组件用来传递数据的一个自定义属性。父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props
类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:
props 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。

props 是一个对象而不是字符串数组时,它包含验证要求:
验证的type类型可以是:

String

Number

Boolean

Object

Array

Function

type也可以是一个自定义构造器,使用instanceof检测。
props:{
a:nummber,
b:[string,number]
}

14、什么是solt 如何使用,具名插槽如何使用?

插槽内可以是任意内容。

如果现在事先模板中不知道需要什么内容,需要在使用时传递
就可以使用插槽with来实现,这种效果! 类似ThinkPHP中的模板继承
的block 标签的功能
匿名插槽 顾名思义就是没有名字的插槽, 匿名插槽只能有一个,多的话就会乱
实名插槽可以有多个,在使用时必须使用name属性来标识
插槽可以设置默认值,定义了不使用就会使用默认值,
如果没有名字的标签的标签默认会放到default(即匿名插槽)

15、vuex中有哪些属性,各自的作用是什
状态管理模式,多个组件之间的数据共享
state
数据的声明,使用数据时 this.$store.state.变量名

mutations
处理state中数据的操作方法,在某个组件中 使用 this.$store.commit(‘方法名’,参数)
getters
相当于state的计算属性,把state中的变量,二次处理,返回一个新的值。

actons
处理state中数据的操作方法,里面可以写异步操作 使用 this.$store.dispatch(‘方法名’,参数)
在action中 异步处理结束之后,在通过context.commit(‘mutations中的方法名’)

modules
模块化,把项目中的多个业务逻辑,封装成多个文件 在通过 modules 引入
在每个引入的模块文件中添加 命名空间 namespaced: true
使用某个模块的方法 时, this.$store.getters[‘shopcar/getN’]
使用mapGetters/mapActions/… …mapGetters({
‘getN’:‘shopcar/getN’
})

plugins
是插件 比如说 vuex结合本地存储 vuex-persist

16、什么是辅助函数?如何使用(关键代码)

在使用vuex过程中,业务功能逐渐增加,会出现很多个状态。当一个组件需要多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。
vuex提供了一些非常方便的辅助函数,比如mapState、mapGetter、mapMutation、mapAction。
mapState 把vuex store中的数据直接映射到vue实例中 …mapState([‘变量名’])

mapGetters  把vuex中的 getters中的方法直接映射到vue实例中  this.方法名

mapActions   把vuex中的 mapActions中的方法直接映射到vue实例中

mapMutations  把vuex中的 mapMutations中的方法直接映射到vue实例中

17、 post 请求 content-type类型有哪些,作用是什么?

1、application/json json格式数据
2、multipart/form-data 上传文件/图片

  如何上传图片? 
    1、修改post请求头headers 的 content-type 类型 为multipart/form-data
    2、使用 formData.append('file',文件)   

18 vue获取dom的方式

1.在标签上加ref=‘dom’,通过this.$refs.dom拿到页面元素
2.通过document.getElementById()方法来获取

19、$nextTick
是在vue组件dom元素渲染完成的时候调用

答:是在下次DOM更新循环结束之后实现延迟回调,在修改数据之后,使用nexttick,则可以在回调中获取更新后的DOMthis.nexttick,则可以在回调中获取更新后的DOM this.nexttick,DOMthis.nextTick
(vue响应的改变一个值后,此时的dom并不会立即更新,如果数据需要在数据改变以后,立即通过dom做一些操作,可以使用$nexttick获取更新后的dom)

20、keep-alive的作用,何时使用?
keep-alive是Vue.js的一个内置组件。它能够不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。
它提供了include与exclude两个属性,允许组件有条件地进行缓存。

keep-alive组件提供了include(包括)与exclude(不包括)两个属性来允许组件有条件地进行缓存,二者都可以用逗号分隔字符串、正则表达式或一个数组来表示。

keep-alive提供了两个生命钩子,分别是activated与deactivated。
因为keep-alive会将组件保存在内存中,并不会销毁以及重新创建,所以不会重新调用组件的created等方法,需要用activated与deactivated这两个生命钩子来得知当前组件是否处于活动状态。

作用就是缓存组件,使用某个组件时,通过keep-alive 组件包裹即可
如果是路由组件,我通常会给路由设置一个meta属性 如果这个属性是true 我就让 router-view 被keep-alive包裹

21、生命周期有哪些,各自的使
beforecreate : el(dom结构) 和 data(数据) 并未初始化
举个栗子:不做逻辑处理

created :完成了 data 数据的初始化,el没有

beforeMount:挂在之前

mounted :完成了 el 和 data 初始化 ,并且挂在完成
在这发起后端 ajax请求,拿回数据
beforUpdate:数据更新前

updated:数据更新完成
栗子:获得v-for渲染的每个li的高度,这个li是后添加到页面的,所以需要在updated中获得。

beforeDestroy:组件销毁前,比如组件使用v-if被隐藏,会调用。
栗子: 当移除组件时。你确认删除XX吗?

destroyed :当前组件已被删除,清空相关内容,比如说,定时器,和滚动事件。

activated : 使用了keepalive 缓存的组件被激活。

deactivated : 使用了keepalive 缓存的组件被 移除。

### Vue 面试题及答案 #### 1. Vue.js 的响应式原理是什么? Vue.js 利用 **Object.defineProperty**(Vue 2.x)或 **Proxy**(Vue 3.x)来劫持数据对象的读写操作。当数据发生变化时,Vue 能够检测到这些变化,并通知相关的视图进行更新。这种机制使得数据和视图保持同步,而无需手动操作 DOM。 具体来说,Vue 会递归地将数据对象的所有属性转换为 getter 和 setter,从而实现对数据的监听。在 Vue 3.x 中,使用 Proxy 替代了 Object.defineProperty,提供了更强大的功能和更好的性能[^1]。 #### 2. Vue 组件之间的通信方式有哪些? - **props / $emit**:父组件通过 props 向子组件传递数据,子组件通过 $emit 向父组件发送事件。 - **v-model**:本质上是 props 和 $emit 的语法糖,用于双向绑定数据。 - **provide / inject**:祖先组件向后代组件提供数据,不需要逐级传递。 - **Event Bus**:通过一个全局的 Vue 实例作为事件总线,实现任意组件间的通信。 - **Vuex**:适用于复杂应用的状态管理工具,集中管理应用的状态。 #### 3. Vue 生命周期钩子函数有哪些?分别在什么时候触发? Vue 组件的生命周期可以分为以下几个阶段: - **beforeCreate**:实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 - **created**:实例已经创建完成,属性已绑定,但 DOM 还未生成。 - **beforeMount**:挂载开始之前被调用。 - **mounted**:DOM 已经渲染完毕,可以访问真实的 DOM 元素。 - **beforeUpdate**:数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 - **updated**:数据更新后调用,虚拟 DOM 重新渲染并应用补丁。 - **beforeUnmount**:实例销毁之前调用。 - **unmounted**:实例销毁后调用。 #### 4. Vue 3 相比 Vue 2 有哪些改进? - **更快的运行速度**:Vue 3 使用 Proxy 来实现响应式系统,相比 Vue 2 的 Object.defineProperty 更加高效。 - **更小的体积**:Vue 3 通过模块化设计和 Tree-shaking 技术,显著减少了框架的体积。 - **更好的 TypeScript 支持**:Vue 3 原生支持 TypeScript,提供了更好的类型推导和开发体验。 - **Composition API**:引入了类似于 React Hook 的 Composition API,使代码组织更加灵活和可复用。 - **更好的可维护性和扩展性**:Vue 3 的架构更加模块化,便于长期维护和扩展。 #### 5. Vue 中的 computed 和 watch 有什么区别? - **computed**:计算属性基于它们的依赖进行缓存,只有在其依赖的数据发生变化时才会重新计算。适合处理复杂的逻辑和模板中的表达式。 - **watch**:观察某个数据的变化,并执行相应的回调函数。适用于异步操作或需要执行开销较大的任务。 #### 6. Vue 中的 key 属性有什么作用? `key` 属性主要用于标识列表中每个元素的唯一性。当 Vue 渲染列表时,它会尽可能高效地复用现有的元素,而不是重新创建新的元素。通过设置唯一的 `key`,可以帮助 Vue 更准确地判断哪些元素发生了变化,从而提高渲染效率。 #### 7. Vue 中的 v-if 和 v-show 有什么区别? - **v-if**:根据条件决定是否渲染元素。如果条件为假,则元素不会出现在 DOM 中。 - **v-show**:通过 CSS 的 `display` 属性控制元素的显示与隐藏。无论条件如何,元素始终存在于 DOM 中。 #### 8. Vue 中的 nextTick 是什么?有什么用途? `nextTick` 是 Vue 提供的一个方法,用于在下次 DOM 更新循环结束后执行回调函数。由于 Vue 的响应式系统是异步更新的,因此在某些情况下,直接访问或操作 DOM 可能无法获取最新的状态。通过 `nextTick`,可以确保在 DOM 更新完成后执行相关操作。 #### 9. Vue 中的 mixin 是什么?有什么优缺点? - **mixin**:是一种分发 Vue 组件中可复用功能的方式。可以通过定义 mixin 对象,包含组件的选项(如 data、methods、生命周期钩子等),然后将其混入到多个组件中。 - **优点**:提高代码的复用性和可维护性。 - **缺点**:可能导致命名冲突和逻辑混乱,特别是在大型项目中使用过多的 mixin 时。 #### 10. Vue 中的插槽(slot)是什么?如何使用? 插槽是 Vue 提供的一种内容分发机制,允许父组件向子组件传递 HTML 内容。通过 `<slot>` 标签,可以在子组件中预留一个位置,供父组件填充内容。 - **默认插槽**:父组件直接传递内容给子组件。 - **具名插槽**:通过 `name` 属性指定不同的插槽位置。 - **作用域插槽**:子组件可以向父组件传递数据,父组件可以根据这些数据自定义内容。 ```html <!-- 子组件 --> <template> <div> <slot name="header"></slot> <p>主要内容</p> <slot name="footer"></slot> </div> </template> <!-- 父组件 --> <template> <child-component> <template #header> <h1>头部内容</h1> </template> <template #footer> <p>底部内容</p> </template> </child-component> </template> ``` #### 11. Vue 中的 keep-alive 是什么?有什么用途? `keep-alive` 是 Vue 提供的一个内置组件,用于缓存动态组件的状态。当组件被切换时,`keep-alive` 可以保留组件的状态,避免重复渲染和初始化。这对于提升用户体验和性能非常有帮助。 ```html <keep-alive> <component :is="currentComponent"></component> </keep-alive> ``` #### 12. Vue 中的 directive 是什么?如何自定义指令? 指令是 Vue 提供的一种特殊的属性,用于直接操作 DOM。常见的内置指令包括 `v-model`、`v-show`、`v-if` 等。 要自定义指令,可以通过 `directives` 选项定义一个对象,包含 `bind`、`inserted`、`update`、`componentUpdated` 和 `unbind` 等钩子函数。 ```javascript // 自定义指令 directives: { focus: { inserted(el) { el.focus(); } } } ``` #### 13. Vue 中的 Vuex 是什么?有什么作用? Vuex 是 Vue 官方提供的状态管理模式和库,用于管理应用中的共享状态。它采用集中式存储管理所有组件的状态,并提供了一套规则来保证状态的变化是可以预测的。 - **State**:存储应用的状态。 - **Getters**:从 state 中派生出一些状态。 - **Mutations**:修改 state 的唯一方式,必须是同步函数。 - **Actions**:提交 mutations,可以包含异步操作。 - **Modules**:将 store 分割成模块,每个模块拥有自己的 state、getters、mutations、actions。 #### 14. Vue 中的 router 是什么?如何实现路由导航? Vue Router 是 Vue 官方的路由管理器,用于构建单页应用(SPA)。它提供了声明式的路由配置、嵌套路由、动态路由等功能。 要实现路由导航,可以通过 `<router-link>` 组件或编程式导航(`$router.push`、`$router.replace` 等)。 ```html <router-link to="/home">首页</router-link> ``` ```javascript this.$router.push('/about'); ``` #### 15. Vue 中的 Composition API 是什么?有什么优势? Composition API 是 Vue 3 引入的新特性,类似于 React Hook,允许开发者在不使用类组件的情况下,更好地组织和复用逻辑代码。它提供了一系列函数(如 `ref`、`reactive`、`watch`、`computed` 等),帮助开发者更灵活地管理组件的状态和逻辑。 - **优势**: - 提高代码的可读性和可维护性。 - 更好的类型推导和支持 TypeScript。 - 更容易复用逻辑代码。 ```javascript import { ref, onMounted } from 'vue'; export default { setup() { const count = ref(0); function increment() { count.value++; } onMounted(() => { console.log('组件已挂载'); }); return { count, increment }; } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值