Hooks contains our logic code in our React app.
We can create our own hooks and use hooks provided by other people.
In this article, we’ll look at some useful React hooks.
reactive-react-redux
The reactive-react-redux library is an alternative library to React-Redux for using Redux stores in our React app.
To use it, we install it by running:
npm install reactive-react-redux
Then we can use it by writing:
import React from "react";
import { createStore } from "redux";
import { Provider, useDispatch, useTrackedState } from "reactive-react-redux";
const initialState = {
count: 0
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case "increment":
return { ...state, count: state.count + 1 };
case "decrement":
return { ...state, count: state.count - 1 };
case "setText":
return { ...state, text: action.text };
default:
return state;
}
};
const store = createStore(reducer);
const Counter = () => {
const state = useTrackedState();
const dispatch = useDispatch();
return (
<div>
<span>Count: {state.count}</span>
<button type="button" onClick={() => dispatch({ type: "increment" })}>
increment
</button>
<button type="button" onClick={() => dispatch({ type: "decrement" })}>
decrement
</button>
</div>
);
};
export default function App() {
return (
<Provider store={store}>
<Counter />
</Provider>
);
}
We have our initialState constant with the initial state.
Our reducer is a Redux reducer.
The store is created with the createStore function from Redux to create our store from the reducer .
In the Counter component, we use the useTrackedState hook to get the state.
And we use the useDispatch hook to get the dispatch function to let us dispatch our action to the reducer.
Then in App , we use the Provider with the store prop set to our store to let us use it as a data store.
Provider , useTrackedState , and useDispatch are from reactive-react-redux.
We can also select values from a state and do more.
React-async-hook
React-async-hook is a library to help us make API calls easier.
To install it, we run;
yarn add react-async-hook
or:
npm install react-async-hook --save
Then we can use it by writing:
import React from "react";
import { useAsync } from "react-async-hook";
const fetchName = async name =>
(await fetch(`https://api.agify.io/?name=${name}`)).json();
export default function App() {
const person = useAsync(fetchName, ["michael"]);
return (
<div>
{person.loading && <div>Loading</div>}
{person.error && <div>Error</div>}
{person.result && (
<div>
<div>{JSON.stringify(person.result)}</div>
</div>
)}
</div>
);
}
We created the fetchName function to get our data.
Then we use the useAsync hook with it and the value to pass into the parameter to make the API call.
Then person has the loading , error , and result properties.
loading indicates whether the data is loading.
error indicates the error state.
result has the response body.
react-context-refs
The react-context-refs library lets us get React refs via a context.
We can install it by running:
npm i react-context-refs
Then we can use it by writing:
import React from "react";
import { useContextRef } from "react-context-refs";
const Input = ({ value, onChange, hasError }) => {
const setRef = useContextRef({ hasError });
return (
<input
style={hasError ? { backgroundColor: "orange" } : {}}
ref={setRef}
value={value}
onChange={onChange}
/>
);
};
export default function App() {
const [val, setVal] = React.useState("");
return (
<div>
<Input value={val} onChange={e => setVal(e.target.value)} hasError />
</div>
);
}
We pass in the hasError value to the useContextRef hook so that we can pass the returned value to the ref.
Conclusion
reactive-react-redux is an alternative for React-Redux.
React-async-hook lets us get data asynchronously.
react-context-refs lets us pass things to the ref via a context.