如何在Redux传奇中使用React Hook



我的解决方案


我正在为我的应用程序设置语言。但我有个问题。

我使用React.useContext()来设置语言。但当我在传奇的祝酒词中修复它时,它会记录:

[错误:钩子调用无效。钩子只能在主体内部调用功能组件。以下情况之一可能会发生这种情况原因:

  1. React和渲染器的版本可能不匹配(例如React DOM(
  2. 你可能违反了胡克规则
  3. 您可能在同一应用程序中有多个React副本请参阅https://reactjs.org/link/invalid-hook-call有关如何调试的提示并解决此问题。]

那么我可以在传奇中使用吗?如果我应该如何使用它?如果,你能给我一个解决方案吗。


最终的解决方案是传奇的道具消息。


这是我的"toast.js"文件的一个函数:

export function toastLoginSuccess() {
ToastAndroid.show(
LANGUAGES.toastLoginSuccess,
ToastAndroid.SHORT,
ToastAndroid.TOP,
);
}

使用LANGUAGE的是import * as LANGUAGES from '../asset/language';

并且CCD_ 3是CCD_ 4

我想把它改成const LANGUAGES = React.useContext(LanguageContext).language;

saga是一个类似于的文件

export function* fetchSigninSaga(action) {
try {
// ...
yield Toast.toastLoginSuccess())
} catch (error) {
// ...
yield Toast.toastLoginFail();
}
}

您需要首先在saga中注入您的上下文,以下是实现它的方法,

import createSagaMiddleware from "redux-saga";
const userService = createUserService(...);
const sagaMiddleware = createSagaMiddleware({
context: LanguageContext
});
sagaMiddleware.run(rootSaga);

一旦你已经注射,你可以按照以下方式使用它,

import { getContext } from "redux-saga/effects";
export function* loadUsersSagas(action) {
const languageContext = yield getContext("languageContext");
const language = yield languageContext.getLanguage();
...
}

有关更多信息,您可以查看getContext

我的解决方案是

export function toastLoginSuccess() {
AsyncStorage.getItem('language').then(value => {
switch (value) {
case 'en':
return ToastAndroid.show(
English.toastLoginSuccess,
ToastAndroid.SHORT,
ToastAndroid.TOP,
);
default:
return ToastAndroid.show(
Vietnamese.toastLoginSuccess,
ToastAndroid.SHORT,
ToastAndroid.TOP,
);
}
});
}

当我更改LanguageContext时,我将在AsyncStorage上保存语言状态。

最新更新