Skip to content
This repository has been archived by the owner on Dec 24, 2022. It is now read-only.

Latest commit

 

History

History
87 lines (69 loc) · 2.92 KB

redux-thunk.md

File metadata and controls

87 lines (69 loc) · 2.92 KB

Redux Thunk

Redux Thunk ทำให้เราสามารถเขียน Asynchronous Logic ได้ใน redux flow เรามาลองดูกัน

เราจะทำการจัดการ State ของ Posts ด้วย Redux ให้เราสร้าง src/features/postsSlice.js ขึ้นมา

import { createSlice } from "@reduxjs/toolkit";

const postsSlice = createSlice({
  name: "posts",
  initialState: {
    posts: [],
    status: "idle",
    error: null,
  },
  reducers: {},
  },
});

export default postsSlice.reducer;
  • เราจะตั้งชื่อ slice นี้ว่า posts
  • initialState ที่เกี่ยวข้องในการจัดการ posts state คือ posts array, status (idle, pending), และ error

จากนั้นให้เรา export reducer ออกไปเอาไปประกอบที่ src/app/store

import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "../features/counter/counterSlice";
import postsReducer from "../features/posts/postsSlice";

export default configureStore({
  reducer: {
    counter: counterReducer,
    posts: postsReducer,
  },
});

จากนั้นเราจะสร้าง function เอาไว้ดึงข้อมูล posts จาก server ชื่อว่า getPosts

const getPosts = () => async (dispatch) => {
  dispatch(postsLoading());
  let response = await fetch("http://localhost:8000/posts");
  let posts = await response.json();
  dispatch(postsReceived(posts));
};

export { getPosts };

🌟 ให้สังเกตดี ๆ getPosts เป็น function ที่ return function ที่มี parameter เป็น dispatch ตัวนี้เราเรียกว่า "Thunk"

ใน Thunk เราสามารถเรียกใช้ dispatch function ได้

ซึ่งเราจะ dispatch postsLoading action เพราะว่าเวลาเราดึงข้อมูล posts state แรกที่เราจะเจอคือ loading state

จากนั้นเราจะทำการ fetch ข้อมูล เมื่อ fetch ข้อมูลเสร็จเราจะทำการ dispatch postsReceived action แล้วส่ง payload ไปเป็นข้อมูล posts ที่ได้มาจาก server

const postsSlice = createSlice({
  name: "posts",
  initialState: {
    posts: [],
    status: "idle",
    error: null,
  },
  reducers: {
    postsLoading: (state) => {
      if (state.status === "idle") {
        state.status = "pending";
      }
    },
    postsReceived: (state, action) => {
      if (state.status === "pending") {
        state.status = "idle";
        state.posts = action.payload.data;
      }
    },
  },
});

export const { postsLoading, postsReceived } = postsSlice.actions;