我们知道在Vue中通过render函数可以自定义渲染,可以通过createElement创建VNode(Vue2.x开始支持了JSX生成VNode)。下面是通过createElement和JSX创建的一个例子:
习惯了使用XML方式画UI,显然通过createElement创建的方式没有JSX来的直观。Vue也有介绍JSX在Vue和React里的区别(事实上,vue通过babel-plugin-transform-vue-jsx实现了将JSX转化为VNode)。常规组件(即标准的HTML标签)和React差不多,自定义组件可以通过导入组件然后使用的方式来创建:
那么对于全局安装的组件,如何在JSX中使用呢?值得注意的是,使用createElement来创建VNode却可以直接使用全局组件,JSX中却不行。下面是_createElement
的实现
可以看出通过createElement可以使用全局组件原因在于这个函数有携带上下文环境context,继续查找resolveAsset
函数,如下:
可以看出,它会在vm.$options.components
里查找,不管传入的是驼峰命名也好,帕斯卡命名也好都会尝试进行查找,最后找不到才去原型链上查找。因此,想要在JSX中使用全局安装的自定义组件,可以按如下方式使用:
注意: with不能在严格模式(strict)下使用