在 vue3 中是不是可以访问子组件槽中的根 DOM 元素?我正在尝试在 vue3 中使用第 3 方库(sortablejs)

Posted

技术标签:

【中文标题】在 vue3 中是不是可以访问子组件槽中的根 DOM 元素?我正在尝试在 vue3 中使用第 3 方库(sortablejs)【英文标题】:Is it possible in vue3 to access the root DOM element in a child component slot? I am trying to use a 3rd party library (sortablejs) in vue3在 vue3 中是否可以访问子组件槽中的根 DOM 元素?我正在尝试在 vue3 中使用第 3 方库(sortablejs) 【发布时间】:2021-11-02 20:04:14 【问题描述】:

在 vue2 中我可以使用 this.$el

export default  
render() 
return this.$slots.default[0]
,
mounted() 
Sortable.create(this.$el, );
)

如果在 vue3 中我尝试使用 this.$slots.default()[0] 我看不到如何定位元素。 如果我使用模板引用,我可以获得 div,但不能获得包含的插槽。

我找到的最接近的问题/答案在这里Vue 3 Composition API - How to get the component element ($el) on which component is mounted

但这似乎也给出了 div,而不是插槽 $el。

这在 vue2 中非常强大,因为 sortable 可以在插槽中传递一个 ul 或一个 div 或另一个构造的可排序 vue 组件,并且无需在子组件中定义元素即可工作,我无法工作了解如何在 vue3 中复制它。

我最初是在 Adam Wathan 的屏幕截图中看到的:“使用 Vue.js 构建可排序组件”,但这是 vue2。

【问题讨论】:

【参考方案1】:

我想出了以下(也许有更好的)

使用模板参考:

<template>
    <div ref="root">
        <slot></slot>
    </div>
</template>

然后在脚本中:

import  ref, onMounted  from 'vue'
export default 
   setup() 
      const root = ref(null)

      onMounted(() => 
        // the DOM element will be assigned to the ref after initial render
        // console.log(root.value.children[0]) // this is your $el
        let el = root.value.children[0]
        Sortable.create(el, )
      )

      return 
        root
      
   

【讨论】:

以上是关于在 vue3 中是不是可以访问子组件槽中的根 DOM 元素?我正在尝试在 vue3 中使用第 3 方库(sortablejs)的主要内容,如果未能解决你的问题,请参考以下文章

Vue3 属性透传 $attrs 与 插槽透传 $slots

[转]VUE3中的Provide / Inject用法

Vue3子组件向父组件返回数据

Vue3子组件传递数据$on不是函数[重复]

VUe3组件传值

vue $attrs、$listeners使用