我很难想出如何让以下各项发挥作用:

我的父模板

<comp>
  <a href="#" slot="links">link 1</a>
  <a href="#" slot="links">link 2</a>
</comp>

我的component comp模板如下所示:

<ul class="comp">
  <li class="comp-item"><slot name="links"></slot></li>
</ul>

目前,我所有的锚都指向单个li标签(这是预期的)

<ul class="comp">
  <li class="comp-item"><a href="#" slot="links">link 1</a></li>
  <li class="comp-item"><a href="#" slot="links">link 2</a></li>
</ul>

有没有办法不使用作用域插槽就实现我需要的功能?因为我的内容是纯HTML的,所以我觉得没有必要把静态内容放在prop中来呈现它们.

据我所见,大多数vue UI框架都要求您为列表项使用另一个自定义组件,我觉得这个问题解决得太多了.还有别的办法吗?

推荐答案

这可以通过渲染功能轻松实现.

Vue.component("comp", {
  render(h){
    let links = this.$slots.links.map(l => h('li', {class: "comp-item"}, [l]))
    return h('ul', {class: 'comp'}, links)
  }
})

下面是一个有效的例子.

console.clear()

Vue.component("comp", {
  render(h){
    let links = this.$slots.links.map(l => h('li', {class: "comp-item"}, [l]))
    return h('ul', {class: 'comp'}, links)
  }
})

new Vue({
  el: "#app"
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<div id="app">
  <comp>
    <a href="#" slot="links">link 1</a>
    <a href="#" slot="links">link 2</a>
  </comp>
</div>

或者,借助一个用于渲染VNode的小实用程序组件,您可以使用一个模板像这样进行渲染.

Vue.component("vnode", {
  functional: true,
  render(h, context){
    return context.props.node
  }
})

Vue.component("comp", {
  template: `
    <ul class="comp">
      <li class="comp-item" v-for="link in $slots.links"><vnode :node="link" /></li>
    </ul>
  `
})

new Vue({
  el: "#app"
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<div id="app">
  <comp>
    <a href="#" slot="links">link 1</a>
    <a href="#" slot="links">link 2</a>
  </comp>
</div>

Vue.js相关问答推荐

Pinia+Vue 3状态react 性-StoreToRef的替代方案

使用项目和字段,列跨度为 2 的 Bootstrap-vue 表

Nuxt3 / Vue3 - 当属性更改时如何动态更改渲染组件?

v-model 修饰符返回空

是否可以将 nuxt3 与类星体框架一起使用

两个div元素之间的vue2过渡

Vue:将点击事件绑定到动态插入的内容

在 Vuex 的状态下动态创建一个响应式数组

在 vue 3 中使用 vue-chartjs:createElement 不是函数

在组件的样式部分使用 Vue 变量

如何有条件地更改 vue/vuetify 文本字段 colored颜色

如何在 vue 3 脚本设置中的组件上使用 v-model

如何在 Vue.js 中传递 $router.push 中的数据?

我可以修改 Vue.js VNodes 吗?

删除一行后刷新 Bootstrap-Vue 表

如何在 Vuex 中获取 Vue 路由参数?

如何在 VueJS 中下载本地存储的文件

使用 Vue 的点击编辑文本字段

如何在 Vue.js 中延迟 @keyup 处理程序

如何访问通用 javascript 模块中的当前路由元字段