A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}It's all JavaScript
var HelloWorldComponent = React.createClass({
render: function() {
return (
React.createElement("div", { className: "some-style" },
React.createElement("p", null, "Hello World");
);
);
}
});ReactDOM.render(
<HelloWorldComponent/>,
document.querySelector('#mountNode');
);But what about state, changes and everything that makes my app dynamic?
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
const element = <Welcome name="Sara" />;
ReactDOM.render(
element,
document.getElementById('root')
);<HelloWorldComponent greeting='Hello World' />
<HelloWorldComponent greeting={'Hello ' + 'World'} />
<HelloWorldComponent greeting={getGreeting()} />class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}class LoggingButton extends React.Component {
// This syntax ensures `this` is bound within handleClick.
// Warning: this is *experimental* syntax.
handleClick = () => {
console.log('this is:', this);
}
render() {
return (
<button onClick={this.handleClick}>
Click me
</button>
);
}
}var HelloWorldComponent = React.createClass({
getInitialState: ...
handleClick: function (event) {
event.preventDefault();
this.setState({
count: this.state.count + 1
});
},
render: ...
});class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
}
componentWillUnmount() {
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}<ChatApp />
<FriendList />
<MessageList />
<Friend />
<Friend />
<Friend />
<Friend />
<Message />
<Message />
<Message />
<MessageInput />
var ChatApp = React.createClass({
...
render: function() {
return (
<div>
<FriendList friends={this.state.friends} />
<MessageList messages={this.state.messages} />
<MessageInput handleInput={this.handleInput} />
</div>
);
}
});var MessageList = React.createClass({
render: function() {
var messages = this.props.messages.map(function(message) {
return (
<Message
content: message.content,
from: message.from
/>
);
});
return <ul>{messages}</ul>;
}
});var Message = React.createClass({
render: function() {
return (
<li>
<span>From: {this.props.from}</span>
<span>Content: {this.props.content}</span>
</li>
);
}
});But where should i put all my state and stuff..?
<ChatApp />
<FriendList />
<MessageList />
<Friend />
<Friend />
<Friend />
<Friend />
<Message />
<Message />
<Message />
<MessageInput />
this.state.friends
this.state.messages
this.handleInput
this.props.friends
this.props.messages
this.props.handleInput
So won't this turn into a mess when my app grows in complexity..?
backbone-react-component
react-backbone
// create component
var MyComponent = React.createClass({
mixins: [Backbone.React.Component.mixin],
render: function () {
return <div>{this.state.model.foo}</div>;
}
});
// create model
var model = new Backbone.Model({foo: 'bar'});
// render component and pass model as prop
React.render(<MyComponent model={model} />, document.body);
// update the UI
model.set('foo', 'Hello world!');ngReact
link: function(scope, elem, attrs) {
//...
scope.$watch(attrs.props, function() {
React.render(<MyComponent scope={scope} />, elem[0]);
}, true);
scope.$on('$destroy', function() {
React.unmountComponentAtNode(elem[0]);
});
}Interacting with the DOM through
var MyComponent = React.createClass({
componentDidMount: function() {
var node = React.findDOMNode(this.refs.myContainer);
var $node = $(node);
// manipulate the node
},
componentDidUpdate: function() {
var node = React.findDOMNode(this.refs.myContainer);
var $node = $(node);
// manipulate the node
},
componentWillUnmount: function() {
// clean up if necessary
},
render: function() {
return <div ref='myContainer'>Hello World</div>;
}
});(ns example
(:require [om.core :as om]
[om.dom :as dom]))
(defn widget [data owner]
(reify
om/IRender
(render [this]
(dom/h1 nil (:text data)))))
(om/root widget {:text "Hello world!"}
{:target (. js/document (getElementById "my-app"))})<Surface>
<Layer>
<Group>
<Text>
<Image>
<ListView>
<div>
<span>
<p>
<ul>
<li>
<table>
vs.
<Image>
<ListView>
<MapView>
<Navigator>
<ScrollView>
<Text>
<TextInput>
<View>
<WebView>
...
<div>
<span>
<p>
<ul>
<li>
<table>
vs.
Pretty much anything!
React Workshop - May 6-7.
Building Isomorphic Apps in JavaScript
Talk - June 19.