We talk about JavaScript. Each month in Warsaw, Poland.
Bluesoft, Warsaw
Tech freak, sci-fi lover, astro maniac.
"Kiedy życie zaskoczy,
pytam co ma dla mnie jeszcze"
DECLARATIVE UI?
IMPERATIVE UI
// EXAMPLE UNDERSCORE TEMPLATE PART I
<div>
<% _.each(categories, function(category) { %>
<div>
<h2><%= category.name %></h2>
<h4><%= category.description %></h4>
<div>
<% _.each(category.events.edges, function(event) { %>
// ...
// EXAMPLE UNDERSCORE TEMPLATE PART II
// ...
<h3><%= event.node.name %></h3>
<div><%= event.node.description %></div>
</div>
<% }) %>
</div>
</div>
<% }) %>
</div>
// MVW EXAMPLE APP
const DATA = {/* WHATEVER source data*/};
const View = Backbone.View.extend({
template: _.template(TEMPLATE),
render: function () {
this.$el.html( this.template(this.model.toJSON()));
return this;
}
});
const view = new View({ model: new Backbone.Model(DATA) });
view.render();
$('#root').html(view.el);
// components.js
class Category extends React.Component {
render() {
return <div>
<h2>{this.props.category.name}</h2>
<h4>{this.props.category.description}</h4>
{this.props.category.events.edges.map(({ node }) =>
<Event key={node.id} event={node} />
)}
</div>;
}
}
class Event extends React.Component {
render() {
return <div>
<h2>{this.props.event.name}</h2>
<h4>{this.props.event.description}</h4>
</div>;
}
}
// App.js
import React from 'react-dom'
import ReactDOM from 'react'
const DATA = {/* WHATEVER source data*/};
class App extends React.Component {
render() {
return <div>
{this.props.data.categories.map(category =>
<Category key={category.id} category={category}/>
)}
</div>;
}
}
ReactDOM.render(
<App data={DATA} />,
document.getElementById('root')
);
import Relay from 'react-relay';
export default class extends Relay.Route {
static queries = {
data: () => Relay.QL`query { app }`
};
static routeName = 'AppRoute';
}
Category = Relay.createContainer(Category, {
fragments: {
category: () => Relay.QL`
fragment on Category {
name
description
events(first: 10) {
edges {
node {
id
${Event.getFragment('event')}
}
}
}
}
`
},
});
Event = Relay.createContainer(Event, {
fragments: {
event: () => Relay.QL`
fragment on Event {
name
description
}`}
});
export default Relay.createContainer(App, {
fragments: {
data: () => Relay.QL`
fragment on App {
id,
categories(names: ["IT", ...]) {
id
${Category.getFragment('category')}
}
}`}
});