const nav = ref<HTMLElement>()
const nav = ref<HTMLElement|null>(null)
const nav = ref(null)
const nav = ref('')
在nav标签上加ref的话,这几种定义写法有啥区别?都可以吗?※现在用的是第二种写法
我在使用这个nav时候,ts提示我 navWidth = nav.value.clientWidth
这样的写法不对,应该是 navWidth = nav.value?.clientWidth
但是在使用navWidth这个变量时候,navWidth可能为定义。这种情况该怎么写好点呢?
必须这样加if判断条件吗 if(nav.value){}
问题2
假如我想定义一个div
的关联ref
,那我用HTMLElement
和HTMLDivElement
都可以是吧?有啥好的规约吗?像 nav
这种标签是没有HTMLNavHTML
这样的接口,这种时候怎么办嘞?既然都是HTMLElement的子类,为啥要HTMLDivElement
呢,每次在定义时候都用HTMLElement
?
既然你是用在 TS 里的,后两种写法等于直接丧失了类型信息,直接排除。
其次直接
ref<HTMLElement>()
就好,用不着声明成ref<HTMLElement | null>
。因为
ref()
这个方法的函数签名本身就已经是function ref<T = any>(): Ref<T | undefined>
了,Vue 已经帮你做好了值可能是未定义的处理了,用不着你多此一举声明出来。我理解为你这个 ref 是要用在 template 里绑定到一个元素或组件的,那么它在 mount 之前确实会是 undefined 的。但如果你确认你的调用一定是在 mount 之后、并且这个元素本身也不存在 v-if 之类的会导致它有可能被销毁,那么直接用非空断言符
!
即可:只用你不能确定的情况下,才需要判断一下是否非空。
HTMLDivElement
比HTMLElement
多了一个align
属性。如果你并非用到某个特定元素类型的特有成员(常见于HTMLImageElement
、HTMLVideoElement
等),一律声明成HTMLElement
即可,可以减轻心智负担。