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. Java文件与IO流

    首先我们要清楚什么是流,正如其名,很形象,流就是像水一样的东西,具有方向性,在java中 ,流大概就是类 接下来,我们要对输入输出流有一个基本认识,什么是输入输出流呢? 输入输出明显需要一个参照,而这 ...

  2. ant design TreeSelect支持搜索,切换value和title属性

    测试人员测试我form里面一个select的时候,发现只能搜索英文和数字,不能搜中文 后来找到原因,treeNodeFilterProp字段默认是velue,我value里面是id,当然搜不到中文啦 ...

  3. Java 中 field 和 variable 区别及相关术语解释(转)

    https://www.jianshu.com/p/08e2d85d3ce9 这是一个以前从没仔细想过的问题--最近在阅读Java Puzzlers,发现其大量使用了"域"这个词, ...

  4. dfs:马踏棋盘

    1 #include<stdio.h> 2 #include<time.h> 3 4 #define X 8 5 #define Y 8 6 7 int chess[X][Y] ...

  5. C语言一辆卡车撞人逃逸。现场三人目击事件,只记下车的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家说:四位的车号正好是一个整数的平方

    #include <stdio.h> #include <math.h> void main() { int a, b, c, d, n, h; double t; for ( ...

  6. java中ArrayList和LinkedList的区别

    Java中ArrayList和LinkedList都是List集合的实现类,它们都可以用来存储一组有序的元素,但是它们的内部实现方式不同,在使用时也有不同的适用场景. ArrayList是一个基于动态 ...

  7. Java核心知识体系7:线程安全性讨论

    Java核心知识体系1:泛型机制详解 Java核心知识体系2:注解机制详解 Java核心知识体系3:异常机制详解 Java核心知识体系4:AOP原理和切面应用 Java核心知识体系5:反射机制详解 J ...

  8. C++20语言核心特性的变化

    using for Enumeration Values   对比一下C++20前后的区别: enum class State { open, progress, done = 9 }; // Bef ...

  9. httpclients 和 okhttp 区别

    HttpClient使用介绍使用HttpClient发送请求主要分为以下几步骤: 创建 CloseableHttpClient对象或CloseableHttpAsyncClient对象,前者同步,后者 ...

  10. 火山引擎DataTester升级MAB功能,助力企业营销决策

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataTester,火山引擎推出的 AB 测试与智能优化平台,近日宣布对其 MAB(Multi-armed Ba ...