【问题标题】:How to pass ref as prop: [Vue warn]: Invalid prop: type check failed for prop "containerRef". Expected Object, got HTMLDivElement?如何将 ref 作为道具传递:[Vue 警告]:无效的道具:道具“containerRef”的类型检查失败。预期对象,得到 HTMLDivElement?
【发布时间】:2020-06-28 00:55:42
【问题描述】:

我在父组件中有这个模板:

<template>
    <div>
        <div 
            contenteditable
            ref="editorContainer"
        ><editor-content :container-ref="$refs.editorContainer" /></div>
    </div>
</template>

我在“editor-content”组件中有这个道具声明:

props: {
    //...
    containerRef: {
        type: Object,
    }

},

但我收到此警告:

[Vue 警告]:无效的道具:道具“containerRef”的类型检查失败。 预期对象,得到 HTMLDivElement

作为 prop 传递的 ref 的类型应该是什么?

【问题讨论】:

    标签: vue.js contenteditable


    【解决方案1】:

    要仅允许 &lt;div&gt; 元素,请使用类型 HTMLDivElement

    要允许任何元素,请使用类型HTMLElement

    要允许任何内容,请将 type 设置为 nullundefined(这样 linter 不会发出警告)。

    【讨论】:

    【解决方案2】:

    这是一个使用 TypeScript 和 Nuxt 以及 SSR 的完整示例。
    通过 cmets 添加了更多上下文。

    <script lang="ts">
    import { defineComponent, PropType, toRef, watchPostEffect } from '@nuxtjs/composition-api'
    
    export default defineComponent({
      props: {
        element: {
          // When using Nuxt SSR, use this otherwise you get error
          // This allows any HTMLElement type, if want HTMLDivElement just change it
          type: (process.server ? Object : HTMLElement) as PropType<HTMLElement>,
          // let's make it explicit that it does not exist from the begining
          default: undefined,
        },
      },
      setup(props) {
        // Because it can be undefined, let's use `toRef` instead of `toRefs`
        const element = toRef(props, 'element')
    
        // Optional Effect example
        watchPostEffect((onInvalidate) => {
          // This never happens, on post effect all refs are resolved
          if (!element.value) return
    
          // Your event listener
          const onScroll = (e: Event) => console.log(e)
    
          // Add event listener
          element.value.addEventListener('scroll', onScroll, { passive: true })
    
          // Remove event listener
          onInvalidate(() => element.value.removeEventListener('scroll', onScroll))
        })
      },
    })
    </script>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 2021-11-07
      • 2021-09-04
      • 2018-12-15
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多