vue2 面试题及详细答案150道(121 - 130)
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。
文章目录
- 一、本文面试题目录
- 121. Vue2中如何实现组件的动态样式绑定?
- 122. Vue2中如何处理跨域请求?
- 123. Vue2中如何实现路由过渡动画?
- 124. Vue2中如何实现自定义事件?
- 125. Vue2中如何实现服务注入?
- 126. Vue2中如何实现数据缓存?
- 127. Vue2中如何实现组件的全局注册?
- 128. Vue2中如何实现组件的递归调用?
- 129. Vue2中如何实现动态修改路由参数?
- 130. Vue2中如何实现组件的性能优化?
- 二、150道面试题目录列表
一、本文面试题目录
121. Vue2中如何实现组件的动态样式绑定?
答案:
Vue2中实现动态样式绑定有以下几种方式:
- 对象语法:
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data() {return {activeColor: 'red',fontSize: 16} }
- 数组语法:
<div :style="[baseStyles, overridingStyles]"></div>
- 计算属性:
<div :style="dynamicStyles"></div>
computed: {dynamicStyles() {return {color: this.isActive ? 'red' : 'blue',fontWeight: this.isBold ? 'bold' : 'normal'}} }
- 绑定CSS变量:
<div :style="`--color: ${textColor}`"></div>
122. Vue2中如何处理跨域请求?
答案:
Vue2中处理跨域请求的方法如下:
- 开发环境代理(vue.config.js):
module.exports = {devServer: {proxy: {'/api': {target: 'http://localhost:3000',changeOrigin: true,pathRewrite: { '^/api': '' }}}} }
- 生产环境配置CORS:
在后端服务器设置响应头:res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
- JSONP(仅支持GET请求):
this.$jsonp('https://api.example.com/data', {params: { id: 1 },callback: 'jsonpCallback' }).then(response => {console.log(response); });
123. Vue2中如何实现路由过渡动画?
答案:
Vue2中实现路由过渡动画的步骤如下:
- 使用
<transition>
包裹路由出口:<transition name="fade"><router-view></router-view> </transition>
- 定义CSS过渡:
.fade-enter-active, .fade-leave-active {transition: opacity 0.5s; } .fade-enter, .fade-leave-to {opacity: 0; }
- 基于路由方向设置不同动画:
<transition :name="transitionName"><router-view></router-view> </transition>
export default {computed: {transitionName() {// 根据路由路径或元信息设置不同动画return this.$route.meta.transition || 'fade';}} }
124. Vue2中如何实现自定义事件?
答案:
Vue2中实现自定义事件的方法如下:
- 在子组件中触发事件:
<!-- ChildComponent.vue --> <button @click="$emit('custom-event', '传递的数据')">触发事件</button>
- 在父组件中监听事件:
<!-- ParentComponent.vue --> <ChildComponent @custom-event="handleEvent" />
methods: {handleEvent(data) {console.log('接收到的数据:', data);} }
- 使用v-model语法糖:
<!-- 子组件 --> <input :value="value" @input="$emit('input', $event.target.value)" /><!-- 父组件 --> <ChildComponent v-model="parentValue" />
125. Vue2中如何实现服务注入?
答案:
Vue2中实现服务注入的方法如下:
- 使用Vue.prototype:
// main.js import axios from 'axios'; Vue.prototype.$http = axios;// 在组件中使用 this.$http.get('/api/data').then(response => {console.log(response); });
- 使用provide/inject:
// 父组件 export default {provide: {$api: this.$http} }// 子组件 export default {inject: ['$api'],mounted() {this.$api.get('/data').then(response => {console.log(response);});} }
- 使用插件:
const MyService = {install(Vue) {Vue.prototype.$myService = {getData() {return axios.get('/api/data');}};} };Vue.use(MyService);
126. Vue2中如何实现数据缓存?
答案:
Vue2中实现数据缓存的方法如下:
- 使用localStorage/sessionStorage:
// 存储数据 localStorage.setItem('user', JSON.stringify(this.user));// 获取数据 const user = JSON.parse(localStorage.getItem('user'));
- 使用Vuex-persistedstate:
import createPersistedState from 'vuex-persistedstate';const store = new Vuex.Store({plugins: [createPersistedState()] });
- 内存缓存:
const cache = {};export default {methods: {fetchData() {if (cache[this.id]) {return Promise.resolve(cache[this.id]);}return axios.get(`/api/data/${this.id}`).then(response => {cache[this.id] = response.data;return response.data;});}} }
127. Vue2中如何实现组件的全局注册?
答案:
Vue2中实现组件全局注册的方法如下:
- 在main.js中逐个注册:
import Vue from 'vue'; import App from './App.vue'; import ButtonComponent from './components/ButtonComponent.vue';Vue.component('ButtonComponent', ButtonComponent);new Vue({render: h => h(App) }).$mount('#app');
- 自动全局注册:
在main.js中引入:// components/global.js import Vue from 'vue'; import upperFirst from 'lodash/upperFirst'; import camelCase from 'lodash/camelCase';const requireComponent = require.context('./global', // 全局组件目录false, // 是否递归/Base[A-Z]\w+\.(vue|js)$/ // 匹配组件文件名 );requireComponent.keys().forEach(fileName => {const componentConfig = requireComponent(fileName);const componentName = upperFirst(camelCase(fileName.replace(/^\.\/(.*)\.\w+$/, '$1')));Vue.component(componentName, componentConfig.default || componentConfig); });
import './components/global';
以下是Vue2相关的面试题及详细答案161-170:
128. Vue2中如何实现组件的递归调用?
答案:
Vue2中实现组件递归调用(如树形结构)需确保:
- 命名组件:在组件选项中显式定义
name
。 - 正确引用自身:在模板中使用
name
作为标签名。
示例(树形组件):
<!-- TreeComponent.vue -->
<template><ul><li v-for="item in treeData" :key="item.id">{{ item.name }}<TreeComponent v-if="item.children && item.children.length" :treeData="item.children" /></li></ul>
</template><script>
export default {name: 'TreeComponent', // 关键:定义组件名称props: {treeData: {type: Array,required: true}}
};
</script>
129. Vue2中如何实现动态修改路由参数?
答案:
Vue2中动态修改路由参数的方法如下:
- 使用
router.push
或this.$router.push
:// 方法一:命名路由 + params this.$router.push({ name: 'user', params: { id: 2 } });// 方法二:路径 + query this.$router.push({ path: '/user', query: { id: 2 } });
- 在模板中绑定链接:
<router-link :to="{ name: 'user', params: { id: 2 } }">用户详情</router-link>
- 保留当前参数并修改部分:
this.$router.push({params: { ...this.$route.params, id: 2 } });
130. Vue2中如何实现组件的性能优化?
答案:
Vue2中组件性能优化的方法如下:
- 使用
v-show
替代v-if
(频繁切换时):<!-- 频繁切换用v-show --> <div v-show="isVisible">内容</div><!-- 条件渲染用v-if --> <div v-if="hasData">数据内容</div>
- 缓存组件(
keep-alive
):<keep-alive><router-view></router-view> </keep-alive>
- 减少响应式数据大小:
export default {data() {return {// 仅将需要响应式的数据放在data中active: true,// 大量静态数据使用Object.freezestaticData: Object.freeze(largeData)};} };
- 虚拟列表(处理大数据):
使用vue-virtual-scroller
等库只渲染可视区域。 - 事件销毁:
export default {mounted() {this.timer = setInterval(() => { /* ... */ }, 1000);},beforeDestroy() {clearInterval(this.timer); // 清除定时器} };
二、150道面试题目录列表
文章序号 | vue2面试题150道 |
---|---|
1 | vue2 面试题及详细答案(01 - 20) |
2 | vue2 面试题及详细答案(21 - 40) |
3 | vue2 面试题及详细答案(41 - 60) |
4 | vue2 面试题及详细答案(61 - 70) |
5 | vue2 面试题及详细答案(71 - 80) |
6 | vue2 面试题及详细答案(81 - 90) |
7 | vue2 面试题及详细答案(91 - 100) |
8 | vue2 面试题及详细答案(101 - 120) |
9 | vue2 面试题及详细答案(121 - 130) |
10 | vue2 面试题及详细答案(131 - 140) |
11 | vue2 面试题及详细答案(141 - 150) |