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
- 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 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
In a terminal, powershell, or cmd prompt:
git --version
Should be greater than 2.0
If needed, install git
from https://git-scm.com/downloads
Try 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.
- Visual Studio Code: install from https://code.visualstudio.com/
- Sublime Text https://www.sublimetext.com/
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
- Sun Java Certified Developer and Instructor 1998-2004
- eBay Chief Instructor 2004-2009
- Sencha Chief Instructor / Training Director 2010-2015
- Marsland Enterprises Chief Instructor 2015-
- DevelopIntelligence Senior Technical Instructor 2017-
See the Pen Hello React World by David Marsland (@demarsland) on CodePen.
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>http://www.evolutionoftheweb.com/
Modern Web Development with React and Redux by Mark Erikson
- React doesn't enforce naming conventions
- There are many different approaches to class and file naming
- Airbnb React/JSX Style Guide shows one approach
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
- Follow the steps in this tutorial to use Create React App for starter files https://www.kirupa.com/react/setting_up_react_environment.htm
- Then create helloworld app inside
react-spike/labs
directorynpx create-react-app helloworld
- Starter Create React App Online
- Helloworld App Online
https://reactjs.org/docs/thinking-in-react.html
Here's the app you're about to create: Lab Solution Online
-
Generate project in labs directory
npx create-react-app simpletable
-
In src directory, delete App.*
-
Start with this data from Thinking In React and declare PRODUCTS in src/index.js
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>
- Modify index.js to render SimpleTable instead of App and pass in products={PRODUCTS} as a prop.
- Run app in browser
npm start
- Create React App simplifies setup
- https://www.kirupa.com/react/setting_up_react_environment.htm
- Create React App Docs
Here's the app you're about to create: Lab Solution Online
-
Read the Thinking in React Tutorial up to Step 2
-
Generate project
npx create-react-app catalog
-
Modularize the code in Step 2: Build A Static Version in React
-
In src directory, delete App.*
-
Start with this data from Thinking In React and declare PRODUCTS in src/index.js
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
Here's the app you're about to create: Lab Solution Online
- Read all of Step 3: Identify The Minimal (but complete) Representation Of UI State
- Read Step 4: Identify Where Your State Should Live
and modify the code as described to add state - Complete Step 5: Add Inverse Data Flow
-
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!
Optional Cart Lab Solution Online
https://github.com/azat-co/react-foundation
https://node.university/p/react-foundation
- React Foundation Course uses Node CommonJS module
- Why? Can use same syntax with server-side Node and Client side
- voidcanvas.com/import-vs-require/
- React Quickly Appendix E: ES6 Modules
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!"
- Module 1 Hello React World
- Changing the State example
- Module 2 Components
- Module 3 User Input
- Module 4 Advancing Components
- React Foundation Summary
- We'll only do the first labs here
- Lab 1 Issues: Complete package.json:
{
"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 Example Incrementer
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__()
);
- https://github.com/sadams/todo-redux-react-webpack
- Clone repo, then:
npm install
npm run start
- Launches on localhost:8080 by default.
- Thinkster: Learn The Fundamentals of Redux from thinkster.io
Note, to do the labs you will have to change git commands similar to this:
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
- Create a free account and/or login with github on Thinkster: Learn The Fundamentals of Redux from thinkster.io
- Do the first
thinkster
lab Lab: Learn the Fundamentals of Redux - Optionally you can create your own git branch to save your labs. From a new terminal or powershell:
cd react-redux-realworld-example-app
git branch mylabs00start
git checkout mylabs00start
git commit -am "starting point for labs"
git checkout -b mylabs01reduxtodos
git branch
- Add Redux store with
createStore()
- Add DevTools to
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__()
);
- Subsribe the store to React's
setState()
- Display checkbox tied to state
- Lab Solution Online
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
- Remember to remove App component from index.js
- Add components folder to src and create App.js in
src/components/App.js
- Building Conduit Site and adding
react-redux
Provider - Subscribing to Redux Store with
store.subscribe()
- Dispatching Actions with
store.dispatch()
- Using
mapStateToProps()
andreact-redux connect()
- Lab Solution Online
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
- Making AJAX calls with
superagent
HTTP client library to lead conduit data feed - Lab Solution Online
- Using Middleware,
Promise
, andmapDispatchToProps
to dispatch actions asynchronously Displaying Retrieved Data in Components - Update
reducer
to handleaction HOME_PAGE_LOADED
- Build
ArticlePreview
component - Lab Solution Online
Optionally 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
- Port your simple catalog in React to use Redux for state management
- Previously, you modularized this code Thinking in React Shopping https://reactjs.org/docs/thinking-in-react.html
- Refactor to use Redux
- Use Todo Redux example for inspiration https://github.com/sadams/todo-redux-react-webpack
- See previous page for setup
- Optional challenges: use your own test data for real shopping!
- React Quickly has a Backbone routing example in Ch. 13
- https://github.com/azat-co/react-quickly/tree/master/ch13
- Defining a router class with the routes object as a mapping from URL fragments to functions
- Rendering React elements in the methods/functions of the Backbone Router class
- Instantiating and starting the Backbone the Router object
- http://reactquickly.co/demos
- Review React Foundation Course Videos from Azat Mardan React Quickly Book by Azat Mardan: Livebook
- React Quickly Summaries
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
https://davidmarsland.github.io/react-spike/