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
  • 生命周期钩子函数

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

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


相关文章
|
1月前
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环
|
1月前
|
Java 调度 Android开发
Android面试题之Kotlin中async 和 await实现并发的原理和面试总结
本文首发于公众号“AntDream”,详细解析了Kotlin协程中`async`与`await`的原理及其非阻塞特性,并提供了相关面试题及答案。协程作为轻量级线程,由Kotlin运行时库管理,`async`用于启动协程并返回`Deferred`对象,`await`则用于等待该对象完成并获取结果。文章还探讨了协程与传统线程的区别,并展示了如何取消协程任务及正确释放资源。
23 0
|
2月前
|
存储 移动开发 JavaScript
前端面经高频考点
前端面经高频考点
17 5
|
3月前
|
Java 调度
【多线程面试题 五】、 介绍一下线程的生命周期
线程的生命周期包括新建、就绪、运行、阻塞和死亡状态,线程状态会根据线程的执行情况在这些状态之间转换。
【多线程面试题 五】、 介绍一下线程的生命周期
|
3月前
|
缓存 JavaScript
【Vue面试题五】、说说你对Vue生命周期的理解?
这篇文章详细阐述了Vue生命周期的各个阶段及其特点,并解释了在`created`和`mounted`生命周期钩子中请求数据的区别,指出`created`钩子适合于执行异步数据获取,而`mounted`钩子由于DOM已经渲染完成,适合于执行依赖于DOM的操作。
【Vue面试题五】、说说你对Vue生命周期的理解?
|
3月前
|
前端开发 开发者 安全
JSF表单处理大揭秘:数据绑定与事件处理,如何让Web应用更加智能?
【8月更文挑战第31天】在现代Web应用开发中,JSF(JavaServer Faces)框架因强大的表单处理能力而广泛应用。其数据绑定机制可实现表单控件与后端模型的双向传输,降低前后端耦合度,提高代码维护性和类型安全性。事件处理机制则支持丰富的内置与自定义事件,进一步增强应用灵活性。本文通过示例代码展示这些特性,帮助开发者更好地利用JSF构建高效、灵活的Web应用。然而,JSF也存在组件库较小和学习成本较高等局限,需根据具体需求权衡使用。
49 0
|
3月前
|
前端开发 JavaScript 开发者
掌握Web前端事件处理精髓:从事件冒泡到事件委托,轻松优化你的交互体验与代码性能!
【8月更文挑战第23天】在Web前端开发中,事件处理是实现用户交互的关键机制。其中,事件冒泡与事件委托是优化页面性能、简化代码的重要手段。事件冒泡是指事件从触发它的元素开始,沿着DOM树向上逐层传播至根节点的过程。通过阻止事件冒泡,可以控制事件的影响范围。而事件委托则是利用事件冒泡特性,在父元素上设置监听器来响应子元素的事件,这种方法减少了监听器的设置数量,特别适用于动态添加的子元素,提高了代码的可维护性和性能。掌握这两种技术,能帮助开发者构建更高效、更简洁的应用程序。
54 0
|
3月前
|
前端开发 JavaScript 开发者
深入理解现代前端框架的生命周期
现代前端框架如 React、Vue 和 Angular 在构建复杂的用户界面时发挥着重要作用。了解这些框架的生命周期是前端开发的重要一环,这不仅有助于优化应用性能,还能提高开发效率。本文将探讨 React 和 Vue 的生命周期管理,比较它们的设计哲学,并提供一些最佳实践,以帮助开发者更好地利用这些框架的特性。
|
4月前
|
前端开发 JavaScript 开发者
前端框架与库 - React生命周期与Hooks
【7月更文挑战第13天】React 框架革新UI构建,引入Hooks简化组件状态管理和副作用处理。组件生命周期涉及挂载、更新、卸载,对应不同方法,如`componentDidMount`、`shouldComponentUpdate`等,但现在推荐使用`useState`和`useEffect` Hooks。`useEffect`处理副作用,需注意清理和依赖数组。避免问题的关键在于正确使用Hooks和理解其工作模式,以构建高效应用。
50 2
|
5月前
|
Java 程序员
【面试官】知道synchronized锁升级吗
线程A获取了某个对象锁,但在线程代码的流程中仍需再次获取该对象锁,此时线程A可以继续执行不需要重新再获取该对象锁。既然获取锁的粒度是线程,意味着线程自己是可以获取自己的内部锁的,而如果获取锁的粒度是调用则每次经过同步代码块都需要重新获取锁。此时synchronized重量级锁就回归到了悲观锁的状态,其他获取不到锁的都会进入阻塞状态。来获得锁,CAS操作不需要获得锁、释放锁,减少了像synchronized重量级锁带来的。轻量级锁通过CAS自旋来获得锁,如果自旋10次失败,为了减少CPU的消耗则锁会膨胀为。
154 4