vue3中defineComponent 的作用详解

defineComponent基本用法

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

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

import { defineComponent } from 'vue'
 
const component = {
  name: 'Home',
  props:{
    data: String,
  },
  setup // 没有该有的提示,这非常的不友好
}
 
export default component

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

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发送事件
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中,对组件整体结构做一些调整,先看一个组件案例:

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函数只能是同步的不能是异步的
    (1)上面的组件中用defineComponent包裹了组件;
    (2)defineComponent函数,只是对setup函数进行封装,返回options的对象;
    (3)defineComponent最重要的是:在TypeScript下,给予了组件 正确的参数类型推断 。
    在这里插入图片描述
    (4)defineComponent可以给组件的setup方法准确的参数类型定义.
    (5)defineComponent 可以接受显式的自定义 props 接口或从属性验证对象中自动推断
    (6)defineComponent 可以正确适配无 props、数组 props 等形式
    (7)引入 defineComponent() 以正确推断 setup() 组件的参数类型
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue3defineComponent函数是用来定义组件的函数,它可以接收一个组件选项对象作为参数,然后返回一个组件对象。这个组件对象可以被注册到Vue应用,从而可以在应用使用。 defineComponent函数的作用是将组件选项对象转换为一个组件对象,这个组件对象包含了组件的所有属性和方法。通过这个函数,我们可以更加灵活地定义组件,可以使用Composition API等新特性,从而提高开发效率和代码质量。 ### 回答2: Vue3 新增了一种组件定义的方式,即使用 `defineComponent` 函数来定义组件。这个函数可以接受一个组件选项对象作为参数,返回一个组件对象。 `defineComponent` 主要的作用是将组件选项对象转换为一个组件对象,使得这个对象可以被 Vue3 编译器所识别,并生成组件对应的渲染函数和其他相关逻辑。 使用 `defineComponent` 定义组件的优点是: 1. 类型检查:使用 TypeScript 等静态类型检查工具时,这种方式可以提供更好的类型推导和类型检查。因为 `defineComponent` 函数会根据传入的组件选项对象推导出组件对象的类型。 2. 更严格的选项检查:在 Vue2 ,组件选项如果有未知的属性,会被忽略。但是在 Vue3 ,如果使用 `defineComponent` 函数定义组件,其选项有未知属性时,会有编译时警告。 3. 模板性能优化:使用 `defineComponent` 函数定义组件可以享受 Vue3 编译器的模板性能优化,因为 Vue3 支持基于静态分析的模板编译优化,可以避免一些不必要的运行时操作。 总的来说,`defineComponent` 函数是 Vue3 非常重要的一个函数,是定义组件的标准方式。使用它可以提供更好的类型检查、更严格的选项检查并享受模板性能优化。 ### 回答3: 在Vue 3defineComponent是一个用于定义组件的函数。与Vue 2.xVue.extend不同,defineComponent采用TypeScript类型校验和TSX语法,可以更好地支持TypeScript和JSX的使用。 使用defineComponent可以方便地创建组件,也可以更好地定义组件的类型信息和props信息。在Vue 3,props默认为响应式的,这意味着props的属性改变将会自动重新渲染组件。 defineComponent的语法非常简单,可以通过传入一个对象实现定义: ```js import { defineComponent } from 'vue' export default defineComponent({ props: { title: String, content: String }, setup(props) { return () => ( <div> <h1>{props.title}</h1> <p>{props.content}</p> </div> ) } }) ``` 在上面的示例,我们定义了一个组件,其props包括title和content。在setup函数,我们利用props去渲染一个div元素,并返回一个函数。 总的来说,defineComponent可以更好地支持TypeScript和JSX语法,提供了更好的类型校验和props响应式处理。它是Vue 3非常实用的组件定义函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值