Vue:组件/模板作为道具

Posted

技术标签:

【中文标题】Vue:组件/模板作为道具【英文标题】:Vue: Components/templates as props 【发布时间】:2018-09-23 01:28:54 【问题描述】:

我目前正在努力学习 vue 并在整个组件概念上苦苦挣扎。

假设我有一些定义选项卡的组件(如浏览器选项卡)。

这个组件有一个叫做name的prop。

所以你可能会像这样使用组件:

<tab :name="tab.display_name"></tab>

但是,可以说事情需要更复杂一些。例如,您不仅希望名称是字符串,还希望是常规 html。好的,所以,你可以在 v-html 指令中使用 prop 并像这样使用 tab 组件:

<tab :name="'<span class=\'fancy-styling\'>' + tab.display_name + '</span>'"></tab>

由于所有引用,我花了一段时间才弄清楚。有没有办法逃离这个逃生地狱(双关语完全是故意的)?

我怎样才能把它放到它自己的 sn-p/模板中?

如果我们让它变得更复杂——比如说我们要求 prop 是一个 vue 组件呢?

<tab :name="'<my-custom-component @click="onClick()">' + tab.display_name + '</my-custom-component>'"></tab>

最后一个在多个级别上是无效的,其中最重要的是引用的混乱。

我将如何做到这一点?最好的方法是什么?

【问题讨论】:

&lt;tab :name=`&lt;span class="fancy-styling"&gt;$tab.display_name&lt;/span&gt;`&gt;&lt;/tab&gt; 使用为解决转义和连接地狱而创建的 ES6 模板文字。 我一般使用 webpack 和 es6(不确定是哪个预设),编译失败。但是以下方法有效:&lt;tab :name="`&lt;span class='fancy-styling'&gt;$tab.display_name&lt;/span&gt;`"&gt;&lt;/tab&gt; 所以我不会说这是逃避任何地狱,只是延迟了问题。 是的,不小心把外引号去掉了。 【参考方案1】:

如果您尝试在 props 中注入 html,那么您应该考虑使用插槽。

https://vuejs.org/v2/guide/components-slots.html

【讨论】:

【参考方案2】:

使用组件的全部意义在于创建关注点分离。在一行中定义所有分层组件完全违背了这个目的。创建三个单独的组件。像这样的一个容器组件。

index.vue

<template>
    <tab :name="mycoolname"></tab>
</template>
<script>
    import tab from tab.vue
    export default 
        components: 
            tab
        
</script>

您可以使用 name 在该模板中使用的名称道具。比在选项卡组件中,像这样:

tab.vue

<template>
    <h1>name</h1>
    <my-custom-component @click="doStuff()"></my-custom-component>
</template>
<script>
    import my-custom-component from my-custom-component.vue
    export default 
        props: [
            'name'
        ],
        components: 
            my-custom-component
        ,
        methods: 
            doStuff () 
                console.log('hooray this totally works')
            
</script>

我在这里使用单独的构建文件,但是当您将 vue 导入项目时,概念保持不变。组件可以包含所有内容,从内部带有 &lt;p&gt; 的简单 div 到整页。这个组件系统非常强大,可以让事情井井有条。

如果没有 webpack,它看起来像这样:

var myCustomComponent =  
    template: `fancyHTML`


var Tab= 
    components: 
        'my-custom-component': myCustomComponent 
    ,
    template: `even more fancy html containing <my-custom-component>`

new Vue(
   el: '#app'
   components: 
      'tab': Tab
    
)


【讨论】:

如果内容不同怎么办?例如。您有多个选项卡,有时选项卡应显示您的自定义组件,有时应显示自定义 html,有时只是一个简单的名称? 取决于您需要的灵活性。如果只有这么多选项,您可以通过为某个选项卡创建组件并使用 v-if 或 v-for 的某种组合来做一些事情。如果您想保持充分的灵活性或通过 props 注入 html,请按照 @zom 的建议使用插槽。

以上是关于Vue:组件/模板作为道具的主要内容,如果未能解决你的问题,请参考以下文章

VUE/NUXT:将随机数作为道具传递给子组件

Vue js 子组件中未定义的道具。但仅在其脚本中

如何将 ref 作为道具传递:[Vue 警告]:无效的道具:道具“containerRef”的类型检查失败。预期对象,得到 HTMLDivElement?

Vue - 使用道具向组件添加类名

在 GraphQL 查询模板中使用 React 道具(字符串)

vue 包装另一个组件,传递道具和事件