Dispatching Actions
We're not quite done here. We got the reading part of Redux done but not the writing. Let's go do that too in SearchParams.js
import { useSelector, useDispatch } from "react-redux";
import changeLocation from "./actionCreators/changeLocation";
import changeTheme from "./actionCreators/changeTheme";
import changeAnimal from "./actionCreators/changeAnimal";
import changeBreed from "./actionCreators/changeBreed";
// up with other hooks
const dispatch = useDispatch();
// change inputs
<input
id="location"
value={location}
placeholder="Location"
onChange={(e) => dispatch(changeLocation(e.target.value))}
/>
<select
id="animal"
value={animal}
onChange={(e) => dispatch(changeAnimal(e.target.value))}
onBlur={(e) => dispatch(changeAnimal(e.target.value))}
></select>
<select
disabled={!breeds.length}
id="breed"
value={breed}
onChange={(e) => dispatch(changeBreed(e.target.value))}
onBlur={(e) => dispatch(changeBreed(e.target.value))}
></select>
<select
value={theme}
onChange={(e) => dispatch(changeTheme(e.target.value))}
onBlur={(e) => dispatch(changeTheme(e.target.value))}
></select>
- This dispatching is so much nicer than it is with other API
- The
useDispatch
hook gives you back a dispatching function so you can dispatch actions - That's really it!
Now we're also using mapDispatchToState which lets us write functions to dispatch actions to Redux. Let's quickly add it to Details.js
// replace ThemeContext import
import { connect } from "react-redux";
// remove all the ThemeContext stuff and the interior function
// replace `context.theme` with just `this.props.theme` for the backgroundColor
// bottom
const mapStateToProps = ({ theme }) => ({ theme });
const WrappedDetails = connect(mapStateToProps)(Details);
// replace DetailsWithRouter
const ReduxWrappedDetails = connect(mapStateToProps)(Details);
const DetailsWithRouter = withRouter(ReduxWrappedDetails);
Now it should work! Redux is a great piece of technology that adds a lot of complexity to your app. Don't add it lightly. I'd say you'd rarely want to start a new project using Redux: hit the problems first and then refactor it in. You just saw how.