進階實作:將非同步取得的資料(API)儲存至 Store 狀態
進階實作:將非同步取得的資料(API)儲存至 Store 狀態
結構
Slice
// ...src/slices/productSlice.js
import {createSlice} from "@reduxjs/toolkit";
import axios from "axios";
export const productSlice = createSlice({
name:'product',
initialState:{
products: [] // 資料是矩陣型態所以要用`[]`
},
// 更新state的值
reducers:{
//
setProducts:(state,action) => {
state.products = action.payload;
},
//
}
})
export const { setProducts } = productSlice.actions //解構
export default productSlice.reducer
component
// ...src/components/xxxComponent.jsx
import {useSelector, useDispatch} from "react-redux";
import {setProducts} from './slice/productSlice'
const API_url = 'https://domainname.xxx'
const productsComponent = () =>{
const products = useSelector(state => {
console.log(state.products.products); //
return state.products.products
})
// dispath
const dispatch = useDispatch()
useEffect (()=> {
// 立即函式寫法
(async () => {
const res = await axios.get(`${API_url}`)
console.log(res);
dispath(setProducts(res.data.products))
})()
// 常規寫法
const getProducts = async () => {
const res = await axios.get(API_url);
console.log(res);
dispatch(setProducts(res.data.products));
};
getProducts();
},[])
return (<>
</>);
}
warning
- 此處
async await未加上try...catch是為了方便理解,實務上請記得加上 - 盡量不要在 Slice 中寫 async...await 語法,可以使用,但容易出錯,因為 reducers 本身僅能處理同步的狀態