https://davidmarsland.github.io/react-spike/
Core Audience: Experienced JavaScript developers interested in bringing structure to their rapidly growing web applications
Prerequisites: Advanced JavaScript that includes Object Oriented concepts, Ajax, promises, prototypal inheritance, ES6 and module design patterns
If you want to learn more about ES6, aka ES2015, here are some good tutorials:
https://babeljs.io/learn-es2015/
ES6 - JavaScript Improved | Udacity
React Training | Redux with React and React Router |
---|---|
Intro to React | Uncontrolled Components |
React vs other libraries | Component Life-Cycle |
Virtual DOM | Forms |
JSX | Building Apps |
Precompiled JSX | Introduction to Flux |
Properties & State | Introduction to Redux |
Reusable Components | Related React Tools |
Compositions | React Router |
Events | Testing React Components |
Controlled Components | Testing Redux Reducers |
First check if you have node installed.
In a terminal, cmd prompt, or powershell:
node -v
Should be >= 8.0
npm -v
Should be greater than 5.2
If needed, install Node.js LTS from https://nodejs.org/
Add node to your path if necessary, then In a new terminal, cmd prompt, or powershell (must start new terminal to see new path):
node -v
Should be >= 8.0
npm -v
Should be greater than 5.2
Install eslint
npm install -g eslint
git
installedIn a terminal, powershell, or cmd prompt:
git --version
Should be greater than 2.0
git
from https://git-scm.com/downloadsTry creating and running a starter app with create-react-app
npx create-react-app starter
cd starter
npm start
Create React App: Getting Started
We’ll do more setup in class as needed.
Jetbrains IDEs, either WebStorm or IntelliJ. http://www.jetbrains.com/
https://www.linkedin.com/in/davidemarsland
Web Development since the Dawn of the Web
Wayback Machine 1997 reality.sgi.com/mars_corp
See the Pen Hello React World by David Marsland (@demarsland) on CodePen.
http://www.evolutionoftheweb.com/
Modern Web Development with React and Redux by Mark Erikson
https://github.com/davidmarsland/react-labs/
Clone this repo into the directory you want to save the course labs:
git clone https://github.com/davidmarsland/react-labs/
Then
cd react-labs
cd solutions
cd catalog3cart
npm install
npm run start
Create React App: Getting Started
react-spike/labs
directory
npx create-react-app helloworld
https://reactjs.org/docs/thinking-in-react.html
Generate project in labs directory
npx create-react-app simpletable
const PRODUCTS = [
{category: 'Sporting Goods', price: '$49.99', stocked: true, name: 'Football'},
{category: 'Sporting Goods', price: '$9.99', stocked: true, name: 'Baseball'},
{category: 'Sporting Goods', price: '$29.99', stocked: false, name: 'Basketball'},
{category: 'Electronics', price: '$99.99', stocked: true, name: 'iPod Touch'},
{category: 'Electronics', price: '$399.99', stocked: false, name: 'iPhone 5'},
{category: 'Electronics', price: '$199.99', stocked: true, name: 'Nexus 7'}
];
In src directory, create file SimpleTable.jsx
import React from 'react';
class SimpleTable extends React.Component {
render() {
return (
<table>
<tbody>
</tbody>
</table>
)
}
}
export default SimpleTable;
Inside the tbody tags use an array and map() this.props.products to populate the name and price for each product
<tr><td>name</td><td>price</td></tr>
Similar to this:
<ul>
{this.props.items.map((value, index) => {
return <li key={index}>{value}</li>
})}
</ul>
npm start
Generate project
npx create-react-app catalog
Modularize the code in Step 2: Build A Static Version in React
const PRODUCTS = [
{category: 'Sporting Goods', price: '$49.99', stocked: true, name: 'Football'},
{category: 'Sporting Goods', price: '$9.99', stocked: true, name: 'Baseball'},
{category: 'Sporting Goods', price: '$29.99', stocked: false, name: 'Basketball'},
{category: 'Electronics', price: '$99.99', stocked: true, name: 'iPod Touch'},
{category: 'Electronics', price: '$399.99', stocked: false, name: 'iPhone 5'},
{category: 'Electronics', price: '$199.99', stocked: true, name: 'Nexus 7'}
];
In src directory, create jsx files for each class and add import and export like this:
ProductCategoryRow.jsx
import React from 'react';
class ProductCategoryRow extends React.Component {
...
export default ProductCategoryRow;
Import appropriate dependencies for each file like this:
import React from 'react';
import ProductCategoryRow from './ProductCategoryRow';
import ProductRow from './ProductRow';
class ProductTable extends React.Component ...
Modify index.js to import FilterableProductTable then render.
Note that id is ‘root’, not ‘container’
ReactDOM.render(
<FilterableProductTable products={PRODUCTS} />,
document.getElementById('root')
);
Run app in browser
npm start
Optional Challenge: Create a Cart component and add selected products to the cart
handleAddToCart(product) {
this.setState({
cart: this.state.cart.concat(product)
// returns a new array
})
}
Optional Challenge: use your own test data for real shopping!
https://github.com/azat-co/react-foundation
https://node.university/p/react-foundation
Azat Mardan wrote: “Personally, I find ES6 modules confusing. Yes, they’re more eloquent, but Node.js modules won’t change anytime soon. It’s better to have only one style for browser and server JavaScript, so I’ll stick with CommonJS/Node.js style for now.
For more information and examples, see http://exploringjs.com/es6/ch_modules.html. And no matter what, write modular JavaScript!”
{
"name": "react-project",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "./node_modules/.bin/webpack",
"build-watch": "./node_modules/.bin/webpack -w"
},
"author": "",
"license": "MIT",
"babel": {
"presets": [
"react"
]
},
"devDependencies": {
"babel-core": "^6.13.2",
"babel-loader": "^6.2.4",
"babel-preset-react": "^6.5.0",
"react": "^15.2.1",
"react-dom": "^15.2.1",
"webpack": "1.13.3"
}
}
npm run build
ERROR in Entry module not found: Error: Can't resolve 'babel' in 'C:\Users\david\git\react-training\react-labs\labs\react-project'
BREAKING CHANGE: It's no longer allowed to omit the '-loader' suffix when using loaders.
You need to specify 'babel-loader' instead of 'babel'
State Management with React and Redux
Redux DevTools - Chrome Web Store
Note, you must add a line to source code to enable tooling. Try this on a Redux example without this and it will provide instructions:
No store found. Make sure to follow the instructions.
For a basic Redux store simply add:
const store = createStore(
reducer, /* preloadedState, */
+ window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
npm install
npm run start
git clone -b 00 https://github.com/gothinkster/react-redux-realworld-example-app.git
Then cd react-redux-realworld-example-app
and
npm install
to download node modules (may take a while on windows) and npm run start
to run a development server
cd react-redux-realworld-example-app
npm install
npm run start
thinkster
lab Lab: Learn the Fundamentals of Reduxcd react-redux-realworld-example-app
git branch mylabs00start
git checkout mylabs00start
git commit -am "starting point for labs"
git checkout -b mylabs01reduxtodos
git branch
createStore()
createStore()
as on the previous page:For a basic Redux store simply add:
const store = createStore(
reducer, /* preloadedState, */
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);
setState()
Optionally when you’re done you can commit your work and diff, then create and checkout a new branch for the next lab.
git commit -am "Added redux store, reducer, and dispatch to todos checkbox"
git diff -b mylabs00start
git checkout -b mylabs02conduit
src/components/App.js
react-redux
Providerstore.subscribe()
store.dispatch()
mapStateToProps()
and react-redux connect()
Optionally when you’re done:
git commit -am "Started Conduit site with react-redux"
git diff -b mylabs01reduxtodos
git checkout -b mylabs03conduitloading
Communicating Across Multiple Components
Optionally when you’re done:
git commit -am "Added comm across multiple components to loading..."
git diff -b mylabs02conduit
git checkout -b mylabs04conduitfeed
superagent
HTTP client library to lead conduit data feedPromise
, and mapDispatchToProps
to dispatch actions asynchronously
Displaying Retrieved Data in Componentsreducer
to handle action HOME_PAGE_LOADED
ArticlePreview
componentOptionally when you’re done:
git commit -am "Loaded data feed and dispatched actions"
git diff -b mylabs03conduitloading
git checkout -b mylabs05router
git branch
Optionally, when you’re done:
git commit -am "Added react-router Links"
git diff -b mylabs04conduitfeed
git branch
Advanced React and Redux Online Training (need PRO subscription)
More Advanced Online Training Available on thinkster.io
React Redux Tutorial for Beginners: learning Redux in 2018 by Valentino Gagliardi
Facebook Tutorial: Testing React Components with Jest
Modern React Component Testing with create-react-app, Jest, and Enzyme
Redux Testing Step by Step: A Simple Methodology for Testing Business Logic
Optional Homework: Final AutoComplete Project in React Foundation
Describe React and the problem it solves
Explore the basic architecture of a React component
Gain a deep knowledge of React components and JSX
Learn how to manage application
state with Flux and Redux
React Training | Redux & React + React Router |
---|---|
Intro to React | Uncontrolled Components |
React vs other libraries | Component Life-Cycle |
Virtual DOM | Forms |
JSX | Building Apps |
Precompiled JSX | Introduction to Flux |
Properties & State | Introduction to Redux |
Reusable Components | Related React Tools |
Compositions | React Router |
Events | Testing React Components |
Controlled Components | Testing Redux Reducers |
15 minute test of your proficiency in React. Should be able to take once with 1 redo.
https://www.pluralsight.com/paths/react