vue面试常问知识点

78 阅读3分钟

生命周期

1.初始化渲染阶段

beforeCreate 实例刚刚被建立,数据观察事件配置还没有开始,不能操作数据 和dom
created :实例被创建完成,可以访问数据但是dom还没有渲染
beforeMounted:模板编译完成,但是还没有到dom上,
mounted:dom已经建立,可以进行dom操作,可以发送请求,发送定时器等

2.更新阶段

beforeUpdate:
update:

3.卸载阶段

beforeDestroy:做一些收尾工作,(例如:清理定时器,防止内存泄露,定时器是浏览器中,而destroyed并不能销毁异步操作)
destroy:

测试代码

<body>
    <div id="root">
        <p style="background-color: black; color: aliceblue;" @click="num++">{{ num }}</p>
        <button @click="$destroy()">destroy~~~~</button>
        <button @click="$mount()">mount</button>
    </div>
    <script src="./js/vue.js"></script>
    <script>
        const vm = new Vue({
            data: {
                num:0,
            },
            beforeCreate() {
              console.log("beforeCreate()");
            },
            created() {
              console.log("created()");
            },
            beforeMount() {
              console.log("beforeMount()");
            },
            mounted() {
              console.log("mounted()");
            },
            // 更新阶段 -> 当你修改data数据时触发
            beforeUpdate() {
              console.log("beforeUpdate()");
            },
            updated() {
              console.log("updated()");
            },
            // 卸载阶段 -> 手动销毁 vm.$destroy()
            beforeDestroy() {
              console.log("beforeDestroy()");
            },
            destroyed() {
              console.log("destroyed()");
            },
        })
        vm.$mount("#root")
    </script>
</body>

vue中动画语法

目的:vue内置元素动画,给内部子元素添加过渡&动画效果(实际上给元素添加了类名)

动画基本写法1:

CSS
              enter 从隐藏到显示
                v-enter (刚开始)
                v-enter-active (中间)
                v-enter-to (结束)

              leave 从显示到隐藏
                v-leave (刚开始) 
                v-leave-active (中间)
                v-leave-to (结束)
body
              tranisition-groud   :key=""  
                 dom元素
    

动画基本写法2:

CSS
             @keyframes 动画变量 {} 
                动画变量-leave-active
                动画变量-enter-active
body
              tranistion name="动画变量"
                 dom元素

测试案例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <style>
          /* 第一种绑定动画的方式 */
          .v-leave,
          .v-enter-to {
            transform: translateX(0);
            opacity: 1;
          }
          .v-leave-active,
          .v-enter-active {
            transition: 2s all;
          }
          .v-leave-to,
          .v-enter {
            transform: translateX(100px);
            opacity: 0;
          }
          /* 第二种绑定动画的方式 */
          .move-leave-active {
            animation: move 2s linear;
          }
          .move-enter-active {
            animation: move 2s linear reverse;
          }
          @keyframes move {
            0% {
              opacity: 1;
              transform: translateX(0);
            }
            50% {
              opacity: 1;
              transform: translateX(100px);
            }
            100% {
              opacity: 0;
              transform: translateX(200px);
            }
          }
        </style>
      </head>
  
        <div id="app">
          <button @click="isShow = !isShow">按钮</button>
          <!-- 
            Vue提供内置元素,给内部子元素添加过渡&动画效果(实际上给元素添加了类名)

              enter 从隐藏到显示
                v-enter (刚开始)
                v-enter-active (中间)
                v-enter-to (结束)
              leave 从显示到隐藏
                v-leave (刚开始) 
                v-leave-active (中间)
                v-leave-to (结束)
          -->
          // 第一种绑定动画
          <transition-group>
            <p v-if="isShow" key="1">transition(1)</p>
            <p v-if="isShow" key="2">transition(2)</p>
          </transition-group>
          
          // 第二种绑定动画
          <transition name="move">
            <p v-if="isShow">animation</p>
          </transition>
        </div>
        <script src="./js/vue.js"></script>
        <script>
          const vm = new Vue({
            data: {
              isShow: true,
            },
          });
          vm.$mount("#app");
        </script>

    </html>
  </body>
</html>

vue组件的错误捕捉

1.捕获子孙组件抛出的错误

errorcaptured :一个 Vue 组件的生命周期钩子,用于捕获子孙组件抛出的错误 当一个错误从子孙组件冒泡上来时,父组件可以通过这个钩子来捕获这个错误,并进行相应的处理。

使用: 捕获后代组件错误 在父组件中设置errorcaptured(err,vm,info)去获取子组件的错误信息

  • error:错误对象,包含错误的详细信息。
  • vm:发生错误的组件实例。
  • info:一个包含有关错误来源的信息字符串

配置区域:在当前组件中,如果该组件的子孙组件出现错误,就会报错

<template>
  <div>
  </div>
</template>
  <script>
 export default {
  name: 'YourComponentName',
  errorCaptured(err, vm, info) {
    // 处理单个组件的错误
    console.error('组件错误捕获:', err, info);
    return false; // 决定是否继续向上传播错误
  }
};
 </script>

2.全局组件报错

vue.config.errorHandler(errobj,errvm,errmsg)

定义:是一个全局的错误处理函数,可以在 Vue 应用的配置中设置。它可以捕获整个应用中未被处理的 JavaScript 错误、Vue 组件渲染错误以及异步操作中的错误等。

  • errobj:错误对象,包含了发生错误的详细信息,如错误类型、错误消息、
  • errvm:代表发生错误的 Vue 组件实例
  • errmsy:错误信息字符串,通常是对错误的简短描述

目的: 错误信息发送到服务器进行集中存储和分析,以便后续排查问题,提高应用的稳定性和可靠性 也可以根据错误的类型和严重程度向用户显示适当的错误提示,提高用户体验

使用:

在 Vue 项目的入口文件(通常是 main.js)中进行配置:

import Vue from 'vue';
Vue.config.errorHandler = function (err, vm, info) {
  // 在这里处理全局的组件错误
  console.error('全局错误捕获:', err, info);
};
// 创建 Vue 实例等后续操作...