Table of Contents
From freeCodeCamp.
JSX
const JSX = (
<div className="mainDiv">
<h1>Hello World!</h1>
<p>Some content.</p>
{/* comment */}
</div>
)
ReactDOM.render(JSX, document.getElementById('content'));
Subtle points:
- For multiline JSX you need to use brackets (otherwise JavaScript will add semi-colons).
- There must only be 1 root element.
class
becomesclassName
(since class is a reserved word in JS).- Generally attributes become camelCase (eg,
onclick
becomesonClick
). - All tags are now self closing (eg,
<div/>
) and must be closed (so no<br>
allowed).
Components
Functional Components
This is a function that returns JSX (or null
). Functions must start with capital letters.
const ComponentA = function() {
return <div>Hello</div>;
}
const Welcome = (props) => <p>{props.name} is aged {props.age}</p>
Welcome.defaultProps = { name: "John" }
const JSX = <App><Welcome age={25}></App>
To add type checking to your properties (list of types here):
import React, { PropTypes } from 'react';
Welcome.propTypes = {
age: PropTypes.number.isRequired
}
Class Components
class ComponentB extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<h1>{this.props.title}</h1>
<ComponentA />
</div>
)
}
};
ReactDOM.render(<ComponentB title="Hello"/>, document.getElementById('content'));
With State
In the constructor you need to create a state
property.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'Initial State'
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({
name: "React Rocks!"
})
}
render() {
return (
<div>
<button onClick={this.handleClick}>Click Me</button>
<h1>{this.state.name}</h1>
</div>
);
}
};
setState
calls happen asynchronously, so you can’t rely on this.state
or this.props
. You should instead provide setState
with a function that takes the current state
and props
.
this.setState((state, props) => ({
counter: state.counter + props.increment
}));
class ControlledInput extends React.Component {
constructor(props) {
super(props);
this.state = {
input: ''
};
this.handleChange = this.handleChange.bind(this)
}
handleChange(event) {
const text = event.target.value;
this.setState({
input: text
});
}
render() {
return (
<div>
<input value={this.state.input} onChange={this.handleChange} />
<h4>Controlled Input:</h4>
<p>{this.state.input}</p>
</div>
);
}
};
Why do we need the value={this.state.input}
on the input
?
Misc Notes
const Cell = function(props) {
return (
<td onClick={props.handleClick(props.x, props.y)}>{props.value}</td>
)
}
This won’t work - it will call handleClick
immediately, you need to change it to:
const Cell = function(props) {
return (
<td onClick={() => props.handleClick(props.x, props.y)}>{props.value}</td>
// this bit: #####
)
}
Building a Project
Create React App
Use create-react-app
.
npx create-react-app minesweeper
npm start
npm run build
Just transforming the JSX to JS
Follow the instructions to use babel here.
Misc
Notes Ideas
- Integration with build systems
Project Ideas
- Gym workout tracker
- Add a server side.
- Allow deleting data.
- Allow filtering data.
- Minesweeper
- Spotify Playlist editor
- Graph based to do list (eg, for dependencies)
- Browser based wiki