Updating my React Sudoku Solver app: Replacing Flux with Redux (part 1)
source link: https://www.kevinhooke.com/2020/12/27/updating-my-react-sudoku-solver-app-replacing-flux-with-redux-part-1/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Updating my React Sudoku Solver app: Replacing Flux with Redux (part 1)
A while back I built a React frontend for a AWS Lambda Sudoku solver. At the time I used Flux (original source for this app is here), but I’m taking a look at updating it to replace Flux with Redux.
As a starting point I took another example React app, a simplest case app using Flux and then converted it to Redux. After working through the changes to update this app to use Redux, I put together a quick cheatsheet of changes here. Here’s both projects for a comparison:
https://github.com/kevinhooke/SimpleReactFluxExample
https://github.com/kevinhooke/SimpleReactReduxExample
Here’s a walkthrough of the main changes to an existing app (summarizing the steps from my cheatsheet, link above, and looking at some of the steps in more detail):
- install react-redux and react-devtools-extension
- create a store using Redux createStore, replacing previous Flux store that used Dispatcher, EmitEvent and [add|remove]ChangeListeners
- create reducers to manipulate the Store
- wrap root component with <Provider>
- connect components with the Store
The Redux approach to maintaining state in the Store is significantly different from Flux:
- Redux has a single store, whereas Flux can have many
- State maintained in a Redux Store is manipulated with reducer functions
- Reducer functions take the state to be manipulated and actions that are applied to the state to change it
- Flux maintains a copy of the state in variables in the Store itself, whereas the current state of the store is passed as an argument to reducers, and a new updated copy is returned as the result
Since there’s a number of changes to the store, it’s worth looking at each of these in more detail.
Updating Flux Store to a Redux Store
Previously my Flux store maintained state in two vars:
var puzzleData = {}
var message = {}
These are no longer needed in the Redux store, but there in an initialState for initializing the Store. This can simply be the same as puzzleData before but just renamed for clarity:
const initialPuzzleData = {}
Next, each of the case statements in the Action can move over to the reducer function, and updated to manipulate the content of the store passed as a param and then return the modified store as the result. For example, previously each action was handled like this:
case 'NEW_DATA' : this.setData(action.data); this.emit('change'); break;
With Redux, each case block is now going to look more like this:
case 'NEW_DATA' : return Object.assign( {}, action.data );
Create ActionCreators
In Flux, an Action combines a couple of concepts, it’s the payload to be dispatched to the Store as well as the mechanism for performing the dispatch of the Action. With Redux these concepts are separate, and the Action is merely the payload to apply to updating the Store. There is a concept of Action Creators though, that can be called to build the Action payload. Before with Flux we would have an Action function like this:
initSamplePuzzle(){ console.log("SudokuSolverAction initSamplePuzzle()"); var puzzle = { rows: [ ["", "", "", "8", "1", "", "6", "7", ""], ["", "", "7", "4", "9", "", "2", "", "8"], ["", "6", "", "", "5", "", "1", "", "4"], ["1", "", "", "", "", "3", "9", "", ""], ["4", "", "", "", "8", "", "", "", "7"], ["", "", "6", "9", "", "", "", "", "3"], ["9", "", "2", "", "3", "", "", "6", ""], ["6", "", "1", "", "7", "4", "3", "", ""], ["", "3", "4", "", "6", "9", "", "", ""] ] } AppDispatcher.dispatch({ actionName: 'NEW_DATA', data: puzzle.rows }); }
and now this is simplified to build the payload, the Flux Dispatcher is removed, and the function. now just returns the payload to be processed:
return { actionName: 'NEW_DATA', data: puzzle.rows };
Another simple example that builds an Action object for an update to the Store:
export function updateGrid(payload) { return { type: NEW_DATA, payload } };
Connecting Components to the Store
In each Component, implement mapStateToProps and mapDispatchToProps to pass store and dispatch() as props to each Component, and call connect() to connect each Component with your Redux Store.
Here’s my matchStateToProps:
const mapStateToProps = state => { return { grid: state.grid, message: state.message }; };
And here’s my mapDispatchToProps:
function mapDispatchToProps(dispatch) { return { updatePuzzleData : grid => dispatch(updatePuzzleData(grid)), clearData : () => dispatch(clearData()), initSamplePuzzle : () => dispatch(initSamplePuzzle()) } }
mapDispatchToProps is where your Action Creators are called to create Action objects for modifying state, and then dispatched to apply against the state of the Store by your reducers.
Connect your components to your Store with a call to connect() :
const SudokuSolver = connect(mapStateToProps, mapDispatchToProps)(ConnectedSudokuSolver); export default SudokuSolver;
Part 2
In part 2 I’ll look at moving the api call from the Flux Action to use Redux middleware and thunks.
Recommend
-
12
Updating my React Sudoku Solver app: Replacing Flux with Redux (part 2) In the first part of convertin...
-
13
Kevin's Sudoku SolverSudoku SolverKevin Hooke, March 2019What is this?This is a Sudoku puzzle solver. Populate the puzzle grid below with a Sudoku puzzle and press the 'Solve' button.Note: this solver only cu...
-
8
README.md ...
-
3
This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: npm start Runs the app in th...
-
7
Sudoku solver, generator, puzzle ranker, with a React frontend I’ve finally reached a point where I have a complete end to end Sudoku generator, a human puzzle grader, and an updated React frontend to load generated puzzles....
-
7
Building a React frontend for my AWS Lambda Sudoku solver Over the past few months I built an implementation of Donald Knuth’s Algorithm X using
-
6
In this article, we will learn to implement a Sudoku Solver using C++. This is a perfect example of a recursion and backtracking algorithm. Have you ever tried to solve a 9×9 Sudoku puzzle? If yes, then you must be tempted to look at the algo...
-
8
Create Sudoku Solver in JavaCreate Sudoku Solver in JavaVideo Player is loading.Loaded: 0%Remaining Time -0:00Sudoku is a logical game that is played acro...
-
2
React中Flux与redux 精选 原创
-
5
Project: Build A Real-Time Sudoku Solver Projects Title: Build A Real-T...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK