Flux, React and Redux
React
React is declarative
The data and operations seem mangled up
React Component class or react component type A component takes parameters called props and returns a hierarchy of views to display via the render method
Haskell speak: component :: render -> props -> hierarchy of views It’s as if a render is a functor and component is fmap
render returns a description of what you wish to render react takes the description and renders it to a screen render
returns a react element (a lightweight description of what to render)
Each React element is a real JavaScript object that you can store in a variable or pass around your program.
React components can have state by setting this.state in the constructor, which should be considered private to the component.
In JavaScript classes, you need to explicitly call super();
when defining the constructor of a subclass.
We even have a topic on lifting state
When you want to aggregate data from multiple children or to have two child components communicate with each other, move the state upwards so that it lives in the parent component. The parent can then pass the state back down to the children via props, so that the child components are always in sync with each other and with the parent
It is conventional in React apps to use on* names for the attributes and handle* for the handler methods.
controlled components - child components that receive their state from a parent component
react components are made up of react elements which so far look just like HTML elements to me
rendering
Imperative rendering
React comes in here: re renders diffs
From: [A Case against the GO TO Statement by Edward Dijkstra] > we should do (as wise programmers aware of our limitations) our utmost best to shorten the conceptual gap between the static program and the dynamic process, to make the correspondence between the program (spread out in text space) and the process (spread out in time) as trivial as possible.
Make things snapshottable: * one state to next state
When data changes react re renders entire component
referentially transparent functions/endpoints - trivial tp predict for given input - easy to test
Stateful DOM or any stateful UI toolkit
Solution is a virtual DOM which is implemented in a lib called react
immutability plays well with diffing two states
Functional components
Rather than return a class extending React.Component, write a fn that takes props and returns what should be rendered
state
State is similar to props, but it is private and fully controlled by the component. Local state is exactly that: a feature available only to classes.
State updates may be asynchronous
React may batch multiple setState()
calls into a single update for performance. Because this.props
and this.state
may be updated asynchronously, you should not rely on their values for calculating the next state.
to fix this use a version of setState
that accepts a function e.g
this.setState((prevState, props) => {
counter: prevState.counter + props.increment
});
State updates are merged
merges the object you provide into the current state. merging is shallow i.e. leaves other key value pairs untouched
Handling events
When using React you should generally not need to call addEventListener to add listeners to a DOM element after it is created. Instead, just provide a listener when the element is initially rendered.
You have to be careful about the meaning of this in JSX callbacks. In JavaScript, class methods are not bound by default. If you forget to bind this.handleClick and pass it to onClick, this will be undefined when the function is actually called.
- https://www.smashingmagazine.com/2014/01/understanding-javascript-function-prototype-bind/
you can use an arrow fn in the callback e.g
onClick={(e) => this.handleClick(e)}
The problem with this syntax is that a different callback is created each time the LoggingButton renders. In most cases, this is fine. However, if this callback is passed as a prop to lower components, those components might do an extra re-rendering. We generally recommend binding in the constructor or using the class fields syntax, to avoid this sort of performance problem.
Lifecycle hooks
methods run during the life cycle events such as mounting and umounting
componentDidMount
: runs after the component output has been rendered to the DOMcomponentWillUnmount
:
this.setState({})
takes an object of new state constructor
runs before the object is created
modifying state directly e.g this.state.comment = “I’m new…” doesn’t lead to a rerender. use set state
The only place where you can assign this.state
is the constructor
.
kaznet
App.js has all the paths triggers container for that component
Flux
flux arch for building UIs using react
think of flux as new MVC
action: comes into the system dispatcher: traffic controller for the whole thing store: data layer updates whenever we get a new action view: re render whenever store says something has changed
Difference from MVC 1. use explicit data instead of derived data 2. separate data from view state 3. avoid cascading effects by preventing nested updates - x updates y which updates z - let data layer completely finish processing before triggering any additional actions
single direction flow: action -> stores -> views
flux action -> dispatcher -> store -> view ^—– action —–|
the dispatcher ensures that until store is done views or anything else can’t put an action through the system
advantages: - improved data consistency: everything in sync - easier to pinpoint root of a bug - easier unit tests because modules are pure-ish/atomic/functional
views
can trigger actions
dispatcher
enforces no cascading effects once an action goes into store you can’t put another until store is done processing it
Redux
Redux has no relation to react but works especially well with it because react let’s you describe UI as a function of state. Redux emits state updates in response to actions.
actions pure functions in redux only 2 things allowed to interact with the store one is a reducer it changes the state others are selectors retrieve data from the state
containers are components aware of global state
all things that fetch lists should be aware of pagination
page numbers
generic for tasks, locations clients
connect(mapStateToProps, mapDispatchToProps, [mergeProps], [options])
Connects a React component to a Redux store. connect
is a facade around connectAdvanced
, providing a convenient API for the most common use cases.
It doesn’t modify the component class passed to it; instead it returns a new, connected component class for you to use.
reference [React-redux “connect” explained][Usage with React](https://redux.js.org/basics/usage-with-react) source code
mapStateToProps
the result must be a plain object which will be merged into the component’s props.
mapDispatchToProps
Provider
To allow all components to access the store use a d special react redux component
Action creator
A function that creates an action. > action is a payload of information, and an action creator is a factory that creates an action.
Calling an action creator only produces the action but does not dispatch it. You need to call the store’s dispatch fn to actually cause the mutation
Reducer
Also called a reducing function function that accepts an accumulation and a value and returns a new value
reduce in other langs or fold in haskell.
reduce a collection of values into a single values
most important concept in redux
combineReducers
A helper function that turns an object whose values are different reducing functions into a single reducing fn you can pass to createStore
.
the resulting reducer calls every child reducer and gethers the resilt into a single state object
The state produced by combineReducers() namespaces the states of each reducer under their keys as passed to combineReducers()
createStore
creates a single redux store that holds the complete state of your app.
Your app should have a single store
args: reducer, preloadedState, enhancer
enhancer: store enhancer optionally specify it to enhance the store with third party capabilities such as middleware, time travel, persistence etc
the only store enhancer that ships with redux is applyMiddleware
applyMiddleware
Lets you wrap the store’s dispatch
method Middleware is composable
Most common use case is to support async actions without much boilerplate code or lib dependency. Does so by letting you dispatch async actions
in addition to normal actions
thunk-redux
lets the action creators invert control by dispatching functions. They would receive dispatch
as an arg and may call it async. Such functions are called thunks.
redux-promise
Lets you dispatch a promise async action and dispatches a normal action when the promise resolves.
Middleware is not baked into createStore and is not a fundamental part of the Redux architecture, but we consider it useful enough to be supported right in the core. This way, there is a single standard way to extend dispatch in the ecosystem, and different middleware may compete in expressiveness and utility.
Async action
A value that is sent to a dispatching function but not yet ready for consumption by the reducer. It will be transformed by middleware into an action before being sent to the base dispatch fn
Store
Holds the whole state tree of your app. A store is not a class. It’s just an object with a few methods on it.
There’s no way to directly modify the store only way is through reducers and only way to trigger reducers is to dispatch actions
to change data dispatch and action to obtain data we should (need to) go through a selector
we get the state of the application at the time we made the select
Components
Smart components are not allowed to have any logic except dispatching actions. Smart components should always access state through selectors.
Place all business logic inside action handlers (thunks), selectors and reducers.
presentational and container components
reference: https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0 aka stateful and pure components among other names
this approach achieves: - separation of concerns - reusability
Services
Abstract an external API
services must be stateless
state
In Redux, the reducer is the construct that holds state and updates it
resources
https://hackernoon.com/redux-step-by-step-a-simple-and-robust-workflow-for-real-life-apps-1fdf7df46092
Service workers
Terms
- thunk: a function that takes no argument not like a haskell thunk.
- ****:
Other implementions of the store - backbone: instagram
[React-redux “connect” explained] :https://www.sohamkamani.com/blog/2017/03/31/react-redux-connect-explained/