Skip to content

Instantly share code, notes, and snippets.

@LucaColonnello
Created December 2, 2016 09:13
Show Gist options
  • Save LucaColonnello/8cf308286f3968d75da16001cc054b73 to your computer and use it in GitHub Desktop.
Save LucaColonnello/8cf308286f3968d75da16001cc054b73 to your computer and use it in GitHub Desktop.
Example of render engine
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