Created
December 2, 2016 09:13
-
-
Save LucaColonnello/8cf308286f3968d75da16001cc054b73 to your computer and use it in GitHub Desktop.
Example of render engine
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const componentMap = { | |
TemplateX: ({ children }) => (<div>{children}</div>), | |
Header: ({ text }) => (<h1>{text}</h1>), | |
HeroBanner: ({ imgUrl, text }) => ( | |
<section style={{ backgroundImage: `url(${imageUrl}) center center` }}> | |
<h2>{text}</h2> | |
</section> | |
), | |
Markdown: ({ content }) => (<ReactMarkdown content={content} />), | |
Carousel: ({ children }) => (<ReactSlick>{children}</ReactSlick>) | |
}; | |
const page = { | |
type: 'TemplateX', | |
props: { | |
}, | |
children: [ | |
{ | |
type: 'Header', | |
props: { | |
}, | |
children: [ | |
] | |
}, | |
{ | |
type: 'HeroBanner', | |
props: { | |
}, | |
children: [ | |
] | |
} | |
{ | |
type: 'Carousel', | |
props: { | |
}, | |
children: [ | |
] | |
} | |
] | |
}; | |
function createRenderEngine(createElement, types, ...modifiersParameters) { | |
const render = (component, modifiers = []) => { | |
const modifiedComponent = (!!modifiers.length && modifiers.reduce( | |
(comp, modify) => modify(comp, ...modifiersParameters), component | |
)) || component; | |
return createElement( | |
types[modifiedComponent.type], | |
modifiedComponent.props || null, | |
...(modifiedComponent.children || []).map(comp => render(comp, modifiers)) | |
); | |
}; | |
return render; | |
} | |
const renderEngine = createRenderEngine(React.createElement, componentMap); | |
ReactDOM.render(renderEngine(page), document.getElementById('main')); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment