提到JSX
,不可避免的就要提到createElement
,当你看完本节,你会发现,奇怪的知识又增多了。ok,咱们接着上一部分继续讲。这一次的准备工做是了解createElement。前端
Vue
编译后的代码看createElement
你是否看过写的Vue
代码通过编译以后的样子,好比下面这段代码面试
<template> <div>我喜欢<span class="emphasize">前端</span></div> </template>
小编对这段代码进行编译以后,获得下面这段代码element-ui
function () { var e = this, // e._self._c 对应源码里面的createElement t = e._self._c; // 返回了一个 createElement('div',[]) return t("div", [ // e._v 对应源码里面的createTextVNode e._v("my"), t("span", { staticClass: "emphasize" }, [e._v("前端")]), ]); }
经过对上面的代码进行分析,不难发现,Vue
数组
createElement
不管是Vue
仍是React
,都存在createElement
,并且做用基本一致。可能你对createElement
不是很了解,函数名翻译过来就是增长一个元素,但他的返回值你必定知道。createElement
函数返回的值称之为虚拟节点,即VNode
,而由VNode
扎堆组成的树即是大名鼎鼎,面试必问的虚拟DOM
。异步
createElement
函数的参数,在这里小编偷个懒抄一下Vue
官方文档async
// @returns {VNode} createElement( // {String | Object | Function} // 一个 HTML 标签名、组件选项对象,或者 // resolve 了上述任何一种的一个 async 函数。必填项。 'div', // {Object} // 一个与模板中 attribute 对应的数据对象。可选。 { // (详情见下一节) }, // {String | Array} // 子级虚拟节点 (VNodes),由 `createElement()` 构建而成, // 也可使用字符串来生成“文本虚拟节点”。可选。 [ '先写一些文字', createElement('h1', '一则头条'), createElement(MyComponent, { props: { someProp: 'foobar' } }) ] )
从上面能够看出createElement
一共有三个参数,三个参数分别是函数
第一个参数是须要渲染的组件,能够是组件的标签,好比div
;或者是一个组件对象,也就是你每天写的export default {}
;亦或者能够是一个异步函数。学习
第二个参数是这个组件的属性,是一个对象,若是组件没有参数,能够传null(关于组件的属性,下文将依次介绍)ui
第三个参数是这个组件的子组件,能够是一个字符串(textContent)或者一个由VNodes组成的数组this
createElement
写一个组件吧假设咱们须要开发一个下面这样的表格(element-ui的)
若是咱们用模板代码去开发这个表单,那么代码大概就长这样
<el-form :inline="true" :model="formInline" class="demo-form-inline"> <el-form-item label="审批人"> <el-input v-model="formInline.user" placeholder="审批人"></el-input> </el-form-item> <el-form-item label="活动区域"> <el-select v-model="formInline.region" placeholder="活动区域"> <el-option label="区域一" value="shanghai"></el-option> <el-option label="区域二" value="beijing"></el-option> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit">查询</el-button> </el-form-item> </el-form>
createElement
去实现若是咱们直接将上面的代码转换为用createElement
去实现,那么代码将会是这样的
export default { methods: { $_handleChangeUser(value) { this.formInline.user = value } }, render(createElement) { return createElement( 'ElForm', { props: { inline: true, model: this.formInline }, staticClass: 'demo-form-inline' }, [ createElement( 'ElFormItem', { props: { label: '审批人' } }, [ createElement('ElInput', { props: { value: this.formInline.user }, attrs: { placeholder: '审批人' }, on: { input: this.$_handleChangeUser } }) ] ), createElement( 'ElFormItem', { props: { label: '活动区域' } }, [ createElement( 'ElSelect', { props: { value: this.formInline.region, placeholder: '活动区域' } }, [ createElement('ElOption', { props: { label: '区域一', value: 'shanghai' } }), createElement('ElOption', { props: { label: '区域二', value: 'beijing' } }) ] ) ] ), createElement('ElFormItem', null, [ createElement( 'ElButton', { props: { type: 'primary' }, on: { click: this.$_handleSubmit } }, '查询' ) ]) ] ) } }
看到上面的代码,你可能会惊呼,代码好多啊,好痛苦,想当年发明JSX
的人刚开始每天也是写createElement
,写的直掉头发,太痛苦了,而后就使劲挠头,当额头锃光发亮的时候,终于想到了一种新的语法,就是JSX。今后以后,头发呼呼的又长回来了。
看到上面代码,你会发现有一个render
函数,这个函数叫作渲染函数,至关于经过createElement
或JSX
去实现功能的主入口方法。并且你熟悉的v-model
也没见了,而是用value
+ input
代替了。
ok,这一部分先写到这里,下一篇文章写下一部分:是时候使用JSX
代替createElement
了。喜欢的朋友能够继续看哦,我更新很是快哦。也会一直出优秀的文章给你们分享。