javascript - 使用 v-slot (scoped-slot) 时访问 this.$slots

标签 javascript vue.js vuejs2 vue-component

在特定用例中,我必须访问插槽内的 DOM 元素才能获取其渲染的宽度高度。对于普通插槽,可以通过访问 this.$slots.default[0].elm 来实现。

现在我添加了一个作用域插槽来访问组件内的数据,这导致 this.$slots 为空并破坏了我的代码。

如何访问使用槽位范围的槽位的 DOM 元素?

基本示例代码(请注意,使用作用域插槽时,this.$slots 会生成 {};使用普通插槽时,会生成 {默认:数组(1)}):

App.vue:

<template>
  <div id="app">
    <HelloWorld v-slot="{ someBool }">
      <p>{{ someBool }}</p>
      <h1>Hello</h1>
    </HelloWorld>
    <HelloWorld>
      <h1>Hello</h1>
    </HelloWorld>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue';

export default {
  name: 'App',
  components: {
    HelloWorld,
  },
};
</script>

HelloWorld.vue:

<template>
  <div class="hello">
    <slot :someBool="someBool" />
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      someBool: false,
    };
  },
  mounted() {
    console.log(this.$slots);
  },
};
</script>

最佳答案

使用$scopedSlots ,其中包括作用域插槽和非作用域插槽:

export default {
  mounted() {
    console.log(this.$scopedSlots.default())
  }
}

demo

关于javascript - 使用 v-slot (scoped-slot) 时访问 this.$slots,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62716321/

相关文章:

vue.js - 在 vuetify 中,不显示 radio

javascript - Vuex 不更新使用 mapState 映射的计算变量

javascript - 如何在新的vue自定义元素中正确注册和使用props?

cordova - 在不使用模板或框架的情况下使用 Phonegap 设置 Vue.js

javascript - 如何溢出文本而不是在元素中换行?

php - 如何在 php/javascript 中打印输出时隐藏可见的超链接

javascript - 这是检查 javascript 中未定义值的好方法吗?

javascript - Webpack copyFiles将文件从子目录复制到主目录

vue.js - vue中如何将props从父类传递给孙子类

javascript - 如何基于当前路由/URL 构建动态面包屑组件?