请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师您好,dispatch只运行一次,确执行了两次,是什么原因

图片需要点击才能查看完整的图片。

图片描述
图片描述

图片描述

//langSlice.ts
import { createSlice, PayloadAction,createAsyncThunk } from "@reduxjs/toolkit";
import axios from "axios";
import {api} from "../config/api";

export interface LangType{
    id: number | undefined;
    name: string | undefined;
    label: string | undefined;
}

export interface LanguageState {
    loaded: boolean,
    language: LangType,
    languageList: LangType[];
}

const defaultState: LanguageState = {
    loaded: false,
    language: { id: 1, label: "简体中文", name: "zh-cn" },
    languageList: [
        { id: 1, label: "简体中文", name: "zh-cn" },
        { id: 2, label: "繁体中文", name: "zh-tw" },
    ],
};


export const getLangs = createAsyncThunk(
    "lang/langs",
    async (p, thunkAPI) => {
        console.log("22222");
        const {data} = await axios.get(api.i18n.langs);
        return data.data;
    }
);

export const langSlice = createSlice({
    name: 'lang',
    initialState: defaultState,
    reducers: {
        changeLang: (state, action: PayloadAction<LangType>)=>{
            state.language = action.payload;
        }
    }, 
    extraReducers: {
        [getLangs.fulfilled.type]: (state, action: PayloadAction<LangType[]>) => {
            let languageList = action.payload;
            let langCode = localStorage.getItem("i18nextLng") || window.navigator.language || 'zh-cn';
            langCode = langCode.toLocaleLowerCase();
            
            let lang = languageList.find( lng => lng.name == langCode);
            if(!lang){
                lang = languageList[0];
            }

            state.language = lang;
            state.languageList = languageList;

            console.log(state.languageList);
        },
    },
});

正在回答 回答被采纳积分+3

1回答

阿莱克斯刘 2021-06-14 09:30:53

你可以试试把dispatch放进 useEffect hook 中,通过副作用来控制dispatch的时机


0 回复 有任何疑惑可以回复我~
  • 提问者 慕村5307545 #1
    谢谢,老师,我刚才加了个  document.title = t(''); 然后出现无限的getLangs()了,我才想起你说那个无限call后台的useEffect, 我就把,document.title,和getLangs(),都放进了useEffect里面解决了。
    回复 有任何疑惑可以回复我~ 2021-06-14 21:18:44
  • ok,就是这样,反正只要是。涉及到组件状态转换都需要使用副作用来处理
    回复 有任何疑惑可以回复我~ 2021-06-15 17:05:08
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号