guide
General
Let the audience pick the high level topics and perhaps you don't need to cover some
You can give a brief overview of the topics and let the audience pick what they want
Simple demo
Intelligent interrupts
Structure into your talk, breaks for the audience to interact
Encourage a conversation about the topic
Permission to interact
Two sticky notes; one for passive help and one for active help
Balanced chance to speak, sticky note to indicate if you've spoken already to prevent over contributor
Bring paper, pens, and encourage doodling
Quiz them
Mind maps: draw them while listening and compare at intervals
Compare mind map at the end to my mind map to encourage people to pay attention
Build something that represents the thing you were talking about
I.e., building blocks to represent a pipeline of processes
[Introduction to React]()
Share requirements for getting setup:
Node/NVM
Editor
create-react-app
Create a Robodex app using
create-react-app
Walk through created folder and have a look at some basic Node project stuff
such as
package.json
andnode_modules
Describe what folders do what and show
README.md
Describe
create-react-app
commands before serving the appServe the app and demo
[Making a Component]()
Explain what components are, including description for rendering and props
Explain what JSX is
Create a stateless greeting component and break each part down into detail
Talk about ReactDOM
Does the actual work of inserting React components into the DOM tree
Allows other renderers for different platforms/uses
Replace
App
inindex.js
withGreet
Describe props being inputs from parent component
Allows composability and extensibility of components
Add props to
Greet
component and change text to rely on propsPass in props from
index.js
Talk about destructuring props
Explain how embedded expressions work
Introduce Tachyons, explain what it is and how it changes styling approach
Contrast with semantic approach
Start styling the greeting component
Open up docs to give the audience the opportunity to see it
Explain the oddity with
className
and how attribute string binding works
[Next Steps]()
Demo the final app at the start of this section, making the URL available for trainees
Demo without changing
index.js
to illustrate the error produced by missing propsMake sure each
Card
has different values to illustrate how each card is different but the sameCopy and paste individual cards before moving to list format
Mention Flow/TypeScript as static analysis options
[Creating a Card List]()
Put some robot definitions in
robots.js
and import that rather than hard-coding intoCardList
Update
CardList
to accept the array as therobots
prop (which is our array of objects)Don't add
key
prop to the generatedCard
elements at first to show a very common errorFinish wiring up the pieces and then demo
This is a good opportunity to do some simple exercises with
map
andfilter
(and possibly other higher-order functions)Map: take an array of numbers and multiply them by 2
Filter: filter out odd numbers in an array of numbers
Reduce: sum up an array of numbers, multiply an array of numbers
[Creating the Container]()
Ask learners how to connect search box to parent component before doing work
Show details of adding the event handler to
SearchBox
component'sonChange
eventImplement
onSearchChange
inApp.js
as class member functionDemo that change handler is being called using console log before adding filter logic
Discuss how to handle search term within app -> as state in App component
Go over how stateless components don't re-render even if inputs change
Investigate render stage using
console.log
or debuggerCompare
App.js
class syntax to stateless componentRewrite
App.js
as stateless component to highlight the similaritiesGo back to class syntax and add an empty
robots
array to stateAdd a delayed
setState
call usingsetTimeout
Explain how
setState
is async and batches updatesAccepts second argument for sequencing calls after state has updated
Point out the error calling
setState
due to how JavaScript resolvesthis
Then change
onSearchChange
to an arrow function
Demo search functionality
Note that it is not safe to keep a reference to the event given to the handler
due to React's synthetic event system
Side note: This is a good point for a break
[Lifecycles]()
Summarize the three different categories of lifecycle methods
Explain mounting and go into componentDidMount as a place to do AJAX requests
Don't spend much time at this point on updating and unmounting
Go back to
componentDidMount
and use that to transition into coding the AJAX call to get robotsCreate a robot provider
Implement AJAX call in
App.js
'scomponentDidMount
member
[React Summary]()
Go over each of the main concepts of React: components, state, props and JSX. This is to show how simple React really is; and how it isn't that complicated.
Go back and show how what has been done so far connects to what React is in essence:
Reactive since views are re-rendered on state updates
Declarative since renders are pure and can be expressed as a single JSX expression
The app is built from the composition of small components
To build interactivity, we combine callbacks (methods) with props, and state
It's best practice as apps get bigger, it solves a huge problem that massive projects have faced in the past. This is why people love React. React has these walls to guide you in this style of mentality. So when you build apps, you are using good practices.
[Introduction to Redux]()
Start by going over what problems Redux tries to address
State is getting more complicated
GUIs can interact with many different parts of the state
Web applications have client/server dynamic
Summarize what Redux is
Use diagram to explain the main abstractions in short detail and how all state updates must follow this pattern in order to achieve benefits of predictability
Provide more context regarding the roles of Actions, Reducer and Store in more detail
Install redux and react-redux into the robodex app
Go to the Redux Devtools Extension README to give trainees the option to download the version they need
Go to Chrome Store, install and show how to confirm it's been installed correctly
Show that no Redux store has been detected yet
[Actions and Reducers]()
Create
constants.js
to define the action identifierThen create
actions.js
to generate the action objectAnd then create the reducer in
reducers.js
Emphasize state + action => new state object
Point out use of default values for parameters
Point out that reducer leaves state alone if it doesn't recognize the action
So reducers can be chained together
This code is not (yet) coupled to the application at the end of this episode
[Providing a Store]()
Add store using
createStore
inindex.js
Feed the
robotSearchReducer
to itUse debugger to examine contents of store
Use
Provider
fromreact-redux
, assign the store to it, then wrap theApp
componentInspect using Redux DevTools to see if everything has completed correctly
[Making Connections]()
Do a simple store.subscribe solution that calls
React.render
on the applicationDemo the app to see that Redux is working as expected
This solution is more limited since it requires re-rendering the whole application for every state change
Start with a basic connect solution provided by react-redux
Import actions into app.js
Create a mapStateToProps function that takes the state and returns an object with searchTerm
Explain how this function is a way of turning redux state into component props
Create a mapDispatchToProps function that returns an
onSearchChange
prop that dispatches the changeSearchTerm actionExplain how this function is a way of mapping dispatcher functions to component props
Import connect and connect the component to our mapping functions
Change the default export to the connected App component
This way of implementation makes it so that the component doesn't need to be aware of the implementation details of how it recieves context values, just that it gets them
[Redux Logging]()
Introduce the concept of Redux middleware
It's similar to middleware in other libraries but it runs between the action and reducer
Talk about logging middleware since it's probably the most obviously useful
Install
redux-logger
Import and create the logger
Apply the middleware and demo the logger to see that it logs to the console
[Redux Thunk]()
Introduce the concept of thunks as ways to delay evaluation and execution
Show some quick examples with plain JS
Talk about the benefits of why this is useful to redux, sometimes state updates need to be delayed
Add new action constants for pending, success, and error
Import the constants you just created in the actions file
Add an action creator for fetching robot data
Returns a function that accepts dispatch (and optionally getState since thunk provides it)
Inside the function...
Dispatch pending
Call fetch
On then fire the success action with payload
On error fire the error action
Import the constants for the new action in the reducers file
Create a new reducer for robots data
Create a new initial state for robot data, is pending, and has error
Create a reducer function that will implement the new constants
Change the export default to export and add an export for the new reducer
Change the import statement within index for the reducer to use curly braces to import each of the reducers separately
Implement reducers through combineReducers before calling createStore
Explain that this can be done as a default export too (in reducers.js)
Import reduxThunk from redux-thunk and apply it as middleware
Open App.js and import the new action
Update mapStateToProps and mapDispatchToProps
Note, now that we're using combineReducers, you'll need to update the state.searchTerm to include reducer name (i.e. state.robotSearch.searchTerm)
Replace the contents of componentDidMount to call the action to fetch robots
[Merging]()
Notify that mergeProps is one way to intercept props passed into a component and use that when interacting with state
How we'll use it in this case is to help us with filtering robots
Create a new function called mergeProps in App.js that takes state and dispatch arguments
Add a new filteredRobots prop that filters the list of robots based on the search term
Update the connect call to include mergeProps as the third param
Use the filteredRobots prop in the CardList component to render the Cards
Last updated
Was this helpful?