代码之家  ›  专栏  ›  技术社区  ›  Syed

类型“never”上不存在属性“$el”

  •  0
  • Syed  · 技术社区  · 4 年前

    我正在做一件事 vue.js 3 项目,我需要参考/获得 div 通过最初声明 null 像这样的参考 const refRouterView = ref(null) 我不知道如何让TypeScript意识到 DomElement .

    标记更新

    <template lang="pug">
    .flex
      router-view(ref='refRouterView')
         ...
    </template>
    
    <script lang="ts" setup>
    import { ref, onMounted } from 'vue';
    
    const refRouterView = ref(null);
    const routerViewHeight = ref(500);
    
    const getRouterViewHeight = () => {
      setTimeout(() => {
        routerViewHeight.value = refRouterView.value?.$el.offsetHeight;
      }, 250);
    };
    
    onMounted(() => getRouterViewHeight());
    </script>
    

    我犯了这个错误 Object is possibly 'null' 添加之前 ? refRouterView.value? 这看起来像黑客,我不喜欢。加上 ? 我开始看到这个错误 Property '$el' does not exist on type 'never'.

    我试着加上 HTMLElement const refRouterView : HTMLElement = ref(null); 但这会导致这个错误 Property 'value' does not exist on type 'HTMLElement'. 即使添加了 ? 重构视图。价值

    请帮忙!

    更多信息

    最初我的问题是使用 div(ref='refRouterView') @Thomas的答案解决了这个问题,但我使用了 router-view .只是为了让我的问题更容易理解 div 而不是 路由器视图 这让我们困惑,因此答案并没有解决我的问题。

    <template lang="pug">
      .flex
        div(ref='refRouterView')
          ...
    </template>
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   Thomas    4 年前

    如果你 ref 一个DOM节点,你没有 $el 属性,则ref直接指向DOM节点:
    https://v3.vuejs.org/guide/composition-api-template-refs.html

    对于typescript部分,您必须将这样的类型定义为 refRouterView 是一个 Proxy 某种类型的:
    const refRouterView = ref<HTMLDivElement>();

    然后可以直接访问属性:
    refRouterView.value.offsetHeight

    推荐文章