web前端面试高频考点——Vue3.x升级的重要功能(emits属性、生命周期、多事件、Fragment、移出.async、异步组件写法、移出 filter、Teleport、Suspense...)

简介: web前端面试高频考点——Vue3.x升级的重要功能(emits属性、生命周期、多事件、Fragment、移出.async、异步组件写法、移出 filter、Teleport、Suspense...)

一、三连问(为什么)

1、为什么需要用 ref ?

  • 返回值类型,会丢失响应式
  • 如在 setup、computed、合成函数,都有可能返回值类型
  • Vue 如不定义 ref,用户将自造 ref,反而混乱

whyRef.vue 组件

  • 值类型无处不在
  • vue3 是通过 proxy 实现的响应式,但只对引用类型(数组,对象)有效
  • 为使得值类型也实现响应式,ref 便出现了
<template>
  <p>why ref demo {{ state.age }} - {{ age1 }}</p>
</template>
<script>
import { toRefs, reactive, computed } from "vue";
function useFeatureX() {
  const state = reactive({
    x: 1,
    y: 2,
  });
  return toRefs(state);
}
export default {
  name: "whyRef",
  setup() {
    const { x, y } = useFeatureX();
    const state = reactive({
      age: 20,
      name: "杂货铺",
    });
    const age1 = computed(() => {
      return state.age + 1;
    });
    setTimeout(() => {
      console.log(x.value, y.value);
      state.age = 25;
    }, 1000);
    return {
      state,
      age1,
    };
  },
};
</script>

3cf65d03e7d94e73bba9ca6a2f021fe4.pngb720c072c7c84b82a6ea16dad758f452.png

2、为何需要 .value ?

  • ref 是一个对象(不丢失响应式),value 存储值
  • 通过 .value 属性的 get 和 set 实现响应式
  • 用于模板、reactive 时,不需要 .value,其他情况都需要

5c49f0a4d6c94f7290b174c3a5e40726.png

3、为什么需要 toRef 和 toRefs

  • 初衷:不丢失响应式的情况下,把对象数据 分散/扩展(解构)
  • 前提:针对的是响应式对象(reactive 封装的)非普通对象
  • 注意:不创造 响应式,而是 延续 响应式

二、Vue3 升级了哪些重要的功能

1、createApp

vue2.x 对比 vue3.0

// vue2.x
const app = new Vue({...})
// vue3
const app = Vue.createApp({...})

vue2.x 使用对比 vue3.0

// vue2.x
Vue.use(...)
Vue.mixin(...)
Vue.component(...)
Vue.directive(...)
// vue3
app.use(...)
app.mixin(...)
app.component(...)
app.directive(...)

2、emits 属性

App.vue 父组件

  • 父组件的子组件标签绑定 onSayHello 自定义事件
  • info,是子给父要传递的参数
  • 注意绑定的时候必须是 @onXxx 的格式,更容易识别出是监听事件(规则)
<template>
    <HelloWorld @onSayHello="sayHello" />
</template>
<script>
import HelloWorld from "./components/HelloWorld.vue";
export default {
  methods: {
    sayHello(info) {
      console.log('hello', info);
    }
  },
  components: { HelloWorld },
};
</script>

HelloWorld.vue 子组件

  • setup里面传两个参数
  • 第一个参数 props,获取属性
  • 第二个参数是一个对象,对象解构之后是 emit 属性
  • 之后通过 emit 调用自定义事件,后面用来传参
<template>
  <p>emits 的使用</p>
</template>
<script>
export default {
    name: 'HelloWorld',
    emits: ['onSayHello'],
    setup(props, { emit }) {
        emit('onSayHello', 'vue3')
    }
};
</script>

9412ca4c636e43f9bc7fcc64ca62f9fe.png

3、生命周期

参照上一篇文章

4、多事件

在 methods 里定义 one two 两个函数

<button @click="one($event), two($event)">Submit</button>

5、Fragment 组件模板

vue2.x 组件模板:多个 html 标签 必须包裹 起来

<template>
  <div>
    <h3>Hello Vue3</h3>
    <p>前端杂货铺</p>
  </div>
</template>

vue3.x 组件模板:不需要包裹

<template>
    <h3>Hello Vue3</h3>
    <p>前端杂货铺</p>
</template>

6、移除 .async

async 可以实现父子组件数据之间的双向绑定,与 v-model 类似

在 Vue2 中一个组件上只能有一个 v-model,而 .sync 修饰符可以有很多个

// vue2.x
<MyComponent v-bind:title.sync="title" />
// vue3.x
<MyComponent v-model:tilte="title">

7、异步组件的写法

Vue2.x 写法

new Vue({
  components: {
    'my-component': () => import('./xxx.vue')
  }
})

Vue 3.x 写法

import { createApp, defineAsyncComponent } from 'vue'
createApp({
    components: {
        AsyncComponent: defineAsyncComponent(() => 
            import('./components/AsyncComponent.vue')
        )
    }
})

8、移除 filter

以下 filter 在 vue3 中不可用

{{ message | capitalize}}
<div v-bind:id="rawId | formatId"></div>

9、Teleport

详细参考链接

  • 是一种能够将我们的组件 html 结构移动到指定位置的技术
  • data 中设置 modalOpen: false
<button @click="modalOpen = true">
    打开全屏模式(使用 teleport)
</button>
<teleport to="body">
    <div v-if="modalOpen" class="modal">
        <div>
            telePort 弹窗(父元素是 body)
            <button @click="modalOpen = false">关闭弹窗</button>
        </div>
    </div>
</teleport>

5571045c96184373beedb0749ca36bad.png

10、Suspense

详细参考链接

  • 等待异步组件时渲染一些额外内容,让应用有更好的用户体验
<Suspense>
  <Test1 /> <!-- 是一个异步组件 -->
  <!-- #fallback 就是一个具名插槽
      即 Suspense 组件内部,有两个 slot,
      其中一个具名为 falllback -->
  <template #fallback>
      Loading...
  </template>
</Suspense>

11、Composition API

  • reactive
  • ref 相关
  • readonly
  • watch 和 watchEffect
  • setup
  • 生命周期钩子函数

不积跬步无以至千里 不积小流无以成江海

点个关注不迷路,持续更新中…


相关文章
|
28天前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
102 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
1月前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
1月前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
37 1
|
1月前
|
JavaScript 前端开发 搜索推荐
Vue的数据驱动视图与其他前端框架的数据驱动方式有何不同?
总的来说,Vue 的数据驱动视图在诸多方面展现出独特的优势,其与其他前端框架的数据驱动方式的不同之处主要体现在绑定方式、性能表现、触发机制、组件化结合、灵活性、语法表达以及与后端数据交互等方面。这些差异使得 Vue 在前端开发领域具有独特的地位和价值。
|
2月前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
|
2月前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
1月前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】 React与Vue:前端框架的巅峰对决与选择策略
|
2月前
|
前端开发 JavaScript API
2025年前端框架是该选vue还是react?有了大模型-例如通义灵码辅助编码,就不用纠结了!vue用的多选react,react用的多选vue
本文比较了Vue和React两大前端框架,从状态管理、数据流、依赖注入、组件管理等方面进行了详细对比。当前版本和下载量数据显示React更为流行,但Vue在国内用户量增长迅速。Vue 3通过组合式API提供了更灵活的状态管理和组件逻辑复用,适合中小型项目;React则更适合大型项目和复杂交互逻辑。文章还给出了选型建议,强调了多框架学习的重要性,认为技术问题已不再是选型的关键,熟悉各框架的最佳实践更为重要。
101 0
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!