Vue 3 在 <slot> 中传递数据

Vue 3 pass data in <slot>

我想要达到的目标:
在 Post.vue 中显示来自动态 link 的图像,它遵循 PostLayout.vue 的布局

在PostLayout.vue中,我有一个名为postFeaturedImage的,在slot里面,有一个

,我想用图片作为它的背景。

我正在使用的是: Laravel、InertiaJS、Vue 3

我的代码是:

Post.vue:

<template>
    <PostLayout>
        <template #postfeaturedImage>
            <!-- Here I want to display the image -->
        </template>
    </PostLayout>
</template>

<script>
import PostLayout from '@/Layouts/PostLayout'

export default {
    data() {
        return {
            featured_image: ''
        }
    },
    components: {
        PostLayout,
    },
    props: {
        post: Object /* Passed the prop from Controller */
    },
    mounted () {
        this.featured_image = this.post.featured_image
    }
}
</script>

PostLayout.vue:

<template>
    <slot name="postfeaturedImage" :bgImage="bgImage">
        <div :style="`background-image:url(${bgImage}); height: 75vh;`"></div>
    </slot>
    
</template>

<script>
    export default {
        
    }
</script>


我删除了所有不相关的代码。我是 Vue 3 和 Inertia 的初学者,需要帮助!

为您的 PostLayout.vue

添加道具
<script>
export default {
  props: {
    bgImage: { type: String },
  },
};
</script>

并在 Post.vue

中为该道具赋值
<template>
    <PostLayout :bgImage="featured_image"> </PostLayout>
</template>

如果您想要 post 没有图像和不同的布局,您应该这样做:

<template>
    <PostLayout>
      <template #postfeaturedImage> post without background image</template>
    </PostLayout>
</template>

另一种方法是创建 FeaturedImage 组件。此外,您可以直接从收到的道具中引用 post 图片。在这种情况下,不需要 data 方法和 mounted

<template>
   <PostLayout>
      <template #postfeaturedImage>
         <FeaturedImage :src="post.featured_image" />
      </template>
   </PostLayout>
</template>

<script>
import PostLayout from '@/Layouts/PostLayout'
import FeaturedImage from '@/Layouts/FeaturedImage'

export default {
   components: {
      PostLayout,
      FeaturedImage
   },
   props: {
      post: Object
   }
}
</script>