Redux Toolkit: createSlice และ configureStore
กำหนดส่วนย่อยของสถานะด้วย createSlice รวมส่วนเหล่านั้นใน configureStore และส่ง action จากคอมโพเนนต์ React ด้วย useDispatch และ useSelector
Redux Toolkit: createSlice และ configureStore เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทำไมจึงใช้ Redux Toolkit
Redux Toolkit (RTK) เป็นแนวทางอย่างเป็นทางการที่กำหนดรูปแบบชัดเจนสำหรับการเขียนตรรกะของ Redux โดยขจัดโค้ดประกอบซ้ำซ้อนของ Redux แบบดั้งเดิม เช่น ไม่ต้องเขียนสตริงชนิดของแอ็กชันเอง ไม่ต้องเขียนตัวลดสถานะที่ยืดยาว และไม่ต้องตั้งค่า store ที่ซับซ้อน
การติดตั้ง Redux Toolkit
ติดตั้งทั้ง RTK และการผูกเข้ากับ React
npm install @reduxjs/toolkit react-reduxcreateSlice — สถานะ + ตัวลดสถานะ + แอ็กชัน
createSlice สร้างส่วนหนึ่งของสถานะพร้อมตัวลดสถานะและตัวสร้างแอ็กชันในคำสั่งเดียว เบื้องหลังนั้นใช้ Immer เพื่ออัปเดตสถานะโดยไม่เปลี่ยนค่าเดิม
import { createSlice } from '@reduxjs/toolkit';
const counterSlice = createSlice({
name: 'counter',
initialState: { value: 0 },
reducers: {
increment: state => { state.value++; }, // Immer: mutate directly
decrement: state => { state.value--; },
reset: state => { state.value = 0; },
incrementBy: (state, action) => { state.value += action.payload; }
}
});
export const { increment, decrement, reset, incrementBy } = counterSlice.actions;
export default counterSlice.reducer;configureStore — การประกอบ Store
configureStore สร้าง Redux store พร้อมค่าเริ่มต้นที่เหมาะสม ได้แก่ เปิดใช้ Redux DevTools และรวมมิดเดิลแวร์ thunk ไว้แล้ว
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';
import cartReducer from './cartSlice';
export const store = configureStore({
reducer: {
counter: counterReducer,
cart: cartReducer,
}
});
// TypeScript types:
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;การจัดเตรียม Store
ครอบ app ของคุณด้วย <Provider store={store}> จาก react-redux
import { Provider } from 'react-redux';
import { store } from './store';
ReactDOM.createRoot(document.getElementById('root')!).render(
<Provider store={store}>
<App />
</Provider>
);useSelector — การอ่านสถานะ
useSelector(selector) อ่านข้อมูลจาก store และเรนเดอร์คอมโพเนนต์ใหม่เมื่อส่วนของสถานะที่เลือกมีการเปลี่ยนแปลง
import { useSelector } from 'react-redux';
import type { RootState } from './store';
function Counter() {
const count = useSelector((state: RootState) => state.counter.value);
return <p>Count: {count}</p>;
}useDispatch — การส่งแอ็กชัน
useDispatch() คืนค่าฟังก์ชัน dispatch ของ store ให้เรียกใช้ฟังก์ชันนี้พร้อมตัวสร้างแอ็กชันเพื่อทำให้สถานะเปลี่ยนแปลง
import { useDispatch } from 'react-redux';
import { increment, incrementBy } from './counterSlice';
function Controls() {
const dispatch = useDispatch();
return (
<div>
<button onClick={() => dispatch(increment())}>+1</button>
<button onClick={() => dispatch(incrementBy(5))}>+5</button>
</div>
);
}createAsyncThunk — แอ็กชันแบบอะซิงก์
createAsyncThunk ของ RTK จัดการการดำเนินการแบบอะซิงก์ เช่น การเรียก API และส่งแอ็กชัน pending/fulfilled/rejected โดยอัตโนมัติ
import { createAsyncThunk } from '@reduxjs/toolkit';
export const fetchUser = createAsyncThunk(
'user/fetchById',
async (userId: string) => {
const res = await fetch(`/api/users/${userId}`);
return res.json(); // becomes action.payload on fulfilled
}
);
// In slice:
extraReducers: (builder) => {
builder
.addCase(fetchUser.pending, state => { state.loading = true; })
.addCase(fetchUser.fulfilled, (state, action) => {
state.loading = false;
state.user = action.payload;
});
}RTK Query — การดึงข้อมูลในตัว
RTK Query ซึ่งเป็นส่วนหนึ่งของ RTK มีการดึงข้อมูล การแคช และการทำให้ข้อมูลไม่ถูกต้องโดยอัตโนมัติ ให้กำหนดปลายทาง API แล้วรับฮุกที่สร้างขึ้นโดยอัตโนมัติ
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
export const api = createApi({
baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
endpoints: (build) => ({
getUsers: build.query<User[], void>({ query: () => 'users' }),
})
});
// Generated hook:
const { data, isLoading, error } = api.useGetUsersQuery();Immer ในตัวลดสถานะ
RTK ใช้ Immer ภายใน ดังนั้นตัวลดสถานะของ slice จึงสามารถเปลี่ยนสถานะโดยตรงได้ Immer จะตรวจจับการเปลี่ยนแปลงและสร้างออบเจ็กต์สถานะใหม่ที่ไม่เปลี่ยนค่าเดิมให้ คุณจึงได้ความสะดวกในการเขียนแบบเปลี่ยนค่า พร้อมความปลอดภัยของการไม่เปลี่ยนค่าเดิม
Redux DevTools
ส่วนขยายเบราว์เซอร์ Redux DevTools ช่วยให้คุณตรวจสอบแอ็กชันทุกตัวที่ถูกส่ง สถานะที่ได้ และแม้แต่ย้อนดูตามเวลาได้ โดยกระโดดกลับไปยังสถานะก่อนหน้าใด ๆ จึงมีประโยชน์อย่างยิ่งสำหรับการแก้ไขข้อบกพร่องของลำดับการเปลี่ยนสถานะที่ซับซ้อน
ตรวจสอบอย่างรวดเร็ว
createSlice ใน Redux Toolkit สร้างอะไรให้โดยอัตโนมัติ
สรุป: Redux Toolkit
createSlice รวมตัวลดสถานะกับแอ็กชันไว้ในคำจำกัดความเดียว Immer ช่วยให้คุณ “เปลี่ยนแปลง” สถานะได้อย่างปลอดภัย configureStore ประกอบตัวลดสถานะเข้ากับ DevTools และ thunk useSelector ใช้อ่านสถานะ useDispatch ใช้ส่งแอ็กชัน createAsyncThunk ใช้สำหรับลำดับการทำงานแบบอะซิงก์ และ RTK Query ใช้สำหรับการดึงข้อมูลเต็มรูปแบบพร้อมการแคช
คำถามที่พบบ่อย
บทเรียน “Redux Toolkit: createSlice และ configureStore” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Redux Toolkit: createSlice และ configureStore” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Redux Toolkit: createSlice และ configureStore”
กำหนดส่วนย่อยของสถานะด้วย createSlice รวมส่วนเหล่านั้นใน configureStore และส่ง action จากคอมโพเนนต์ React ด้วย useDispatch และ useSelector คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “Redux Toolkit: createSlice และ configureStore” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม
ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Redux Toolkit: createSlice และ configureStore
- Zustand สำหรับสถานะ React แบบเบา
- Pinia สำหรับ Vue: defineStore และ storeToRefs
- ควรใช้สถานะส่วนกลางหรือสถานะภายในเมื่อใด