如何在混合 VueJS 应用程序上使用(命名)插槽

Posted

技术标签:

【中文标题】如何在混合 VueJS 应用程序上使用(命名)插槽【英文标题】:How to use (named) slots on hybrid VueJS app 【发布时间】:2019-11-12 06:03:46 【问题描述】:

我正在尝试创建一个混合 web 应用程序(Laravel + VueJs),我在其中使用 Laravel 作为后端(路由等)并为它们使用动态 VueJS 组件。

我想使用 (named) slots 将我的刀片模板中的内容传递到 VueJs 组件中。

当我加载页面时,我在插槽中短暂地看到了我的内容,但仅仅几毫秒后,它就被空白了。

这是我的代码

ma​​in.js

require('./bootstrap');

window.Vue = require('vue');

import Vuetify from 'vuetify'
import App from './components/App';

Vue.use(Vuetify);

const app = new Vue(
    el: '#app',
    render: h => h(App),
);

主刀片文件

<div id="app">
  This is content
</div>

App.vue

<template>
    <slot></slot>
</template>

<script>
    export default 
        name: 'App',
        mounted() 
            console.log('Component mounted.')
        
    
</script>

我在这里错过了什么? 就像它立即覆盖插槽内容(将其删除)

PS:我使用的是 VueJs 2.6

【问题讨论】:

【参考方案1】:

我认为您需要在使用render 属性创建组件时传递槽值。相反,模板语法可能更容易在您的用例中使用。

从您的 Vue 对象中删除 render 属性并使用类似的东西注册您的应用组件

Vue.component('app', require('./components/App.vue').default);

那么你的刀片模板可以包含以下内容:

<div id="app">
  <app>This is content</app>
</div>

您看到内容然后消失的原因是您的 html 内容被渲染,然后被具有空槽的 Vue 模板替换。您可以通过向 Vue 模板添加更多内容来测试它,并查看它是否被渲染。如果是这样,则意味着插槽值未正确传递。

【讨论】:

这非常有效。我试图避免使用 &lt;app&gt;&lt;/app&gt; 元素。但显然这不能完成......现在我需要测试我是否可以轻松地在组件中使用组件:-) 再次感谢【参考方案2】:

渲染应用时需要传递初始内容:

render(h) 
   return h(App, null, [this.$el.innerHTML])

在此处查看h (createElement) 描述: https://vuejs.org/v2/guide/render-function.html#createElement-Arguments

但这只是将内容放入您的 App 组件中,我认为它无论如何都不会是反应式的。可能会尝试检查 X-template 功能以实现刀片和 vue 混合:

https://vuejs.org/v2/guide/components-edge-cases.html#X-Templates

【讨论】:

以上是关于如何在混合 VueJS 应用程序上使用(命名)插槽的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VueJS 中将模板(插槽)从祖父组件传递给孙子?

VueJS - 将插槽和作用域插槽向下传递给子模板中的组件

如何封装/包装一个 VueJS 组件?

如何为带有插槽的 vuejs 配置 facebook 插件

Vue.js 错误:命名插槽必须在自定义元素上使用 '<template>'

故事书代码预览不显示 VueJS 中插槽的使用情况