使用 vue3 和 typescript 访问动态模板引用

Posted

技术标签:

【中文标题】使用 vue3 和 typescript 访问动态模板引用【英文标题】:Accessing dynamic template refs with vue3 and typescript 【发布时间】:2021-12-17 23:33:45 【问题描述】:

我有一个像这样动态渲染组件的组件:

<div class="row" v-for="(formField, index) in form.formFields" :key="index">
  <boolean-form-item
    v-if="formField.fieldType == 'Boolean'"
    v-model="form.formFields[index]"
    :ref="formField.configuration?.key"
  ></boolean-form-item>
  <numeric-form-item
    v-if="formField.fieldType == 'Number'"
    v-model="form.formFields[index]"
    :ref="formField.configuration?.key"
  ></numeric-form-item>
  <dropdown-form-item
    v-if="formField.fieldType == 'Dropdown'"
    v-model="form.formFields[index]"
    :ref="formField.configuration?.key"
  ></dropdown-form-item>
</div>

每个表单项类型都有一个我想要访问的 validate() 方法。问题是,当使用 $ref 访问它们时,类型是未知的,并且 typescript 会抛出一个错误。

validate() 
  this.form.formFields.forEach((field) => 
    var key = "";
    if (field.configuration) 
      key = field.configuration.key;
    

    console.log(this.$refs[key].validate()); // <<--- Error Object is of type 'unknown'
  );
,

如何访问组件的动态创建的子组件并执行 validate() 方法?

【问题讨论】:

您确定 key 不是空字符串,例如field.configuration.key 没有定义?旁注,不要再使用var,在这种情况下let 将是正确的关键字。除了你仍然以 IE 【参考方案1】:

您可以使用 typescript 类型转换并执行类似的操作

interface VueFormField extends Vue 
    validate: () => any


validate() 
    this.form.formFields.forEach((field) => 
    let key = "";
    if (field.configuration) 
      key = field.configuration.key;
    
    console.log((this.$refs[key] as VueFormField).validate());
  );

您还可以使用 dynamic component vue 功能来获得更优雅的解决方案来生成您的表单,也可以使用模板引用,例如 this

【讨论】:

以上是关于使用 vue3 和 typescript 访问动态模板引用的主要内容,如果未能解决你的问题,请参考以下文章

uniapp+vue3 接入typescript

Vue3+TypeScript项目报错: 找不到名称“require”。是否需要为节点安装类型定义?

Vue 3 和 Typescript - 无法访问方法中的数据属性

在 Vue 3 Typescript 中使用提供/注入访问组件中的方法,错误对象可能是“未定义”

vue3 类组件访问道具

Vue3+TypeScript完整项目上手教程