组件未重新渲染,但通过react挂钩改变了redux状态

时间:2019-05-20 11:00:50

标签: reactjs react-redux redux-thunk react-hooks

我目前正在尝试从react-redux connect() hoc切换到将在react-redux 7.1.x中引入的新钩子api。

一些示例已经在工作,但我无法解决以下问题。我有以下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。

我将不胜感激。如果我应该提供以前如何做的示例,请告诉我。预先感谢。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。在这种情况下,您必须使用“ 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>
    );
}