vue.js 2模板中输出VNode错在哪了?

模板内容:

<template>
  <div>
    <el-row>
        <h4 class="title-center" style="font-size:13px;">变更内容</h4>
        <table class="oams-table" v-loading="isLoding">
          <tbody>
            <tr v-for="(val,key,index) in alterBase" :key="index">
              <td class="title-center">{{ index+1 }}</td>
              <td>{{ printChangeItem(val.item) }}</td>
              <td class="value-column"><renderVDom :vNode="printAdapterExpr(val.item, val.before, 'before')"></renderVDom></td> 
              <td class="value-column"><renderVDom :vNode="printAdapterExpr(val.item, val.after, 'after')"></renderVDom></td>
            </tr>
          </tbody>
        </table>
    </el-row>
  </div>
</template>

script 内容:

export default {
  name: 'xxxx',
  components: {
    renderVDom: {
      props: {
        vNode: [Array, String, Object, Number] // 这里为什么要这么写其实报一个类型检测不通过我补一个的,一开始我只写了数组和字符串。因为我这里其实不一定是vnode,毕竟直接传字符串和数字也可以,干嘛非得是vnode
      },
      render (h) {
        return h('div', this.vNode)
      }
    }
  },
  props: {},
  methods: {
    printAdapterExpr(key, val, offset){
      return this.$createElement('span', { innerHTML: val })
    }
  }
}

请大佬指点。先谢过了

阅读 1.7k
2 个回答

script修正为:

export default {
  name: 'xxxx',
  components: {
    renderVDom: {
      props: {
        vNode: [Array, String, Object, Number]
      },
      methods:{
        isVNode(arg){
          // 获取 vnode 实例
          let _vnode = this.$createElement('span', '')
          // VNode 构造函数
          let __VNode = _vnode.constructor
          return arg instanceof __VNode
        }
      },
      render (h, context) {
        return this.isVNode(this.vNode) ? this.vNode : h('div', { domProps: { innerHTML: this.vNode } }, [])
      }
    }
  },
  props: {},
  methods: {
    printAdapterExpr(key, val, offset){
      // 若不存在直接输出
      // 1)非VNode
      return val
      // 2)
      //  2.1) JSX 
      // return <span>{val}</span>
      //  2.2) 创建VNode
      // return this.$createElement('span', val)
    }
  }
}

slot 不香吗?

而且你这里不就是 innerHTML 吗?直接 ref 操作 dom 也可以呀

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题