javascript - 如何在创建组件之前更改 VueJS 的 <slot> 内容

标签 javascript vue.js vuejs2

我有一个 VueJS 组件,

comp.vue:

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

<script>
  export default {
    data () {
      return {

      }
    },
  }
</script>

我称这个 Vue 组件就像任何其他组件一样:

...
<comp>as a title</comp>
<comp>as a paragraph</comp>
...

我想在渲染之前更改 comp.vue 的插槽,这样如果插槽包含单词“title”,那么插槽将包含在 <h1> 中。 , 导致

<h1>as a title</h1>

如果插槽包含“段落”,则插槽将包含在 <p> 中, 导致

<p>as a paragraph</p>

如何在渲染之前更改组件插槽内容?

最佳答案

如果您使用字符串 prop 而不是插槽,这会更容易实现,但是如果内容很长,那么在模板中使用该组件可能会变得困惑。

如果您手动编写渲染函数,那么您可以更好地控制组件的渲染方式:

export default {
  render(h) {
    const slot = this.$slots.default[0]

    return /title/i.test(slot.text)
      ? h('h1', [slot])
      : /paragraph/i.test(slot.text)
        ? h('p', [slot])
        : slot
  }
}

上述渲染函数仅在默认插槽只有一个文本子项的情况下有效(我不知道您的要求超出了问题中提出的范围)。

关于javascript - 如何在创建组件之前更改 VueJS 的 <slot> 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52360350/

相关文章:

javascript - Css 过渡不适用于正文溢出中的可滚动 div :hidden

javascript - 在 Vue 动态添加的组件中添加和删除元素的问题

vue.js - 在另一个组件中动态渲染 Vue 组件

websocket - 在vuejs中按下按钮后如何打开Web套接字?

javascript - winston 记录器未序列化 mongodb.ObjectID

javascript - IE 9.0 中的卸载问题

javascript - 在更改时替换变量字符串

javascript - 我想将对象插入 Vue.js 中的对象数组中

javascript - 如何让子组件使用多个值更新父数据

javascript - 移动数组项时,嵌入式 Youtube 视频在组件内部重新加载,使用 v-for 渲染