Padahal jika saya pakai useReducer
biasa, dia ga bakal error
Disini saya coba implementasi ke operasi matematika sederhana(tambah, kurang). Sebagai catatan, di project saya sudah terinstall chakra-ui
untuk styling. Emang Overkill sih hehe, tapi kalo buat keperluan ngetest doang mah gapapa.
import { Button, Container, Flex, Text } from "@chakra-ui/react";
import { atom } from "jotai";
import { useReducerAtom } from "jotai/utils";
function reducer(
state: { value: number },
action: { operation: "TAMBAH" | "KURANG" }
) {
switch (action.operation) {
case "TAMBAH":
return {
value: state.value + 1,
};
case "KURANG":
return {
value: state.value - 1,
};
default:
throw new Error();
}
}
const reducerAtom = atom<{ value: number }>({ value: 0 });
Fokus di bagian fungsi reducer
, saya pakai switch case untuk pengkondisian. Pake if else juga bisa.
operation
nya bernilai “TAMBAH”, maka nilai akan bertambah 1.operation
nya bernilai “KURANG”, maka nilai akan berkurang 1.Saya juga menginisialisasi reducerAtom
sebagai initialAtom.
Oke mari kita lanjut
export default function App() {
const [state, dispatch] = useReducerAtom(reducerAtom, reducer);
return (
<Container>
<Flex justify="center" h="100vh" alignItems="center" flexDir="column">
<Flex gap={3}>
<Button onClick={() => dispatch({ operation: "TAMBAH" })}>+</Button>
<Text>{state.value}</Text>
<Button onClick={() => dispatch({ operation: "KURANG" })}>-</Button>
</Flex>
</Flex>
</Container>
);
}
Seperti yang sudah saya singgung di awal, useReducerAtom
agak berbeda dengan useReducer
biasa. Di dalam useReducerAtom
, kita memasukkan nilai reducerAtom
dan fungsi reducer
.
Keseluruhan code:
import { Button, Container, Flex, Text } from "@chakra-ui/react";
import { atom } from "jotai";
import { useReducerAtom } from "jotai/utils";
function reducer(
state: { value: number },
action: { operation: "TAMBAH" | "KURANG" }
) {
switch (action.operation) {
case "TAMBAH":
return {
value: state.value + 1,
};
case "KURANG":
return {
value: state.value - 1,
};
default:
throw new Error();
}
}
const reducerAtom = atom<{ value: number }>({ value: 0 });
export default function App() {
const [state, dispatch] = useReducerAtom(reducerAtom, reducer);
return (
<Container>
<Flex justify="center" h="100vh" alignItems="center" flexDir="column">
<Flex gap={3}>
<Button onClick={() => dispatch({ operation: "TAMBAH" })}>+</Button>
<Text>{state.value}</Text>
<Button onClick={() => dispatch({ operation: "KURANG" })}>-</Button>
</Flex>
</Flex>
</Container>
);
}
Jika dijalankan, maka akan seperti ini:
Yep, mungkin sekian untuk tulisan kali ini. Semoga bermanfaat :)