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

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

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


相关文章
|
4月前
|
SQL 安全 PHP
PHP 自发布以来一直在 Web 开发领域占据重要地位,PHP 8 更是带来了属性、刚性类型等新特性。
【10月更文挑战第1天】PHP 自问世以来,凭借其易用性和灵活性,在 Web 开发领域迅速崛起。从简单的网页脚本语言逐步演进为支持面向对象编程的现代语言,尤其自 PHP 5.3 引入命名空间后,代码组织和维护变得更加高效。PHP 7 的性能优化和 PHP 8 的新特性(如属性和刚性类型)进一步巩固了其地位。框架如 Laravel、Symfony、Yii2 和 CodeIgniter 等简化了开发流程,提高了效率和安全性。
79 2
|
6月前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
225 0
|
6月前
|
Web App开发 JavaScript 前端开发
[译] 用 Web Worker 改善 Vue 组件性能
[译] 用 Web Worker 改善 Vue 组件性能
|
6月前
|
前端开发 搜索推荐 开发者
揭秘Web前端的隐形英雄:神奇的title与alt属性,你真的了解吗?
【8月更文挑战第26天】在Web开发中,`title`和`alt`属性对于提升网站的可访问性和搜索引擎优化至关重要。`title`属性可在鼠标悬停时显示额外信息,增强用户体验;`alt`属性主要用于图像,提供替代文本以确保视觉障碍用户及搜索引擎能理解图像内容。正确使用这两个属性可以显著提高网站的友好性和可达性。
144 0
|
3月前
|
JSON 前端开发 搜索推荐
惊!这些前端技术竟然能让你的网站实现个性化推荐功能!
【10月更文挑战第30天】随着互联网技术的发展,个性化推荐已成为提升用户体验的重要手段。前端技术如JavaScript通过捕获用户行为数据、实时更新推荐结果等方式,在实现个性化推荐中扮演关键角色。本文将深入解析这些技术,并通过示例代码展示其实际应用。
131 4
|
4月前
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
139 2
|
4月前
|
前端开发 JavaScript
前端中的“+”连接符,居然有鲜为人知的强大功能!
【10月更文挑战第9天】前端中的“+”连接符,居然有鲜为人知的强大功能!
67 0
前端中的“+”连接符,居然有鲜为人知的强大功能!
|
4月前
|
前端开发 JavaScript Go
前端开发趋势:从响应式设计到Web组件的探索
【10月更文挑战第1天】前端开发趋势:从响应式设计到Web组件的探索
54 3
|
3月前
|
消息中间件 监控 Kafka
Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面
随着大数据技术的发展,Apache Kafka 成为处理实时数据流的关键组件。Kafka Manager 提供了一个简洁的 Web 界面,方便管理和监控 Kafka 集群。本文详细介绍了 Kafka Manager 的部署步骤和基本使用方法,包括配置文件的修改、启动命令、API 示例代码等,帮助你快速上手并有效管理 Kafka 集群。
73 0
|
5月前
|
前端开发 API
(WEB前端编辑DWG)在线CAD如何实现图形识别功能
mxcad 提供的图形识别功能可帮助用户快速识别和提取 CAD 图纸中的各种图形,如直线、多段线、弧线、圆及图块,显著提升设计效率。此功能不仅适用于图形分类,还能进行数量统计和快速定位,减少手动操作。用户可通过 API 进行二次开发,自定义识别逻辑。具体步骤包括打开在线示例、选择识别功能、设置识别参数并开始识别。更多开发文档请关注公众号:梦想云图网页 CAD。