我使用了一个my-link组件,根据需要将锚定标签包装在各种物品上.为此,使用了一个定制的render方法——然而createElement方法只能创建HTML node ,创建纯文本 node 似乎是不可能的.

当前情景

Usage of my-link component

<template v-for="item in items">
  <h4>
    <my-link :url="item.url">{{ item.text }}</my-link>
  </h4>
</template>

Implementation of my-link component as Link.vue

<script>
export default {
  name: 'my-link',
  props: { url: String },
  render(createElement) {
    if (this.url) {
      return createElement(
          'a', {
            attrs: { href: this.url }
          }, this.$slots.default
      );
    }

    return createElement(
        'span',
        this.$slots.default
    );
  }
};
</script>

生成的HTML

<h4>
  <a url="/some-link">This item is linked</a>
</h4>
<h4>
  <span>Plain text item</span>
</h4>

预期情景

在这个特定场景中,span标签是多余的,可以避免——但是,我不清楚Vue如何以及是否可以实现这一点.js.一般来说,我想知道如何使用自定义render方法创建纯文本 node .

<h4>
  <a url="/some-link">This item is linked</a>
</h4>
<h4>
  Plain text item
</h4>

旁注:

  • 问题最初是针对VueJS v2提出的.1&amp;v2.2-beta(2017年2月)
  • 重点是适当的语义 node (文本 node 与元素 node )

推荐答案

创建纯文本 node 的Vue exposes an internal method on it's prototype called _v.可以从渲染函数返回调用此方法以渲染纯文本字符串的结果:

render(h){
    return this._v("my string value");
}

以这种方式公开它(前缀为下划线)可能表明它是一种专用API方法,所以请小心使用.

如果使用功能组件,"this"也不可用.在这种情况下,应该调用上下文_v(),例如:

functional: true,
render(h, context){
    return context._v("my string value")
}

这与从窗口中提取文本(如在您的 comments 中,使用有用的getChildrenTextContent)相结合,将产生所需的结果.

Vue.js相关问答推荐

如何使用composition api v-model Select 框获取其他JSON 值?

Vuetify右侧并排switch

vuejs:将props传递给javascript中的组件?

Vue子组件等待props

无法在 Vuex 中的其他操作中反跳操作

VueJS 插件的如何react式绑定?

正确使用 Vue $refs

使用 vuex 更新数据

动态插入字符串上的 Vue 事件处理程序不起作用

Vue:限制文本区域输入中的字符,截断过滤器?

VueJS + VueRouter:有条件地禁用路由

使用 azure devops 发布管道部署 Vue.js 应用程序

Vue-Router 抽象父路由

Vue 和 TypeScript 所需的props

Vue Prop 没有初始化器,也没有在构造函数中明确赋值

从 Axios 响应中解析 XML,推送到 Vue 数据数组

安装后运行computed计算函数

使用 Vue.js & DataTable(jquery 插件)

如何使用vue.js/nuxt.js获取一个目录下的所有图片文件

超过最大调用堆栈大小 Vuetify