全局api及组件

vue3中的全局api改为需要通过import引入,为了支持tree-shaking, 如

  1. import { h, Transition, nextTick } from 'vue'

app.config.globalProperties
Vue.prototype

setup

需要return 出变量才能在其他地方使用

script setup

导入组件直接import就可以,无需放components中

props用defineProps函数接收, 用与组件使用props中的数据

emits用defineEmits函数接收,用于组件触发emit函数

声明的变量函数都可以在模板或其他位置使用

递归组件使用直接引入自身就行

teleport

vue3新增的一个标签, 拥有一个to属性可以将标签中包裹的dom结构插到to属性指定的选择器中,不过在插入前要保证这个选择器可以找到对象dom结构,如果是晚于teleport挂载的如它的父级结构可以先用v-if控制下, 多次在同个节点进行teleport挂载则按顺序进行追加

emits

新增的配置项,值可以是个数组也可以是个对象,类似props, 为对象时key为emit事件名,值为一个function, params为emit传入的值,对emit事件的传值进行验证看是否符合预期,需要返回一个布尔值,如果返回值为false则报一个wraning但没有阻断效果,也不知道异步,在写emit事件时最好是定义一下放到emits中
在vue3中已将native修饰符移除(因为对于原生事件透传绑定组件已经天然支持,无需这个修饰符)
在给组件绑定emit事件的时候的时候最好在emits中声明表示这个事件属于向父组件触发的事件而非原生事件触发, 如果不进行声明当你绑定事件跟原生事件重名时如绑定一个click,在触发是就会触发两次

  • 一次来自 $emit()。
  • 另一次来自应用在根元素上的原生事件监听器。

v-model

vue3中支持多个v-model,vue3版本中已经不是value跟input的语法糖了而是modelValue与update:modelVlaue来进行更新,并移除的.sync

  1. <ChildComponent v-model="pageTitle" />
  2. <!-- 是以下的简写: -->
  3. <ChildComponent :model Value="pageTitle" @update:modelValue="pageTitle = $event" />
  4. <ChildComponent v-model:title="pageTitle" />
  5. <!-- 是以下的简写: -->
  6. <ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />
  7. <ChildComponent v-model:title.capiltalize="pageTitle" />
  8. // 自定义修饰符,可以在组件中的 props 的 modelModifiers 接收到

modifiers是在子组件中用于收集传入指令的,默认v-model是在modelModifiers中接受,具名的v-model 如 v-model.title 是在titleModifiers中接受,如果有传入修饰符再手动传入titleModifiers则手动传入的不生效,会被内置的取代, 如果没有传入修饰符则可以手动bind一个名为titleModifiers的变量

template + v-for

使用