首页 > 其他分享 >vue3中defineComponent 的作用详解

vue3中defineComponent 的作用详解

时间:2023-10-07 15:56:45浏览次数:46  
标签:const setup vue3 详解 props 组件 data defineComponent

转自:https://www.jb51.net/article/263096.htm   这篇文章主要介绍了vue3中defineComponent 的作用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下  

vue3中,新增了 defineComponent ,它并没有实现任何的逻辑,只是把接收的 Object 直接返回,它的存在是完全让传入的整个对象获得对应的类型,它的存在就是完全为了服务 TypeScript 而存在的。

我都知道普通的组件就是一个普通的对象,既然是一个普通的对象,那自然就不会获得自动的提示,

1 2 3 4 5 6 7 8 9 10 11 import { defineComponent } from 'vue'    const component = {   name: 'Home',   props:{     data: String,   },   setup // 没有该有的提示,这非常的不友好 }    export default component

但是当我们加上 defineComponent() 之后,就完全不一样了,可以获得自动提示,vue2、vue3的自动提示都有

1 2 3 4 5 6 7 8 9 10 11 12 13 import { defineComponent } from 'vue'   const component = {   name: 'Home',   props:{     data: String,   },   setup(){     // setup 可接受两个参数,一个props,和 context   } }   export default component

接下来看看 setup 中的两个参数 props 与 context ,
props指组件传递来的参数,并且ts可以推论出props的类型.props也就是 vue2 中组件中的 props
context 有三个属性 attrs slots emit 分别对应vue2中的attrs属性、slots插槽、$emit发送事件

1 2 3 4 5 6 7 8 9 10 11 12 13 14 import { defineComponent } from 'vue'   const component = {   name: 'Home',   props:{     data: String,   },   setup(props, context){     // props.data     // context.attrs    context.slots    context.emit   } }   export default component

扩展知识:

vue3之组件结构(defineComponent,setup函数)

在vue3中,对组件整体结构做一些调整,先看一个组件案例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 import {ref, reactive, defineComponent, Ref, onMounted} from "vue"; import {settingsStore} from "/@/store/module/settings"; import {IRoleList} from "/@/interface/role/list.interface"; import {IHttpResult} from "/@/interface/common.interface"; import { ILogListParams } from "/@/interface/settings/log.interface"; export default defineComponent({    name: "LogList",    setup() {        const logList: Ref<IRoleList[]> = ref([]);        const columns = [         ...        ];          const pagination = ref({             "show-quick-jumper": true,             total: 100,             current: 1,             "show-size-changer": true,             "show-total": (total: number, range: number[]) => `${range[0]}-${range[1]} 共 ${total} 条`,             "pageSize": 10        });        const columnsList = ref(columns);        const params: ILogListParams = reactive({            page: 1,            pageSize: 10        });          onMounted(() => {            findLogList();        });        /*查询日志列表*/        const findLogList = () => {            settingsStore.findLogList(params).then((res: IHttpResult) => {                const data = res.data;                pagination.value.total = data.total;                logList.value = data.list;            });        };        /*修改状态*/        const onChange = (pagination: {current: number, pageSize: number}) => {            params.page = pagination.current;            params.pageSize = pagination.pageSize;        };        /*删除*/        const onDelete = (id: number) => {            alert(id);        };       return {           columnsList,           logList,           onDelete,           onChange,           pagination       };    } });

从上面组件代码中,可以看出在vue3中没有this对象, 所有的逻辑代码都写在setup方法里面.
若是要在HTML模板页面中使用变量或者方法, 需要在setup方法return出去.

setup是Vue3 的一大特性函数, 它有几个特性:

1、setup函数是处于 生命周期函数 beforeCreate 和 Created 两个钩子函数之间的函数

2、setup函数是 Composition API(组合API)的入口

3、在setup函数中定义的变量和方法最后都是需要 return 出去的 不然无法再模板中使用

setup函数的注意点:

vue3虽然支持vue2.x版本的写法,但也有一些要注意的地方

1、由于在执行 setup函数的时候,还没有执行 Created 生命周期方法,所以在 setup 函数中,无法使用 data 和 methods 的变量和方法

2、由于我们不能在 setup函数中使用 data 和 methods,所以 Vue 为了避免我们错误的使用,直接将 setup函数中的this修改成了 undefined

3、setup函数只能是同步的不能是异步的

  • 上面的组件中用defineComponent包裹了组件;
  • defineComponent函数,只是对setup函数进行封装,返回options的对象;
  • defineComponent最重要的是:在TypeScript下,给予了组件 正确的参数类型推断 。

defineComponent部分源码

  • defineComponent可以给组件的setup方法准确的参数类型定义.
  • defineComponent 可以接受显式的自定义 props 接口或从属性验证对象中自动推断
  • defineComponent 可以正确适配无 props、数组 props 等形式
  • 引入 defineComponent() 以正确推断 setup() 组件的参数类型

标签:const,setup,vue3,详解,props,组件,data,defineComponent
From: https://www.cnblogs.com/changbaishan/p/17746510.html

相关文章

  • 是用非构建工具开始使用Vue3
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • Vue3中shallowReactive 与 shallowRef 的用法
    转自:https://blog.csdn.net/qq_54527592/article/details/119840044  shallowReactive与shallowRef   shallowReactive:只处理对象最外层属性的响应式(浅响应式)。   shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。   什么时候使用?     ......
  • Vue3
    vue3.3.4+vite4.4.91.组件安装1.1ElementPlusnpminstallelement-plus--savemain.jsimportElementPlusfrom'element-plus'import'element-plus/dist/index.css'constapp=createApp(App);app.use(ElementPlus).mount('#app'......
  • Vue3 Div 与 v-for 的配合应用,超出自动带滚动条
    效果图 代码<li><ahref="javascript:;"class="IndReaflexCHuans"><i></i><p>当前会议[0]</p></a><divstyle="height:80%;overflow:auto;"><divv-for="......
  • sqlServer安装步骤详解
    1、sqlserver下载步骤sqlserver下载地址——https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads下载下面的免费的developer即可;然后直接选择B就可以啦:选择中文简体,并接受:选择安装路径:等待安装完成:安装的确实有点子慢的;安装完成!然后选择安装SSMS;自......
  • 详解PLC常用的编程语言
    大家都知道学习某种新知识,技巧跟方法是关键的。正如新手刚开始接触PLC,它的软件编程语言与一般计算机语言相比,具有明显的特点,它既不同于高级语言,也不同于一般的汇编语言,它既要满足易于编写又要满足易于调试的要求。早期的PLC仅支持梯形图编程语言和指令表编程语言,现根据国际电工委......
  • plt.scatter 中cmap参数详解
    plt.scatter中cmap参数详解 1.首先,cmap参数和c参数配合使用的。参数c可以是一个序列,如:plt.scatter(a,b,c=['b','r','b','r','b'],s=80)此时c的序列是一个颜色序列,除了上述的简洁写法,还可以使用RGB或RBGA:plt.scatter(a,b,c=['#f00','#0f0','#f00�......
  • 以视频监控系统 EasyCVR 为例带您详解数字视频监控
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • AC自动机与dp详解
    AC自动机与dp前言:本篇题解隶属于https://www.cnblogs.com/linghusama/p/17742870.html部分首先一定要理解fail跳的原理,不然很难理解第二维为什么要设置。首先给出大致的雏形,dp_i_j表示目前拼凑出长度为i的字符串,且ac自动机上的指针在j位置时的字符串方案数。适用题型:对于求......
  • Flutter/Dart第11天:Dart函数方法详解
    Dart官方文档:https://dart.dev/language/functions重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。Dart语言是纯面向对象的编程语言,就是是函数也是对象,它的类型就是Function类(https://......