鲁班H5是基于Vue2.0开发的,通过拖拽的形式,生成页面的工具,类似易企秀、百度 H5 等工具
相关地址
核心原理解析
简单的说:借助vue的createElement方法,将json 逐一解析成对应的组件,渲染即可。使用slider插件实现上下或者左右翻页
1. 从 Vue.js 文档中寻求灵感
相信阅读过 Vue JSX 文档 的同学对下面的代码应该不会陌生,可以直接访问 在线Demo
// 以下代码来自:https://cn.vuejs.org/v2/guide/render-function.html#createElement-参数
// @returns {VNode}
createElement(
// {String | Object | Function}
// An HTML tag name, component options, or async
// function resolving to one of these. Required.
'div',
// {Object}
// A data object corresponding to the attributes
// you would use in a template. Optional.
{
// (see details in the next section below)
},
// {String | Array}
// Children VNodes, built using `createElement()`,
// or using strings to get 'text VNodes'. Optional.
[
'Some text comes first.',
createElement('h1', 'A headline'),
createElement(MyComponent, {
props: {
someProp: 'foobar'
}
})
]
)
2. 抽象 Demo
- 移除注释
- 把 createElement(tagName || componentOptions, {data}, children) 对应到上面的代码中,把 children 部分单独抽象成一个数组
- 整理之后的代码如下:
// a component options demo:
const MyComponent = {
props:['someProp'],
render(h) {
return h('span', this.someProp)
},
}
new Vue({
el: '#app',
// 这里的 render(createElement) 我们更常见的写法是:render(h)
// 关于这部分的解释,可以参见: https://segmentfault.com/q/1010000007130348?_ea=17466196
render(createElement) {
const pageJSON = [
'Some text comes first.',
createElement('h1', 'A headline'),
createElement(MyComponent /** component options */, {
props: {
someProp: 'foobar'
}
})
]
return h('div', {}, pageJSON)
}
})
3. 再抽象一步
//
new Vue({
el: '#app',
render(h) {
const pageJSON = [
{component: 'span', text: 'Some text comes first.'},
{component: 'h1', text: 'A headline'},
{component: 'MyComponent', data: {props: {someProp: 'foobar'}} }
]
return h('div', {}, pageJSON.map(ele => {
return h(ele.component, ele.text ? ele.text : ele.data)
}))
}
})
4. 再抽象一步(哎,不对啊,作者,我咋感觉你这一步啥都没做啊😂,你说对了)
//
const PageJSON = [
{component: 'span', text: 'Some text comes first.'},
{component: 'h1', text: 'A headline'},
{component: 'MyComponent', data: {props: {someProp: 'foobar'}} }
]
new Vue({
el: '#app',
render(h) {
return h('div', {}, pageJSON.map(ele => {
return h(ele.component, ele.text ? ele.text : ele.data)
}))
}
})
5. 再抽象一步
const WorkJSON = {
title: '我是作品标题',
description: '我是作品描述',
created_time: '2019-09-01',
updated_time: '2019-09-01',
pages: [
elements: [
{component: 'span', text: 'Some text comes first.'},
{component: 'h1', text: 'A headline'},
{component: 'MyComponent', data: {props: {someProp: 'foobar'}} }
],
],
}
new Vue({
el: '#app',
render(h) {
return h('div', {}, WorkJSON.pages[0].elements.map(ele => {
return h(ele.component, ele.text ? ele.text : ele.data)
}))
}
})
总结
- 相信到最后以这一步大家应该有些头绪了吧(要没有的话 😂😂😂,接着往下看吧)
- 其实鲁班H5的一个作品其实是一个就是一个大JSON(结构和上面的 WorkJSON 几乎一致)
- 这个大JSON 里面包含了很多页面(鲁班源码-Page),每个页面里面包含了很多元素(鲁班源码-Element)
- 最终这个JSON 会传给 render(h) 进行解析渲染
- 到这里,也就能解答这一小节的问题了:
- 鲁班H5 的核心原理是什么??
- 如何将数据转换成手机端网页(所谓H5页面)?
- JSON 转换成 H5??
完结撒花 🎉🎉🎉🎉🎉🎉🎉🎉