当前位置: 首页 > article >正文

【vue3】vue3.3新特性真香

距离vue3.3发布已经过了一年多(2023.5.11),vue3.3提高开发体验的新特性你用了吗?

组件内部导入复杂类型

3.3之前想在组件内部导入复杂类型做props类型是不支持的。

<script setup lang="ts">
  import type { People } from '@/types';
  withDefaults(defineProps<People>(), {
    name: '张三',
    age: 18,
  });
</script>

<template>
  <div>{{ name }}{{ age }}</div>
</template>

Generic Components

如果组件定义时你不确定使用者需要传入什么样的属性类型,可以根据使用者传入属性值来定组件自定义属性类型,那么Generic Components 必定适合你!!!

  • 组件定义
<script setup lang="ts" generic="T">
  defineProps<{
    people: T;
  }>();
</script>

<template>
  <div>{{ people }}</div>
</template>
  • 组件使用
<script setup lang="ts">
  import GenericComponents from '@/components/GenericComponents.vue';
</script>

<template>
  <GenericComponents :people="{ name: 'wgh', age: '18' }"></GenericComponents>
  <GenericComponents
    :people="{ name: 'wgh', age: '18', class: '超级一班' }"
  ></GenericComponents>
</template>

defineEmits简写

3.3可以吧defineEmits写成键值对形式,看起来很简洁清晰。

// BEFORE
const emit = defineEmits<{
  (e: 'foo', id: number): void
  (e: 'bar', name: string, ...rest: any[]): void
}>()

// AFTER
const emit = defineEmits<{
  foo: [id: number]
  bar: [name: string, ...rest: any[]]
}>()
  • example
<script setup lang="ts">
  const emits = defineEmits<{
    change: [num: string];
    update: [num: number, ...reset: any[]];
  }>();
</script>

<template>
  <div @click="emits('change', 'change')">change</div>
  <div @click="emits('update', 123, 666, 888, 77, 111)">update</div>
</template>
  • 组件使用
<script setup lang="ts">
  import DefineEmits from '@/components/DefineEmits.vue';

  const fn = (res, ...reset) => {
    console.log(res, reset);
  };
</script>

<template>
  <define-emits @change="fn" @update="fn" />
</template>

defineModel组件定义双向数据api

给组件添加双向数据绑定可以增加组件易用性,之前组件双向数据绑定都是定义emit事件来实现的。有了这个api就可以不写emit啦,哈哈哈。

<script setup lang="ts">
  // before
  const props = defineProps<{
    cont: number;
  }>();
  
  const emits = defineEmits<{
    'update:cont': [cont: number];
  }>();
  
  // const add = () => {
  //   emits('update:cont', props.cont + 1);
  // };

  // after
  const num = defineModel('num', {
    required: true,
    default: 2,
  });

  const add = () => {
    emits('update:cont', props.cont + 1);
    num.value++;
  };
</script>

<template>
  <div>cont:{{ cont }} | num:{{ num }}</div>
  <button @click="add">++</button>
</template>

是不是写起来方便多了。

vue3.4新特性(组件使用时变量属性同名简写)

vue3.4发布时间是23年12月28,对于开发者来说,主要是defineModel 双向数据绑定api稳定和变量属性同名简写。

  • component
<script setup lang="ts">
  defineProps<{
    name: string;
    age: number;
  }>();
</script>

<template>
  <h1>同名简写</h1>
  <div>{{ name }}--{{ age }}</div>
</template>
  • use
<script setup lang="ts">
  import { ref } from 'vue';
  import SameNameShorthand from '@/components/Same-nameShorthand.vue';
  
  const name = ref('渣渣辉');
  const age = ref(18);
</script>

<template>
  <DefineModel v-model:value="name"></DefineModel>
</template>

http://www.kler.cn/news/312060.html

相关文章:

  • 兔子检测系统源码分享
  • AtCoder Beginner Contest 371
  • 在SpringCloud中实现服务熔断与降级,保障系统稳定性
  • vue2中字符串动态拼接字段给到接口
  • 机器学习(西瓜书)第 14 章 概率图模型
  • 程序员的养生
  • NET WPF使用组件库HandyControl
  • Github 2024-09-14 Rust开源项目日报Top10
  • 傅里叶变换
  • vim 操作一列数字
  • 【天怡AI-注册安全分析报告-无验证方式导致安全隐患】
  • javascript 浏览器打印不同页面设置方向,横向纵向打印
  • CPLEX+Yalmip+MATLAB2022a配置
  • 【贪心算法】贪心算法一
  • vue前端调起电脑应用并且检测有没有调用成功
  • 人工智能将来好就业吗?
  • LINUX的PHY抽象层——PAL
  • Qt/C++ 了解NTFS文件系统,解析盘符引导扇区数据获取MFT(Master File Table)主文件表偏移地址
  • 服务发现和代理实例的自动更新
  • Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
  • 【python】后台程序初始化全流程
  • electron-vue安装与打包问题解决
  • js中箭头函数与普通函数的区别
  • 删除视频最后几帧 剪切视频
  • Vue3:el-table实现日期的格式化
  • 安卓 uniapp跨端开发
  • JVM 内存模型:堆、栈、方法区讲解
  • 如何使用Postman搞定带有token认证的接口实战!
  • VSCode C++ Tasks.json中的变量
  • 住宅HTTP代理:提升网络隐私与安全的新选择