【问题标题】:Conditional scoped slot templates in vuevue 中的条件作用域插槽模板
【发布时间】:2019-12-02 07:26:55
【问题描述】:

我不能这样做吗?

<template v-if="options.columns">
  one thing...
</template>
<template v-else slot-scope="scope">
  something else. scope doesn't work here. :(
</template>

当我尝试这样做时,scope 变得未定义。当我删除 v-if,else 并使用 scope 时,它会按预期工作。

【问题讨论】:

  • 您应该检查slot-scope内部范围内是否存在其他条件...
  • 我必须尝试一下,但这听起来有点混乱和hacky?!
  • 为什么不只有两个 v-if ?

标签: javascript vue.js templates


【解决方案1】:

我遇到了完全相同的问题,更糟糕的是,我的失败了——我没有看到任何错误。

解决方案 #1 将 if else 条件移动到 &lt;template&gt; 的内部范围

正如 David Japan 所指出的,您可以检查 slot-scope 内部范围内的 if else 条件:

<template slot-scope="scope">
  <span v-if="options.columns">one thing...</span>
  <span v-else>something else.</span>
</template>

解决方案 #2 使用 v-slot 而不是 slot-scope

<template v-slot="scope" v-if="options.columns">
  one thing...
</template>
<template v-slot="scope" v-else>
  something else.
</template>

但是我不知道为什么v-slot会修复它,我在官方文档和网上都搜索了但没有任何线索。

【讨论】:

    【解决方案2】:

    在 Vue.js 组件中,模板标签不能超过一个。

    为什么不对动态组件使用 'is' 属性?

    <template>
       <div :is='my-component'></div>
    </template>
    

    因此您可以动态加载组件。

    https://vuejs.org/v2/guide/components.html#Dynamic-Components

    【讨论】:

    • 我不想在那里渲染两个不同的组件。我明白了,但我真正想知道的是,为什么与这样的代码配对时范围会变得未定义?
    【解决方案3】:

    解决方案是一种变通方法:

    为每个可能的用例创建 2 个不同的 SFC 并进行条件渲染。

    Vuetify 示例:

    // App.vue
    <div>
      <ListMD v-if="this.$vuetify.breakpoint.name === 'md'" />
      <ListXS v-if="this.$vuetify.breakpoint.name === 'xs'" /> 
    </div>
    

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2018-12-05
      • 2020-05-24
      • 2018-09-22
      • 2021-02-06
      • 2017-08-19
      • 2021-04-04
      • 2018-10-24
      • 2018-05-16
      相关资源
      最近更新 更多