京东前端经典vue面试题(持续更新中)

本文深入探讨Vue.js面试中的常见问题,涵盖组件间通信的各种方式,如props、$refs、事件总线、provide/inject、Vuex等。同时讲解了Vue的权限管理实现,包括页面和按钮级别的控制。还讨论了Vue的nextTick、虚拟DOM及其优化策略,如diff算法和Vue 2.x与3.x的响应式原理差异。此外,文章还介绍了Vue的生命周期、v-if/v-show、v-html的工作原理,以及Vue项目优化的多种方法,包括代码层面、Webpack配置和基础Web技术优化。

Vue 组件间通信有哪几种方式?

Vue 组件间通信是面试常考的知识点之一,这题有点类似于开放题,你回答出越多方法当然越加分,表明你对 Vue 掌握的越熟练。Vue 组件间通信只要指以下 3 类通信:父子组件通信、隔代组件通信、兄弟组件通信,下面我们分别介绍每种通信方式且会说明此种方法可适用于哪类组件间通信。

(1)props / $emit 适用 父子组件通信 这种方法是 Vue 组件的基础,相信大部分同学耳闻能详,所以此处就不举例展开介绍。

(2)ref 与 $parent / $children 适用 父子组件通信

  • ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例
  • $parent / $children:访问父 / 子实例

(3)EventBus ($emit / $on) 适用于 父子、隔代、兄弟组件通信 这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,从而实现任何组件间的通信,包括父子、隔代、兄弟组件。

(4)$attrs/$listeners 适用于 隔代组件通信

  • $attrs:包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 ( class 和 style 除外 )。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 ( class 和 style 除外 ),并且可以通过 v-bind="$attrs" 传入内部组件。通常配合 inheritAttrs 选项一起使用。
  • $listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on事件监听器。它可以通过 v-on="$listeners" 传入内部组件

(5)provide / inject 适用于 隔代组件通信 祖先组件中通过 provider 来提供变量,然后在子孙组件中通过 inject 来注入变量。 provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。 (6)Vuex 适用于 父子、隔代、兄弟组件通信 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。

  • Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
  • 改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化。

Vue要做权限管理该怎么做?控制到按钮级别的权限怎么做?

分析

  • 综合实践题目,实际开发中经常需要面临权限管理的需求,考查实际应用能力。
  • 权限管理一般需求是两个:页面权限和按钮权限,从这两个方面论述即可。

思路

  • 权限管理需求分析:页面和按钮权限
  • 权限管理的实现方案:分后端方案和前端方案阐述
  • 说说各自的优缺点

回答范例

  1. 权限管理一般需求是页面权限和按钮权限的管理

  2. 具体实现的时候分后端和前端两种方案:

  • 前端方案 会把所有路由信息在前端配置,通过路由守卫要求用户登录,用户登录后根据角色过滤出路由表。比如我会配置一个asyncRoutes数组,需要认证的页面在其路由的meta中添加一个roles字段,等获取用户角色之后取两者的交集,若结果不为空则说明可以访问。此过滤过程结束,剩下的路由就是该用户能访问的页面,最后通过router.addRoutes(accessRoutes)方式动态添加路由即可

  • 后端方案 会把所有页面路由信息存在数据库中,用户登录的时候根据其角色查询得到其能访问的所有页面路由信息返回给前端,前端再通过addRoutes动态添加路由信息

  • 按钮权限的控制通常会实现一个指令,例如v-permission,将按钮要求角色通过值传给v-permission指令,在指令的moutned钩子中可以判断当前用户角色和按钮是否存在交集,有则保留按钮,无则移除按钮

  1. 纯前端方案的优点是实现简单,不需要额外权限管理页面,但是维护起来问题比较大,有新的页面和角色需求就要修改前端代码重新打包部署;服务端方案就不存在这个问题,通过专门的角色和权限管理页面,配置页面和按钮权限信息到数据库,应用每次登陆时获取的都是最新的路由信息,可谓一劳永逸!

可能的追问

  1. 类似Tabs这类组件能不能使用v-permission指令实现按钮权限控制?
<el-tabs> 
  <el-tab-pane label="⽤户管理" name="first">⽤户管理</el-tab-pane> 
    <el-tab-pane label="⻆⾊管理" name="third">⻆⾊管理</el-tab-pane>
</el-tabs>
  1. 服务端返回的路由信息如何添加到路由器中?
// 前端组件名和组件映射表
const map = {
   
   
  //xx: require('@/views/xx.vue').default // 同步的⽅式
  xx: () => import('@/views/xx.vue') // 异步的⽅式
}
// 服务端返回的asyncRoutes
const asyncRoutes = [
  {
   
    path: '/xx', component: 'xx',... }
]
// 遍历asyncRoutes,将component替换为map[component]
function mapComponent(asyncRoutes) {
   
   
  asyncRoutes.forEach(route => {
   
   
    route.component = map[route.component];
    if(route.children) {
   
   
      route.children.map(child => mapComponent(child))
    }
    })
}
mapComponent(asyncRoutes)

了解nextTick吗?

异步方法,异步渲染最后一步,与JS事件循环联系紧密。主要使用了宏任务微任务(setTimeoutpromise那些),定义了一个异步方法,多次调用nextTick会将方法存入队列,通过异步方法清空当前队列。

Vue中封装的数组方法有哪些,其如何实现页面更新

在Vue中,对响应式处理利用的是Object.defineProperty对数据进行拦截,而这个方法并不能监听到数组内部变化,数组长度变化,数组的截取变化等,所以需要对这些操作进行hack,让Vue能监听到其中的变化。 那Vue是如何实现让这些数组方法实现元素的实时更新的呢,下面是Vue中对这些方法的封装:

// 缓存数组原型
const arrayProto = Array.prototype;
// 实现 arrayMethods.__proto__ === Array.prototype
export const arrayMethods = Object.create(arrayProto);
// 需要进行功能拓展的方法
const methodsToPatch = [
  "push",
  "pop",
  "shift",
  "unshift",
  "splice",
  "sort",
  "reverse"
];

/** * Intercept mutating methods and emit events */
methodsToPatch.forEach(function(method) {
   
   
  // 缓存原生数组方法
  const original = arrayProto[method];
  def(arrayMethods, method, function mutator(...args) {
   
   
    // 执行并缓存原生数组功能
    const result = original.apply(this, args);
    // 响应式处理
    const ob = this.__ob__;
    let inserted;
    switch (method) {
   
   
    // push、unshift会新增索引,所以要手动observer
      case "push":
      case "unshift":
        inserted = args;
        break;
      // splice方法,如果传入了第三个参数,也会有索引加入,也要手动observer。
      case "splice":
        inserted = args.slice(2);
        break;
    }
    // 
    if 
### 京东前端开发面试题整理 #### JavaScript 基础 JavaScript 是前端开发的核心技术之一,在京东前端面试中,通常会考察候选人对 JS 的掌握程度。以下是几个常见问题: 1. **原生 JS 实现功能的局限性** - 原生 JS 可以实现大部分功能,但由于其实现方式可能过于复杂或者存在某些缺陷[^2],因此大多数开发者更倾向于使用框架来简化开发流程。 2. **arguments 参数的本质** - 函数中的 `arguments` 并不是一个真正的数组,而是一个类数组对象。这意味着它具有索引属性和长度属性,但不具备数组的方法(如 `push()` 或 `forEach()`)。要遍历类数组,可以通过以下几种方式: ```javascript // 方法一:通过 Array.prototype.slice.call() const argsArray = Array.prototype.slice.call(arguments); // 方法二:使用扩展运算符 const argsArray = [...arguments]; // 方法三:手动遍历 for (let i = 0; i < arguments.length; i++) { console.log(arguments[i]); } ``` 3. **防抖与节流** - 防抖(Debounce)是指在事件频繁触发的情况下,只有当事件停止触发一段时间后才执行回调函数;而节流(Throttle)则是指每隔固定的时间间隔执行一次回调函数。 - 下面是两种方法的具体实现: ```javascript // 防抖函数 function debounce(func, delay) { let timer; return function(...args) { clearTimeout(timer); timer = setTimeout(() => func.apply(this, args), delay); }; } // 节流函数 function throttle(func, limit) { let inThrottle; return function() { if (!inThrottle) { func.apply(this, arguments); inThrottle = true; setTimeout(() => inThrottle = false, limit); } }; } ``` #### 框架相关 现代前端开发离不开框架的支持,尤其是 React 和 Vue 这样的主流框架。以下是关于这些框架的一些典型问题: 1. **React vs Vue 工作原理对比** - React 使用虚拟 DOM 来提高渲染性能,每次状态更新时都会重新构建整个组件树并比较新旧节点差异,最后只更新实际发生变化的部分。 - Vue 则采用响应式系统,能够精确追踪依赖关系,从而仅重新渲染受影响的内容。 2. **生命周期钩子** - 对于 React 组件而言,重要的是了解 `componentDidMount`、`shouldComponentUpdate` 等阶段及其作用; - 在 Vue 中,则需熟悉 `created`、`mounted`、`updated` 等周期钩子的功能以及它们之间的调用顺序。 #### 网络协议 网络通信也是前端工程师必备的知识领域之一,特别是在处理跨域请求或优化加载速度方面尤为重要。下面列举了一些有关 TCP/UDP 协议的基础知识点: 1. **TCP 和 UDP 的主要区别** - TCP 提供可靠的数据传输服务,支持面向连接的操作模式,并具备错误检测机制;相比之下,UDP 更加轻量级,适合实时性强的应用场景,但它并不保证消息一定能成功送达目标地址[^5]。 2. **三次握手过程详解** - 客户端发送 SYN 数据包给服务器表示建立连接意愿 -> 服务器收到后回复 ACK+SYN 表明同意连接 -> 最终由客户端再次回应 ACK 结束初始化操作[^5]。 3. **四次挥手原因分析** - 当双方都需要关闭各自的写入方向时才会发生完整的四个步骤交互行为,如果一方主动断开另一方被动接受则只需三个回合即可完成分离动作[^5]。 #### 性能优化及其他注意事项 除了以上提到的技术要点外,还有其他方面的考量因素也需要重视起来,比如页面加载效率提升策略、用户体验改善措施等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值