本人目前从事前端开发,5年+工作经验,擅长vue、html、css、js、three.js.........,目前定居河北,期望能成为一名全职的数字游民!

2024年前端vue面试题整理

1. 请解释Vue 3中的Composition API与Options API的区别,并说明你更倾向于使用哪种方式,为什么?

解答:

Vue 3引入了Composition API,它提供了一种更灵活和更可重用的方式来编写组件逻辑。主要区别如下:

Composition API:使用函数和钩子将逻辑组合在一起,更加灵活,可重用性更高。代码模块化和可维护性更好。

Options API:使用特定的对象属性(如data、methods、computed等)组织逻辑,适合较小的项目和新手。

个人倾向于Composition API,因为它在复杂应用中提供了更好的逻辑组织和复用能力。

2. Vue 3中的Reactivity系统是如何工作的?请详细描述。

解答:

Vue 3的响应式系统基于Proxy对象,实现了更高效、更灵活的数据响应性。

Proxy:Vue 3使用ES6的Proxy对象来拦截和监视对对象属性的访问和修改,从而实现响应式。

Reactivity Tracking:在组件渲染过程中,Vue会记录哪些组件依赖哪些响应式数据,当数据变化时,Vue会触发相关组件的重新渲染。

3. 如何在Vue项目中优化性能?请列举至少三种方法。

解答:

优化Vue项目性能的方法包括但不限于:

代码分割:使用Webpack的代码分割功能,按需加载组件,减少初始加载时间。

懒加载路由:通过Vue Router的动态导入,延迟加载不常用的页面组件。

使用Vue的异步组件:对于大型组件,可以使用异步组件加载方式,提升页面响应速度。

4. 什么是Vue的双向数据绑定,底层原理是什么?

解答:

Vue的双向数据绑定是指视图和数据模型之间的双向同步。当数据模型变化时,视图会自动更新,反之亦然。底层原理主要依靠Vue的响应式系统,通过数据劫持和依赖追踪实现。

数据劫持:使用Object.defineProperty(Vue 2)或Proxy(Vue 3)劫持数据对象的setter和getter。

依赖追踪:在getter中收集依赖,在setter中触发依赖通知,更新视图。

5. Vue 3中的Teleport组件是什么?请举例说明其使用场景。

解答:

Teleport是Vue 3引入的新组件,允许你将一个组件的渲染内容移动到DOM的另一位置,常用于模态框、提示框等需要脱离父组件结构的元素。

示例:

<template>
  <div>
    <button @click="showModal = true">Open Modal</button>
    <teleport to="body">
      <div v-if="showModal" class="modal">
        <p>This is a modal!</p>
        <button @click="showModal = false">Close</button>
      </div>
    </teleport>
  </div>
</template>
<script>
export default {
  data() {
    return {
      showModal: false
    };
  }
};
</script>
<style>
.modal {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: white;
  padding: 20px;
  box-shadow: 0 2px 10px rgba(0,0,0,0.2);
}
</style>

6. 如何在Vue 3中使用TypeScript?请提供简单示例。

解答:

在Vue 3中使用TypeScript,可以通过创建.vue文件,并在<script>标签中添加lang="ts"来启用TypeScript。

示例:

<template>
  <div>{{ message }}</div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  data() {
    return {
      message: 'Hello, TypeScript!'
    };
  }
});
</script>

7. Vuex中的模块化是什么,如何实现?

解答:

Vuex的模块化允许你将状态管理分成独立的模块,每个模块有自己的state、mutations、actions和getters。这对于大型应用非常有用,能够更好地组织代码。

示例:

// store/modules/user.js
export const user = {
  state: () => ({
    name: 'John Doe'
  }),
  mutations: {
    setName(state, name) {
      state.name = name;
    }
  },
  actions: {
    updateName({ commit }, name) {
      commit('setName', name);
    }
  },
  getters: {
    getName: state => state.name
  }
};

// store/index.js
import { createStore } from 'vuex';
import { user } from './modules/user';

export default createStore({
  modules: {
    user
  }
});

8. 如何在Vue中进行单元测试?请列出常用工具和框架。

解答:

在Vue中进行单元测试,常用的工具和框架包括:

Jest:一个强大的JavaScript测试框架,支持快照测试。

Vue Test Utils:Vue官方的单元测试实用工具,用于测试Vue组件。

示例:

// MyComponent.spec.js
import { shallowMount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';

describe('MyComponent.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(MyComponent, {
      props: { msg }
    });
    expect(wrapper.text()).toMatch(msg);
  });
});

9. 解释Vue Router中的路由守卫是什么,并举例说明其作用。

解答:

路由守卫用于控制导航过程中的权限验证或其它操作,主要包括全局守卫、路由独享守卫和组件内守卫。

示例:

// 全局前置守卫
router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next({ name: 'Login' });
  } else {
    next();
  }
});

10. 在Vue项目中,如何使用第三方插件,比如Axios?

解答:

在Vue项目中使用第三方插件如Axios,可以通过全局引入并配置插件。

示例:

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import axios from 'axios';
import VueAxios from 'vue-axios';

const app = createApp(App);
app.use(VueAxios, axios);
app.mount('#app');

// 在组件中使用
export default {
  mounted() {
    this.axios.get('https://api.example.com/data')
      .then(response => {
        console.log(response.data);
      });
  }
};


console.log(0.1+0.1==2)//false

JavaScript中,数字都是以64位浮点数存储,包括整数,由于浮点数不是精确的数,某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数,然后再进行运算,所以运算可能会出现偏差

希望可以在2024年中,技术与薪资都得到正向的成长