【前端vue面试】vue2

这篇具有很好参考价值的文章主要介绍了【前端vue面试】vue2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

computed和watch

computed 有缓存,基于响应式依赖数据(基于data中声明过或者父组件传递的props中的数据)发生改变,才会重新进行计算
数据变,直接会触发相应的操作
watch监听引用类型,需要添加deep:true深度监听,拿不到oldVal(旧值),因为新值和老值指针相同。

v-show和v-if

  1. v-show 和v-if 都是做条件隐藏和显示用
  2. v-show 是通过css操作dom。在初始化Dom渲染的时候会将显示的内容跟隐藏的内容,同时渲染,只是根据条件设置css为 display: none
  3. v-if在初始化Dom渲染的时候,根据条件显示需要展示的内容,并销毁隐藏的内容。每次条件切换时,都需要销毁隐藏的内容
  4. v-if 频繁切换渲染消耗高,v-show 初始化渲染消耗高。
    优化建议:频繁切换节点 使用v-show

key 的重要性

key不能不写或乱写(如 random、index 或不是唯一索引键)
key涉及到vu的diff算法,在新旧nodes对比识别VNodes。它的作用主要是为高效的更新虚拟DOM。vue会基于key的变化重新排列元素顺序,并且会移除可以不存在的元素。有相同父元素必须有独特的key。重复的key会造成渲染错误。

v-for 和 v-if 不能一起使用!

v-for 具有比 v-if 更高的优先级,这意味着 v-if 将分别重复运行于每个 v-for 循环中,不利于性能优化
建议:

  1. 使用computed
  2. 数组情况下: v-for=“(item,index) in Array.filter(v => v.value)”
  3. v-for外层或里层再套一层用v-if

@click的event

  1. 不需要传参数的 可以直接在methods方法的对应事件函数中直接获取获取event
//template
@click="fun1" 
//methods
fun1(event){
}
  1. 需要传参数的,需要把event参数带过去,使用$event
//template
@click="fun2(2,$event)" 
//methods
fun2(val,event){
}

修饰符

事件修饰符

  • stop: 阻止事件冒泡
  • prevent: 阻止默认事件,如超链接标签的重定向
  • capture: 网页是默认按照冒泡方式去触发函数的,但是当我们使用.capture修饰符时,网页就会按照捕获的方式触发函数,也就是从外向内执行,但是这个时候一定要注意,.capture修饰符一定要写在外层才能生效

表单项修饰符

  • trim: 截掉前后空格
  • lazy: 类似防抖,输入结束后才会变化,输入的过程中不会变化
  • number: 转化为数字

父子组件通讯

重要!!面试常问!!
我的另一篇详细介绍:https://blog.csdn.net/qq_37215621/article/details/126881423

生命周期

  • 挂载阶段:
    beforeCreat:执行时,data和methods中的数据都还没有初始化
    created:data和methods都已经初始化好了,此函数可以操作data数据和methods方法
    beforeMount:此函数执行的时候,模板已经在内存中编译好了,但是尚未挂载到页面中去,此时,页面还是旧页面
    mounted: 经将编译好的模板,挂载到了页面指定的容器中显示
  • 更新阶段:
    beforeUpdate:状态更新之前执行此函数, 此时 data 中的状态值是最新的,但是界面上显示的 数据还是旧的,因为此时还没有开始重新渲染DOM节点
    updated:实例更新完毕之后调用此函数,此时 data 中的状态值 和 界面上显示的数据,都已经完成了更新,界面已经被重新渲染好了!
  • 销毁阶段:
    beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
    destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

父子组件生命周期顺序

口诀:创建从外到内,渲染从内到外


父先created
子created
子mounted
父mounted


父beforeUpdate
子beforeUpdate
子updated
父updated


父beforeDestroy
子beforeDestroy
子destroyed
父destroyed

$nextTick

  1. vue是异步渲染
  2. data改变,dom不会立刻渲染
  3. $nextTick会在Dom渲染完成之后触发,以获取最新DOM节点
this.$nextTick(()=>{
})

当多次修改data数据时,Vue会做一个data整合进行一次渲染(也就只会调用$nextTick一次)

slot 插槽

  1. 默认插槽
//父组件
<Child>
 <div>
  <h2>hello, child</h2>
 </div>
</Child>

//子组件
<template>    
    <div>            
         <slot></slot>   
    </div>
</template>
  1. 作用域插槽
    子组件向父组件传递数据
//子组件
<slot :slotData="val"></slot>
//父组件
<Index>
 <template v-slot="receivedSlot">
  <h4>从slot那边接收来的数据:{{receivedSlot.slotData}}</h4>       
  </template>
</index>
//receivedSlot.slotData,命名对应父组件receivedSlot和子组件slotData

// Demo
<slot :str="xxx" :obj="{name: 'zs'}"><slot>
/ 使用

// 组件只有默认插槽,v-slot可以写在组件上,但不能用缩写形式
<Demo v-solt="data">
  {{data.str}} / {{data.obj.name}}
</Demo>

// 组件有多个插槽,v-slot写在template上,可以用缩写形式
<Demo>
  <template #default="data">
    {{data.str}} / {{data.obj.name}}
  </template>
</Demo>

// 插槽Prop解构
<template #default="{str, obj}">
  {{str}} / {{obj.name}}
</template>

// 插槽Prop重命名
<template #default="{str: text, obj: data}">
  {{text}} / {{data.name}}
</template>

// 插槽Prop默认值
<template #default="{str = 'zzz', obj = {name: 'ls'}">
  {{text}} / {{data.name}}
</template>
  1. 具名插槽
    【前端vue面试】vue2,3分钟准备vue面试,vue.js,javascript,vue
    v-slot只能写在 template 上,当只有默认插槽时组件标签才能当插槽模板使用,v-slot 缩写 #
<template #default> defalut </template>
<template #footer> footer </template>

动态组件

  • 通过 <component :is="component - name"> 来切换不同的组件
  • 切换的组件不会被缓存,通常配合 <keep-alive>来使用
<div v-for="(item, index) of arr" :key="index">
  <component :is="item" />
</div>

...
import text from 'xxx/text'
import image from 'xxx/image'
...
data() {
  return {
    arr: ['text', 'image'] // 根据数据的值进行不同组件不同顺序渲染
  }
}
...

异步组件

说明:

  • 当某些组件体积过大,如:代码编辑器、echarts图表,直接全部同步打包会导致体积特别大

  • 通过 import() 函数引入

  • 按需加载,异步加载大组件,使用才加载,不用永远不加载

<Child v-model="name" v-if="showComponent" />
<button @click="show">点击显示组件</button>

components: {
   Child: ()=>import('./Child.vue')
 }
// 全局注册

// 在工厂函数中定义
Vue.component('async-component', function(resolve, reject) {
  resolve({
    // 组件内容
    template: '<div>async-component<div>'
  })
})

// 配合 webpack 的 code-splitting 功能使用,将构建代码分割成多个包,这些包通过 Ajax 加载
Vue.component('async-component', funcrion(resolve) {
  require(['xxx/yyy.vue'], resolve)
})

// 在工厂函数中直接返回一个 Promise
Vue.component('async-component', () => import('xxx/yyy.vue'))

// 局部注册

// 返回一个 Promise
...
components: {
  'async-component': () => import('xxx/yyy.vue')
}
...

// 返回一个 对象
...
components: {
  'async-component': () => ({
    component: () => import('xxx/yyy.vue'), // 加载组件
    loading: LoadingComponent, // 加载展示组件
    error: errorComponent, // 失败展示组件
    delay: 200, // 延迟展示时间
    timeout: 3000 // 加载超时时间
  })
}
...

keep-alive

  • keep-alive 会缓存组件

  • keep-alive 从 vue 即框架层面控制,v-show 从 css 层面来控制

  • keep-alive 再次使用组件不会重新创建和渲染,v-if 每次都会销毁和创建,并创建VNode,执行diff算法
    keep-alive将组件生成的dom缓存起来,下次再重建时直接拿来使用,不执行destroy和mounted

mixin

多个组件有相同的逻辑,抽离出来

//mix.js:
export default {
    data(){
        return {
            time: new Date()
        }
    },
    methods: {
        getDowtime(){
            console.log('现在时间是:', this.time);
          }
    }
}

//引入:
import mix from './mix'
export default {
  mixins: [mix], //可以添加多个,会自动合并起来
}

问题:

  • 变量来源不明确,不利于阅读。

  • 多mixin可能会造成命名冲突(可能有覆盖的情况)。

  • 多mixin和组件可能会出现多对多的关系,复杂度较高。文章来源地址https://www.toymoban.com/news/detail-720917.html

到了这里,关于【前端vue面试】vue2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

    gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。 当前 GoGoCode 支持解析和操作如下类型的代码: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    浏览(53)
  • 前端2023最全面试题(javaScript、typeScript、vue2、vue3、html、css、uniapp、webpack、vite、react)

    答案:JavaScript中的闭包是一种函数,它有权访问其词法环境的变量和其它函数。这意味着,即使其包含它的函数已经执行完毕,其词法环境仍然存在,因此可以访问其作用域内的变量。 答案:回调函数是在某个特定事件之后执行的函数。在JavaScript中,通常使用回调函数来处

    2024年02月06日
    浏览(64)
  • 【前端】在Vue2中使用Vanta.js炫酷动态背景(全屏背景)

    官网:https://www.vantajs.com/ 由于博主在参考官网及官方GitHub进行应用时遇到一些问题,因此写了该篇博客,以避免大家因找Bug而浪费时间,方便快速的应用。 注意版本 Vue的版本如下 “vue”: “^2.6.14” 渲染容器 导包 方法 完整代码: 完整代码: 参加颜色参数 如果报错:‘X

    2024年02月11日
    浏览(48)
  • 准备半个月,面试5分钟不到就凉了,问的实在太····

    从外包出来,没想到竟然死在了另一家厂子··· 自从加入这家公司,每天都在加班,钱倒是给的不少,所以我也就忍了。没想到12月一纸通知,所有人都不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个兄弟内推我去了一家互联网公司,兴冲冲见面试官,没想到一道

    2024年02月05日
    浏览(53)
  • ChatGPT给出的前端面试考点(Vue.js)

    答案 1. Vue.js是什么?它的主要特点是什么? Vue.js是一个渐进式JavaScript框架,用于构建用户界面。它的主要特点包括: 数据绑定:Vue.js使用双向数据绑定,即视图会自动更新以匹配数据的变化,反之亦然。 组件化:通过组件化的方法可以构建可重用的视图组件。 轻量级:

    2024年01月20日
    浏览(47)
  • 2023前端面经(面试准备+面试题)

    1.1 博客粉丝少,要不要写简历上 博客粉丝数量少,文章内容都是基础的东西,要不要写到简历上?咨询了一些群友,以下是一些回复: 1.“我作为面试官,拿到的简历如果有自己建立的站点或者博客的链接我会点进去看看的,另外面试过程中,也会去问一两点。所以我建议

    2024年02月09日
    浏览(45)
  • vue2、3 开发项目前的准备,可直接拷贝(分享)

    1. Vue2 因为最近都是做的 pc 端的项目,所以就按 pc 端常用的来配,都是架子可以直接拷贝 1.1 安装依赖 1.2 配置 element-ui element-ui 官网点击这里 1.3 配置 axios axios 官网点击这里 1.4 配置 vue-router vue-router3 的使用点击这里 1.5 配置 vuex vuex3 的使用点击这里 2. Vue3 2.1 安装依赖 其他安

    2024年02月08日
    浏览(78)
  • 2023年就业卷,卷,卷!前端面试怎么准备?

    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注\\\"慕课网\\\"! 作者:张轩|慕课网讲师 大多数开发者应该都经历过跳槽和面试,这也是我们工作生活中必须要经历的一部分,那么在每次面试中你是否发挥到了真实的水平,是否留下过很多遗憾,很多次

    2023年04月13日
    浏览(34)
  • vue前端开发准备工作ing...

    在项目开始前需要将项目的包管理工具问题解决,这里我使用的包管理工具是yarn。 安装yarn 在你的vue文件目录下的终端安装 npm i -g yarn 创建项目 如果你使用的npm包管理工具就使用如下命令创建项目 如果是yarn: 安装依赖 在你创建的项目文件下的终端安装 npm: npm install yarn:

    2024年01月17日
    浏览(54)
  • Vue2相关面试题(持续更新)

    前言 目前这套面试题只适合 初级前端 ,后面会进行深层次补充和拓展以及Vue2源代码的讲解(虽然Vue2今年开始不维护了,但是我的面试题不会止步,冲冲冲)。 在面试的过程中,一定要清楚哪些该说哪些不该说,如果一个知识点不太清楚,就不要做过多的解释,一笔带过就

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包