typescript - 如何在 Vue3 中使用 TypeScript 为 ref 定义类型(绑定模板)?
问题描述
模板:
<tremplate>
<div ref="element"></div>
</template>
脚本:
export default {
setup() {
const element = ref(null);
return {
element,
};
},
};
这是在 vue3 中定义 ref 的正常方式,但以 JavaScript 方式。如果我使用 TypeScript,我需要为 value 定义一个类型element
,对吧?
如何确保 value 的类型正确element
?
解决方案
好吧,这取决于您是否需要输入它并提供成员信息(公共属性、方法等)。如果你这样做了,那么是的,你需要为它定义一个类型;否则,您不必这样做,并且可以简单地访问未包装的引用,.value
并将其保留为类型any
(我敢打赌您已经知道了这个)。
但是,如果必须,您需要告诉编译器它是什么或将要分配什么。为此,您需要使用(不带参数)的第三个重载ref
并将泛型类型显式设置为所需的类型 - 在您的情况下,您想要HTMLDivElement
(或者只是HTMLElement
如果您不关心它的特定成员必须提供)。
export default defineComponent({
setup() {
const el = ref<HTMLDivElement>();
onMounted(() => {
el.value // DIV element
});
return {
el
}
}
})
在 JavaScript 中,您没有类型检查,因此传递null
函数ref
与不传递任何内容一样好(这对于模板 ref 尤其适用)*;从某种意义上说,它甚至可能具有误导性,即展开的值实际上解析为其他东西,但 null
.
* 在使用 Composition API 时,“reactive refs”和“template refs”的概念是统一的。我们在ref
mount 钩子上访问这种特殊类型的原因是因为 DOM 元素将在初始渲染后分配给它。
参考:
推荐阅读
- arrays - 在 TypeScript 中创建具有多个属性的数组时删除重复项
- javascript - Spark AR中对象的平滑闪烁动画
- python - 如何在 python 的同一页面上显示显示的 db.query 搜索结果
- python - Google Calendar Api:ModuleNotFoundError:没有名为“google.appengine”的模块 - 在本地工作,但不在服务器上
- javascript - 尝试获取状态时反应 TypeError
- nativescript - Nativescript Sidekick iOS 构建在 Windows 上失败
- python - 如何更快地计算 (3, 2000) ndarray 中的选择?
- angular - 为什么我在覆盖字符串时会重复添加字符串?
- django - {% if any([None]) %}show{% endif %} 在模板中创建 TemplateSyntaxError
- javascript - 在 Slick Slider 的“asNavFor”滑块中隐藏活动幻灯片