JAVASCRIPT
usereducer react
import React, { useReducer } from 'react'
import { render } from 'react-dom'
const types = {
PET: 'PET',
COLOR: 'COLOR',
}
const reducer = (state, action) => {
switch (action.type) {
case types.PET:
return { ...state, pet: action.value }
case types.COLOR:
return { ...state, color: action.value }
}
}
const initialState = {
color: 'black',
pet: 'cat',
}
export default function App() {
const [state, dispatch] = useReducer(reducer, initialState)
return (
<div>
<label>Choose a color and a pet: </label>
<br />
<select
value={state.color}
onChange={event => {
dispatch({ type: types.COLOR, value: event.target.value })
}}
>
<option value="black">Black</option>
<option value="pink">Pink</option>
<option value="blue">Blue</option>
</select>
<select
value={state.pet}
onChange={event => {
dispatch({ type: types.PET, value: event.target.value })
}}
>
<option value="cat">Cat</option>
<option value="dog">Dog</option>
<option value="mouse">Mouse</option>
</select>
<br />
<br />
You chose a {state.color} {state.pet}
</div>
)
}
render(<App />, document.querySelector('#app'))
useReducer React
import React, { useReducer } from "react";
const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
break;
case "decrement":
return { count: state.count - 1 };
break;
default:
throw new Error();
}
};
const UseReduceExample = () => {
const [state, dispatch] = useReducer(reducer, initialCount );
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
};
export default UseReduceExample;
useReducer React
import React, { useReducer } from "react";
const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
break;
case "decrement":
return { count: state.count - 1 };
break;
default:
throw new Error();
}
};
const UseReduceExample = () => {
const [state, dispatch] = useReducer(reducer, initialCount );
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
};
export default UseReduceExample;
useReducer Hooks
const [state, dispatch] = useReducer(reducer, initialArg, init);
const initialState = {count: 0};
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}
const [state, dispatch] = useReducer(
reducer,
{count: initialCount}
);
useReducer React
import React, { useReducer } from "react";
const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
break;
case "decrement":
return { count: state.count - 1 };
break;
default:
throw new Error();
}
};
const UseReduceExample = () => {
const [state, dispatch] = useReducer(reducer, initialCount );
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
};
export default UseReduceExample;
useReducer React
import React, { useReducer } from "react";
const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
break;
case "decrement":
return { count: state.count - 1 };
break;
default:
throw new Error();
}
};
const UseReduceExample = () => {
const [state, dispatch] = useReducer(reducer, initialCount );
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
};
export default UseReduceExample;
useReducer React
import React, { useReducer } from "react";
const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
break;
case "decrement":
return { count: state.count - 1 };
break;
default:
throw new Error();
}
};
const UseReduceExample = () => {
const [state, dispatch] = useReducer(reducer, initialCount );
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
};
export default UseReduceExample;
useReducer React
import React, { useReducer } from "react";
const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
break;
case "decrement":
return { count: state.count - 1 };
break;
default:
throw new Error();
}
};
const UseReduceExample = () => {
const [state, dispatch] = useReducer(reducer, initialCount );
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
};
export default UseReduceExample;
React useReducer Hook
import { useReducer } from "react";
import ReactDOM from "react-dom/client";
const initialTodos = [
{
id: 1,
title: "Todo 1",
complete: false,
},
{
id: 2,
title: "Todo 2",
complete: false,
},
];
const reducer = (state, action) => {
switch (action.type) {
case "COMPLETE":
return state.map((todo) => {
if (todo.id === action.id) {
return { ...todo, complete: !todo.complete };
} else {
return todo;
}
});
default:
return state;
}
};
function Todos() {
const [todos, dispatch] = useReducer(reducer, initialTodos);
const handleComplete = (todo) => {
dispatch({ type: "COMPLETE", id: todo.id });
};
return (
<>
{todos.map((todo) => (
<div key={todo.id}>
<label>
<input
type="checkbox"
checked={todo.complete}
onChange={() => handleComplete(todo)}
/>
{todo.title}
</label>
</div>
))}
</>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Todos />);
useReducer React
import React, { useReducer } from "react";
const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
break;
case "decrement":
return { count: state.count - 1 };
break;
default:
throw new Error();
}
};
const UseReduceExample = () => {
const [state, dispatch] = useReducer(reducer, initialCount );
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
};
export default UseReduceExample;
useReducer React
import React, { useReducer } from "react";
const reducer = (state, action) => {
switch (action.type) {
case "increment":
return { count: state.count + 1 };
break;
case "decrement":
return { count: state.count - 1 };
break;
default:
throw new Error();
}
};
const UseReduceExample = () => {
const [state, dispatch] = useReducer(reducer, initialCount );
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: "increment" })}>+</button>
</>
);
};
export default UseReduceExample;
useReducer() hook react
code snippet
https://codesandbox.io/s/usereducer-demo-zxguu?file=/src/App.js
usereducer react
const [state, dispatch] = useReducer(reducer, initialArg, init);
usestate or usereducer
//When it's just an independent element of state you're managing
useState
useReducer in react
const [state, dispatch] = useReducer(
reducer,
{count: initialCount}
);
useReducer in react
function init(initialCount) {
return {count: initialCount};
}
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
case 'reset':
return init(action.payload);
default:
throw new Error();
}
}
function Counter({initialCount}) {
const [state, dispatch] = useReducer(reducer, initialCount, init);
return (
<>
Count: {state.count}
<button
onClick={() => dispatch({type: 'reset', payload: initialCount})}>
Reset
</button>
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}