vue.use和component,Vue component

  vue.use和component,Vue component

  本文主要介绍了Vue3定义组件作用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  

目录

  定义组件重载函数开发实践定义组件函数,只是对设置函数进行封装,返回选择的对象;

  导出函数定义组件(选项:未知){

  返回isFunction(选项)?{设置:选项}:选项

  }

  定义组件最重要的是:在以打字打的文件下,给予了组件正确的参数类型推断。

  

defineComponent重载函数

  1:直接设置功能

  //重载1:直接设置函数

  //(使用用户定义的道具接口)

  导出函数defineComponentProps,RawBindings=object(

  设置: (

  道具:ReadonlyProps,

  ctx: SetupContext

  )=原始绑定渲染函数

  ):DefineComponentProps,RawBindings

  2:object format with no props

  //重载2:没有属性的对象格式

  //(使用用户定义的道具接口)

  //返回类型用于韦图尔和多伦多股票交易所支持

  导出函数定义组件

  Props={},

  RawBindings={}

  D={},

  c扩展ComputedOptions={},

  m扩展MethodOptions={},

  米欣扩展ComponentOptionsMixin=ComponentOptionsMixin,

  延伸扩展ComponentOptionsMixin=ComponentOptionsMixin,

  e延长发射次数=发射次数,

  电子工程师扩展字符串=字符串

  (

  选项:component options with outpropsprops、RawBindings、D、C、M、Mixin、Extends、E、EE

  ):DefineComponentProps,RawBindings,D,C,M,Mixin,Extends,E,EE

  3:object format with array props declaration

  //重载3:带有数组属性声明的对象格式

  //道具推断为{[键入属性名]?任何}

  //返回类型用于韦图尔和多伦多股票交易所支持

  导出函数定义组件

  属性名扩展字符串,

  原始绑定,

  d,

  c扩展ComputedOptions={},

  m扩展了MethodOptions={},

  米欣扩展ComponentOptionsMixin=ComponentOptionsMixin,

  延伸扩展ComponentOptionsMixin=ComponentOptionsMixin,

  e扩展发出选项=记录字符串,any,

  电子工程师扩展字符串=字符串

  (

  选项:组件选项带ArrayProps

  PropNames,

  原始绑定,

  ):定义组件

  只读{[键入属性名]?任何},

  原始绑定,

  4: object format with object props declaration

  //重载4:带有对象属性声明的对象格式

  //请参见中的ExtractPropTypes ./componentProps.ts

  导出函数定义组件

  只读约束允许分时(同timesharing)处理{必填:真}的类型

  //作为常数而不是布尔值。

  建议扩展了ReadonlyComponentPropsOptions,

  原始绑定,

  d,

  c扩展ComputedOptions={},

  m扩展了MethodOptions={},

  米欣扩展ComponentOptionsMixin=ComponentOptionsMixin,

  延伸扩展ComponentOptionsMixin=ComponentOptionsMixin,

  e扩展发出选项=记录字符串,any,

  电子工程师扩展字符串=字符串

  (

  选项:组件选项WithObjectProps

  PropsOptions,RawBindings,D,C,M,Mixin,Extends,E,EE

  ):DefineComponentPropsOptions,RawBindings,D,C,M,Mixin,Extends,E,EE

  

开发实践

  除去单元测试中几种基本的用法,在以下的父对话框组件中,主要有这几个实际开发中要注意的点:

  自定义组件和全局组件的写法

  注入、引用等的类型约束

  设置的写法和相应h的注入问题

  多伦多股票交易所中v型车和scopedSlots的写法

  ParentDialog.vue

  脚本语言=tsx

  从"洛达什"导入{ noop,trim };

  导入{

  注入,引用,定义组件,获取当前实例,引用

  }来自@ vue/composition-API ;

  从" @/过滤器"导入过滤器;

  从" @/组件/CommonDialog "导入公共对话框;

  从""导入子表{ getEmptyModelRow } ./子表。vue ;

  导出接口IParentDialog {

  show:boolean;

  specFn:(component _ id:host component[ id ])=Promise { data:dict specs };

  }

  导出默认的defineComponentIParentDialog({

  //tsx中自定义组件依然要注册

  组件:{

  子表

  },

  道具:{

  显示:{

  类型:布尔型,

  默认值:错误

  },

  specFn: {

  类型:功能,

  默认值:noop

  }

  },

  //注意:设置须用箭头函数

  设置:(道具,上下文)={

  //修正多伦多股票交易所中无法自动注入 h 函数的问题

  //eslint-disable-next-line no-unused-vars

  const h=getCurrentInstance()!$ createElement

  const { emit }=上下文

  const { specFn,show }=props

  //过滤器的用法

  const { withColon }=过滤器;

  //注入的用法

  const page type=injectCompSpecType( pageType , foo );

  const dict components=injectRefDictComp[]( dict components ,ref([]));

  //ref的类型约束

  const dict specs=ref dict specs([]);

  const loading=ref(false);

  const _ lookup specs=async(component _ id:主机组件[ id ])={

  loading.value=true

  尝试{

  const JSON=await spec fn(component _ id);

  字典规格。value=JSON。数据;

  }最后{

  loading.value=false

  }

  };

  const formdata=refSpec({

  组件标识: ,

  specs_id: ,

  模型:[getEmptyModelRow()]

  });

  const err 1=ref();

  const err 2=ref();

  const _ doc check=()={

  错误1。值=" ";

  错误2。值=" ";

  const {组件标识,规格标识,型号}=formdata.value

  如果(!组件id) {

  err1.value=请选择部件;

  返回错误的

  }

  对于(设I=0;我型号。长度;i ) {

  const { brand_id,data }=model[I];

  如果(!brand_id) {

  err2.value=请选择品牌;

  返回错误的

  }

  如果(

  formdata.value.model.some(

  (m,midx)=midx!==I String(m . brand _ id)===String(brand _ id)

  )

  ) {

  err2.value=品牌重复;

  返回错误的

  }

  }

  返回真实的

  };

  const onClose=()={

  emit(update:show ,false);

  };

  const onSubmit=async ()={

  const bool=_ doc heck();

  如果(!布尔)返回;

  const params=formdata.value

  发出( submit ,params);

  onClose();

  };

  //注意:在多伦多股票交易所中,元素-用户界面等全局注册的组件依然要用烤肉串盒形式?

  return ()=(

  通用对话框

  class=comp

  title=新建

  宽度= 1000像素

  labelCancel=取消

  labelSubmit=确定

  vLoading={loading.value}

  show={show}

  onClose={onClose}

  onSubmit={onSubmit}

  El-form标签宽度= 140 px class= create-page

  el-form-item label={withColon(部件类型)}必需={true}错误={err1.value}

  埃尔-选择

   class=全角

  型号={{

  值:formdata。价值。组件id,

  回调:(v: string)={

  表单数据。价值。组件标识=v;

  _查找规格(v);

  }

  }}

  {字典组件。价值。map((dict comp:dict comp)=(

  El-option key={ dict comp。id } label={ dict comp。component _ name } value={ dict comp。id }/

  ))}

  /el-select

  /El-表单-项目

  {formdata.value.component_id?(

  El-form-item标签宽度= 0 标签= 必需={ true }错误={ err 2。价值}

  子表

  list={formdata.value.model}

  onChange={(v: Spec[model])={

  表单数据。价值。型号=v;

  }}

  onError={(err: string)={

  错误3。值=err

  }}

  scopedSlots={{

  默认值:(范围:任何)=(

  p{ scope.foo }/p

  )

  }}

  /

  /El-表单-项目

  ):null}

  /el格式

  /CommonDialog

  );

  }

  });

  /脚本

  样式lang=scss 范围

  /风格

  全文总结

  引入定义组件()以正确推断设置()组件的参数类型

  DefineComponent可以正确适应无道具、数组道具等形式。

  DefineComponent可以接受显式自定义props接口或从属性验证对象中自动推断。

  在tsx中,全局注册的组件如element-ui仍然是kebab-case的形式。

  在tsx中,v-model应该写成model={{ value,callback }}

  在tsx中,作用域槽应该写成scopedSlots={{ foo: (scope)=() }}

  DefineComponent不适用于功能组件,应使用RenderContext解决。

  关于Vue3 defineComponent的作用这篇文章到此为止。有关Vue3 defineComponent角色的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: