组件不重新渲染,但 redux 状态已通过反应钩子改变
Component does not rerender but redux state has changed via react hooks
我目前正在尝试从 react-redux connect() hoc 切换到将在 react-redux 7 中引入的新钩子 api。1.x.
一些示例已经可以运行,但我无法解决以下问题。我有以下 redux 函数:
export const translate = key => (dispatch, getState) =>
getState().translations.data[key] || "";
它将密钥翻译成给定的语言。在我的组件中,我目前正在这样调用函数:
import React, { Fragment, useCallback } from "react";
import { Button } from "@material-ui/core";
import { useDispatch } from "react-redux";
import { LanguageActions } from "../../redux/actions";
export default function LanguageSwitcher() {
const dispatch = useDispatch();
const translateKey = useCallback(
key => dispatch(LanguageActions.translate(key)),
[]
);
const requestCustomLanguage = useCallback(
requestedLanguage =>
dispatch(LanguageActions.loadCustomLanguage(requestedLanguage)),
[]
);
return (
<Fragment>
<Button color="primary" onClick={() => requestCustomLanguage("de")}>
{translateKey("german")}
</Button>
|
<Button
color="secondary"
onClick={() => requestCustomLanguage("en")}
>
{translateKey("english")}
</Button>
</Fragment>
);
}
当我点击按钮时,会调用 redux 操作 (loadCustomLanguage()),我可以从我的 redux devtools 中看到 redux 中语言文件的切换。我希望由于新内容,我的组件会重新渲染并显示按钮的新翻译。
我不确定我是否理解 7.1.x 文档中的所有内容,但我认为我必须使用 useDispatch() 将操作分派给 redux。
如有任何帮助,我将不胜感激。如果我应该提供有关我以前如何做的示例,请告诉我。提前致谢。
我找到了解决问题的方法。在这种情况下,您必须使用 "useSelector"。该组件现在看起来像这样:
import React, { Fragment, useCallback } from "react";
import { useDispatch, useSelector } from "react-redux";
import { Button } from "@material-ui/core";
import { LanguageActions } from "../../../../redux/actions";
export default function LanguageSwitcher() {
const dispatch = useDispatch();
const requestCustomLanguage = useCallback(
requestedLanguage =>
dispatch(LanguageActions.loadCustomLanguage(requestedLanguage)),
[]
);
const useTranslations = () =>
useSelector(state => state.translations.data, []);
const translations = useTranslations();
return (
<Fragment>
<Button color="primary" onClick={() => requestCustomLanguage("de")}>
{translations.english}
</Button>
|
<Button
color="secondary"
onClick={() => requestCustomLanguage("en")}
>
{translations.german}
</Button>
</Fragment>
);
}
我目前正在尝试从 react-redux connect() hoc 切换到将在 react-redux 7 中引入的新钩子 api。1.x.
一些示例已经可以运行,但我无法解决以下问题。我有以下 redux 函数:
export const translate = key => (dispatch, getState) =>
getState().translations.data[key] || "";
它将密钥翻译成给定的语言。在我的组件中,我目前正在这样调用函数:
import React, { Fragment, useCallback } from "react";
import { Button } from "@material-ui/core";
import { useDispatch } from "react-redux";
import { LanguageActions } from "../../redux/actions";
export default function LanguageSwitcher() {
const dispatch = useDispatch();
const translateKey = useCallback(
key => dispatch(LanguageActions.translate(key)),
[]
);
const requestCustomLanguage = useCallback(
requestedLanguage =>
dispatch(LanguageActions.loadCustomLanguage(requestedLanguage)),
[]
);
return (
<Fragment>
<Button color="primary" onClick={() => requestCustomLanguage("de")}>
{translateKey("german")}
</Button>
|
<Button
color="secondary"
onClick={() => requestCustomLanguage("en")}
>
{translateKey("english")}
</Button>
</Fragment>
);
}
当我点击按钮时,会调用 redux 操作 (loadCustomLanguage()),我可以从我的 redux devtools 中看到 redux 中语言文件的切换。我希望由于新内容,我的组件会重新渲染并显示按钮的新翻译。
我不确定我是否理解 7.1.x 文档中的所有内容,但我认为我必须使用 useDispatch() 将操作分派给 redux。
如有任何帮助,我将不胜感激。如果我应该提供有关我以前如何做的示例,请告诉我。提前致谢。
我找到了解决问题的方法。在这种情况下,您必须使用 "useSelector"。该组件现在看起来像这样:
import React, { Fragment, useCallback } from "react";
import { useDispatch, useSelector } from "react-redux";
import { Button } from "@material-ui/core";
import { LanguageActions } from "../../../../redux/actions";
export default function LanguageSwitcher() {
const dispatch = useDispatch();
const requestCustomLanguage = useCallback(
requestedLanguage =>
dispatch(LanguageActions.loadCustomLanguage(requestedLanguage)),
[]
);
const useTranslations = () =>
useSelector(state => state.translations.data, []);
const translations = useTranslations();
return (
<Fragment>
<Button color="primary" onClick={() => requestCustomLanguage("de")}>
{translations.english}
</Button>
|
<Button
color="secondary"
onClick={() => requestCustomLanguage("en")}
>
{translations.german}
</Button>
</Fragment>
);
}