使用和DOM实现局部刷新.13.请解释一下的同源策略

获取异步调用返回的数据。

使用和DOM实现部分刷新。

13.请解释一下同源策略?

概念:同源策略是客户端脚本(尤其是.0,其目的是防止一个文档或脚本从多个不同的来源加载。这里的同源策略是指:同一个协议, 域名, 端口 , 同源策略是一种安全协议。​指的是只能读取同源窗口和文档属性的脚本。

14.介绍闭包和闭包的常见场景?

应用场景、设置私有变量的方法

不适用:返回闭包的函数是一个非常大的函数

闭包的缺点是常驻内存,使用不当会增加内存使用量,导致内存泄漏

内存(垃圾)收集机制

15.?

16. 原型,原型链?有什么特点?

五、Vue 文章

1.谈谈你对MVVM开发模型的理解?

2. v-if 和 v-show 有什么区别?

3.你用过Vuex吗?

Vuex 是为 Vue.js 应用程序开发的状态管理模式。每个 Vuex 应用程序的核心是 store。 “存储”基本上是一个容器,用于保存应用程序中的大部分状态。

主要包括以下模块:

4.说说你对SPA单页的理解,它的优缺点是什么?

SPA ( -page ) 仅在网页初始化时加载相应的 HTML、 和 CSS。一旦页面>页面加载完毕,SPA不会因用户操作重新加载或跳转页面;而是通过路由机制实现 HTML 内容、UI 和用户交互的转换,避免页面重载。

5.如何动态绑定Class和Style?

类可以通过对象语法和数组语法动态绑定:

6.如何理解Vue的单向数据流?

所有的 props 在它们的 和 child props 之间形成一个单向的下行绑定:对 prop 的更新会向下流向子组件,但不是相反。这可以防止子组件意外更改父级的状态,这可能使您的应用程序的数据流难以理解。另外,每次父组件更新时,子组件中的所有 props 都会刷新到最新的值。这意味着您不应该更改子组件内的道具。如果你这样做了,Vue 将在浏览器的控制台中发出警告。当子组件要修改时,只能通过 $emit 派发一个自定义事件。父组件收到后,会被父组件修改。

put和watch有什么区别,有哪些使用场景?

8. 直接给数组项赋值,Vue能检测到变化吗?

由于 的限制,Vue 无法检测到对以下数组的更改:

// Array.prototype.splice
vm.items.splice(newLength)

9.说说你对Vue生命周期的理解?

Vue实例有一个完整的生命周期,即从开始创建、初始化数据、编译模板、挂载Dom->渲染、更新->渲染、卸载等一系列流程,我们称之为生命周期Vue 的。

生命周期说明

组件实例创建时,组件属性生效前

组件实例已经完全创建并绑定了属性,但是真正的dom还没有生成,$el还不可用

挂载开始前调用:第一次调用关联函数

el被新创建的vm.$el替换,挂载到实例后调用hook

在组件数据更新之前调用,在修补虚拟 DOM 之前调用

组件数据更新后

keep-alive独占,组件激活时调用

keep-alive独占,组件销毁时调用

在组件销毁之前调用

组件销毁后调用

10.Vue的父组件和子组件生命周期钩子函数执行顺序?

Vue的父组件和子组件生命周期钩子函数执行顺序可以分为以下4个部分:

11.父组件能否监控子组件的生命周期?

例如,如果有一个父组件和一个子组件Child,如果父组件监听子组件的挂载,它会做一些逻辑处理css中的关闭按钮,可以通过下面的写法来实现:

// Parent.vue

// Child.vue
mounted() {
  this.$emit("mounted");
}

以上需要通过$emit手动触发父组件的事件。当父组件引用子组件时,可以通过@hook 进行更简单的监控,如下所示:

//  Parent.vue

doSomething() {
   console.log('父组件监听到 mounted 钩子函数 ...');
},
//  Child.vue
mounted(){
   console.log('子组件触发 mounted 钩子函数 ...');
},    
// 以上输出顺序为:
// 子组件触发 mounted 钩子函数 ...
// 父组件监听到 mounted 钩子函数 ...

当然@hook方法不仅可以监听,还可以监听其他生命周期事件,比如:等

12.告诉我们你对keep-alive了解多少?

keep-alive是Vue的内置组件,可以保持被包含组件的状态,避免重新渲染。它具有以下特点:

为什么数据在

13. 组成一个函数?

14. v-model的原理?

我们主要使用vue项目中的v-model指令来创建表单输入、、、等元素的双向数据绑定。我们知道v-model本质上是语法糖,而v-model内部是针对不同的输入元素使用不同的属性并抛出不同的事件:

相当于


如果在自定义组件中,v-model 将默认使用一个名为 value 的 prop 和一个名为 input 的事件,如下所示:

父组件:

子组件:
{{value}}
props:{ value: String }, methods: { test1(){ this.$emit('input', '小红') }, },

15.Vue组件之间的通信方式有哪些?

Vue 组件之间的通信是面试中的常见知识点之一。这个问题类似于一个开放式问题。当然,你回答的方法越多,得到的分数就越多,说明你对Vue的熟练程度更高。

Vue组件之间的通信仅指以下三种通信:父子组件通信、代际组件通信、兄弟组件通信。下面我们分别介绍每种通信方式,并说明该方式适用于哪种类型的组件间通信。

(1)props / $emit 用于父子组件通信

(2)ref 和 $/$ 用于父子组件通信

(3) ($emit / $on):用于父子、代际、兄弟组件通信

(4)$attrs/$: 用于代际组件通信

(5) / 用于代际组件通信

(6)Vuex适合父子、代际、兄弟组件通信

16. 用过 Vue SSR 吗?说说SSR?

服务端渲染SSR的优缺点如下:

(2)服务端渲染的缺点:

17. vue- 路由模式有几种?

vue-有3种路由方式:hash, ,对应源码如下:

switch (mode) {
  case 'history':
    this.history = new HTML5History(this, options.base)
    break
  case 'hash':
    this.history = new HashHistory(this, options.base, this.fallback)
    break
  case 'abstract':
    this.history = new AbstractHistory(this, options.base)
    break
  default:
    if (process.env.NODE_ENV !== 'production') {
      assert(false, `invalid mode: ${mode}`)
    }
}

其中,三种路由模式的说明如下:

18.能说说vue-中常用的hash和路由模式的实现原理吗?

1)Hash模式实现原理 前端路由的早期实现都是基于.hash。实现原理非常简单。 .hash 的值是 URL 中# 之后的内容。比如下面这个网站,它的.hash值为’#’:#hash路由模式的实现主要基于以下几个特点:

(2)模式HTML5的实现原理提供了实现URL变化的API。最重要的API有以下两个:.()和.()。这两个API可以在不刷新的情况下使用,操作浏览器的历史,唯一的区别是前者是添加新的历史,后者是直接替换当前的历史,如下图:..(null, null, path);..( null, null, path); 路由模式的实现主要基于以下特征的存在:

19.Vue框架如何实现对象和数组监控?

Vue数据双向绑定主要是指:数据变化更新视图,视图变化更新数据。那就是:

其中View变化更新Data,可以通过事件监听来实现,所以Vue的双向数据绑定的工作主要是如何根据Data变化更新View。 Vue主要通过以下4个步骤实现数据双向绑定:

20.Vue如何实现双向数据绑定?

如果被问到 Vue 是如何实现双向数据绑定的,大家肯定会回答通过 .() 劫持数据,但是 .() 只能劫持属性的数据,不能劫持整个对象。同样的,数组也不能被劫持,但是我们都知道在Vue框架中,Vue可以检测到对象和数组的变化(一些方法的操作),那么它是如何实现的呢?我们看下相关代码如下:

  /**
   * Observe a list of Array items.
   */
  observeArray (items: Array) {
    for (let i = 0, l = items.length; i < l; i++) {
      observe(items[i])  // observe 功能为监测数据的变化
    }
  }
  /**
   * 对属性进行递归遍历
   */
  let childOb = !shallow && observe(val) // observe 功能为监测数据的变化

通过查看上面的vue源码部分,可以知道vue框架遍历数组,递归遍历对象,从而使用.()监控对象和数组(一些方法的操作)。

21.vue如何使用vm.$set()解决对象新增属性无法响应的问题?

在现代约束下,Vue 无法检测到对象属性的添加或删除。由于 Vue 在实例初始化时执行/转换属性,因此该属性必须存在于数据对象上,以便 Vue 将其转换为反应式。但是 Vue 提供了

Vue.set(, , value) / vm.$set(, prope

要实现为对象添加响应式属性,框架本身是如何实现的?

export function set (target: Array | Object, key: any, val: any): any {
  // target 为数组
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    // 修改数组的长度, 避免索引>数组长度导致splcie()执行有误
    target.length = Math.max(target.length, key)
    // 利用数组的splice变异方法触发响应式
    target.splice(key, 1, val)
    return val
  }
  // key 已经存在,直接修改属性值
  if (key in target && !(key in Object.prototype)) {
    target[key] = val
    return val
  }
  const ob = (target: any).__ob__
  // target 本身就不是响应式数据, 直接赋值
  if (!ob) {
    target[key] = val
    return val
  }
  // 对属性进行响应式处理
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

从上面的源码我们可以看出,vm.$set的实现原理是:

22.虚拟DOM的优缺点是什么?

优点:

缺点:

23. 虚拟 DOM 是如何工作的?

虚拟DOM的实现原理主要包括以下三部分:

24. Vue 中的 key 有什么作用?

key 是 Vue 中 vnode 的唯一标签。有了这个key,我们的diff操作就可以更准确更快了。 Vue的diff过程可以概括为:oldCh和newCh各有两个头尾变量,and ,它们会成对比较新节点和旧节点,也就是一共有4种比较方式:sum、sum , sum, and , 如果以上4个比较不匹配,如果设置了key,则再次使用key进行比较。在比较过程中,遍历会偏向中间。一旦 > 表示至少遍历了 oldCh 和 newCh 之一,则结束比较。所以vue中key的作用是:key是vnode在vue中的唯一标记,通过这个key,我们的diff操作可以更准确更快!

function createKeyToOldIdx (children, beginIdx, endIdx) {
  let i, key
  const map = {}
  for (i = beginIdx; i <= endIdx; ++i) {
    key = children[i].key
    if (isDef(key)) map[key] = i
  }
  return map
}

25.你对你的 Vue 项目做了哪些优化?

(1)代码级优化

(2)关卡优化

(3)基础网络技术优化

26.你知道vue3.0这个特性吗?

Vue3.0 的目标是让 Vue 核心更小、更快、更强大,因此 Vue 3.0 添加了这些新特性:

(1)监控机制的变化3.0将带来基于代理的实现,提供反应式跟踪的全语言覆盖。这消除了Vue 2中基于.的实现存在的许多限制:

新版还提供以下功能:

(2)模板模板没有大的变化,只是改变了scope slot。2.x的机制导致scope slot发生变化,父组件会重新渲染,而3.0将scope slot改为方法,只会影响子组件的重新渲染,提高渲染性能,同时对于,vue3.0也会执行a 一系列改变css中的关闭按钮,方便直接使用api生成vdom的习惯。

(3)对象式的组件声明 vue2.x中的组件是通过一系列的声明来传递的,求和的组合需要一些装饰器来完成,虽然可以实现函数,但是比较麻烦 3.0 修改了组件的声明方式,改成类的写法,组合起来很方便,另外vue的源码是也写了。其实代码的功能比较复杂的时候,肯定有静态类型系统来做一些辅助管理的,现在vue3.0也已经完全改写了,这样更容易结合暴露的APIs. 静态类型 系统对于复杂代码的维护确实是必须的。

(4)vue其他变化3.0变化比较全面,上面只介绍了主要的3个方面,还有一些其他变化:

六、其他杂项

1.常见的浏览器内核有哪些?

一开始渲染引擎和JS引擎没有分清楚。后来JS引擎越来越独立,内核趋向于只指渲染引擎。

通用内核

2.网页前端性能优化的方法有哪些?

1.压缩css、js、图片2.减少http请求数,合并css、js,合并图片(精灵图片)3.使用CDN4.减少dom元素数量5.延迟加载图片6.静态资源也使用不存在的域名7.减少dom访问(缓存dom)8.使用事件委托9.@ >样式表顶部,脚本向下

3. 网页从输入URL到渲染经过什么过程?

大致可以分为以下七个步骤:

4.线程和进程有什么区别?

© 版权声明
THE END
喜欢就支持一下吧
点赞227赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容