this.$createElement

vue2 动态组件加载,this.$createElement非常好使!比如:

import { Component as tsc } from 'vue-tsx-support';
import { Component,Prop } from 'vue-property-decorator';
const chartPanel = ()=>import('line-chart')
@Component
export default class Demo extends tsc<{}> {
    @Prop({ required: true, type: Object }) readonly panel;
    chartData
    render(){
        return this.$createElement(chartPanel, {
            props: {
                panelModel: this.panel,
                chartData: Object.freeze(this.chartData),
            },
        });
    }
}

了解vue.$createElement

// @returns {VNode}
createElement(
  // {String | Object | Function}
  // 一个 HTML 标签名、组件选项对象,或者
  // resolve 了上述任何一种的一个 async 函数。必填项。
  'div',
 
  // {Object}
  // 一个与模板中属性对应的数据对象。可选。
  {
    // (详情见下一节)
  },
 
  // {String | Array}
  // 子级虚拟节点 (VNodes),由 `createElement()` 构建而成,
  // 也可以使用字符串来生成“文本虚拟节点”。可选。
  [
    '先写一些文字',
    createElement('h1', '一则头条'),
    createElement(MyComponent, {
      props: {
        someProp: 'foobar'
      }
    })
  ]
)

更多推荐阅读:vue.$createElement的使用实例 https://juejin.cn/post/6969505687114088484

那么vue3 怎么弄呢?

看下官方文档:https://vuejs.org/guide/extras/render-function.html#basic-usage

import { defineComponent, h } from 'vue';

import Panel from '@/plugins/charts/pie-charts/components/chart-panel';
export default defineComponent({
  name: 'ChartWrap',
  setup() {
    const vnode = h(Panel, { m: 222 });
    return () => (
      <div>
        <div>title</div>
        {vnode}
      </div>
    );
  },
});

但是,如果是异步组件

const asyncPage = () => import('./Lazy.vue')

this.$createElement还是没有问题的,但是vue3,这个没有法子,但是vue3 有defineAsyncComponent 方案,具体查看下一章:vue2升级vue3:异步组件defineAsyncComponent

异步组件导出:

import pieChartJson from './pie-charts/plugin.json';
import pieChartLogo from './pie-charts/img/logo.svg';
import pieChart from './pie-charts/index';
export const ChartSourceBuildIn = {
  [pieChartJson.type]: pieChart,
};
export const ChartSourceImgBuildIn = {
  [pieChartJson.type]: pieChartLogo,
};

加载异步组件:

import { defineComponent, h } from 'vue';
import { ChartSourceBuildIn } from '@/plugins/charts/index';
export default defineComponent({
  name: 'ChartWrap',
  setup() {
    const chart = ChartSourceBuildIn['pie-charts'];
    const { ChartPanel } = chart;
    const vnode = h(ChartPanel, { m: 222 });
    return {
      vnode,
    };
  },
  render() {
    return (
      <div>
        <div>title</div>
        {this.vnode}
      </div>
    );
  }, });

这个和vue2的方案基本保持一致

转载本站文章《vue2升级vue3:this.$createElement is not a function—动态组件升级》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/vue3/8850.html

vue2升级vue3:this.$createElement is not a function—动态组件升级的更多相关文章

  1. uniapp项目vue2升级vue3简单记录

    看到好多开源项目都升级了vue3,看文章说vue3性能升级很多,而且组合式api很香,遂把最近开发的自助洗车app升级下,在此记录下出现的问题. uniapp升级vue3官方指南 我是先去vue官网看 ...

  2. vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9

    项目从vue2 升级vue3,VueI18n需要做适当的调整.主要是Vue I18n v8.x 到Vue I18n v9 or later 的变化,其中初始化: 具体可以参看:https://vue- ...

  3. vue2升级vue3指南(二)—— 语法warning&error篇

    本文总结了vue2升级vue3可能会遇到的语法警告和错误,如果想知道怎样升级,可以查看我的上一篇文章:vue2升级vue3指南(一)-- 环境准备和构建篇 Warning 1.deep /deep/和 ...

  4. vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件

    如果你的vue2代码之前是使用vue-class-component 类组件模式写的.选择可以使用 https://github.com/facing-dev/vue-facing-decorator ...

  5. vue2升级vue3:vue-i18n国际化异步按需加载

    vue2异步加载之前说过,vue3还是之前的方法,只是把 i18n.setLocaleMessage改为i18n.global.setLocaleMessage 但是本文还是详细说一遍: 为什么需要异 ...

  6. Vue2 到 Vue3,重温这 5 个常用的 API

    距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等.虽然目前大多数开发者们在使用的仍旧以Vue2为准,但Vue3显然是Vue开发者们未来必须面对的,而且前不久V ...

  7. Vue2和Vue3技术整理1 - 入门篇 - 更新完毕

    Vue2 0.前言 首先说明:要直接上手简单得很,看官网熟悉大概有哪些东西.怎么用的,然后简单练一下就可以做出程序来了,最多两天,无论Vue2还是Vue3,就都完全可以了,Vue3就是比Vue2多了一 ...

  8. Vue2和Vue3技术整理3 - 高级篇

    3.高级篇 前言 基础篇链接:https://www.cnblogs.com/xiegongzi/p/15782921.html 组件化开发篇链接:https://www.cnblogs.com/xi ...

  9. vue2和vue3生命周期的区别

    概念 首先,我们了解一下"生命周期"这个词.通俗的来说,生命周期就是一个事务从出生到消失的过程.例如,一个人从出生到去世.在vue中,vue的生命周期是指,从创建vue对象到销毁v ...

  10. 盘点Vue2和Vue3的10种组件通信方式(值得收藏)

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异:本文将通过选项式API 组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式.其中将要实现的通信 ...

随机推荐

  1. umich cv-6-1 循环神经网络基本知识

    这节课中介绍了循环神经网络的第一部分,主要介绍了循环神经网络的基本概念,vanilla循环网络架构,RNN的一些应用,vanilla架构的问题,更先进的rnn架构比如GRU和LSTM 循环神经网络基本 ...

  2. 【本博客所有关于git文章迭代汇总】git操作(暂存,回退,绑定远程等),看这一篇就够了

    1.git常用操作 git 小白操作,无非是clone,然后拉取,提交分支,第一次clone的时候,关联远程分支可能会遇到问题,可以看第四条git关联远程分支 # 在当前目录新建一个Git代码库 $ ...

  3. YCSB对MongoDB数据库性能测试

    一.安装部署 1.1前置条件 Install Java and Maven Go to http://www.oracle.com/technetwork/java/javase/downloads/ ...

  4. 一篇文章玩透awk

    安装新版本gawk awk有很多种版本,例如nawk.gawk.gawk是GNU awk,它的功能很丰富. 本教程采用的是gawk 4.2.0版本,4.2.0版本的gawk是一个比较大的改版,新支持的 ...

  5. SVN分支与合并透析

    做法: 1.拉分支开发代码 2.开发完成后要和到主干去发布,这时候先把主干合并到分支,解决冲突 3.运行分支系统,看是否正确 4.再把该分支合并到主干 要知道分支分出去时的版本号,cmd打开命令行,使 ...

  6. C语言从键盘上输入一个梯形的上底a、下底b和高h,输出梯形的面积。

    #include<stdio.h> int main() { double a, b, h, s;//定义变量,上底,下底,高,面积 scanf_s("%lf,%lf,%lf&q ...

  7. Opencv实例练习

    实例所用的函数可在另一篇文章查询:  https://www.cnblogs.com/Zhouce/p/17867164.html 1.图像读取 1 import cv2 # 引入opencv库 2 ...

  8. AtCoder_abc331

    AtCoder_abc331 (这次题真的真的真的好难) 比赛链接 A - Tomorrow 题目链接 题目大意 有一个\(M\)个月,\(D\)天的日历,请输出\(y年m月z日\)的下一天. 解题思 ...

  9. echarts设置多条折线不是你想的那样简单

    简单的多条折线图 小伙伴写过多条折线图的都知道, 常见的折线图是 xAxis 配置项下的 data属性上设置时间或者日期. series配置项下是对应的 legend中的数据以及该条折线的数据. &l ...

  10. 解决OpenCV3+VS2015(VS2017)运行时出现debug error abort()has been called的问题

    问题描述: 在windows平台上安装opencv后,测试一张图片时,出现了debug error abort()has been called的问题 环境: vs2015 windows 10 op ...