Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript redux状态不变_Javascript_Reactjs_React Native_Redux - Fatal编程技术网

Javascript redux状态不变

Javascript redux状态不变,javascript,reactjs,react-native,redux,Javascript,Reactjs,React Native,Redux,我已经设置了redux存储,但是当我尝试使用mapStateToProps和mapDispatchToProps对状态进行更改时,我总是得到默认状态。因此,在account.js中,我希望获得所选语言,然后将其添加到redux存储中。我尝试在其他组件中调用它,但最终总是使用reducer/Language.js defaultState。我做错了什么 Account.js class Account extends React.Component { static navigat

我已经设置了redux存储,但是当我尝试使用mapStateToProps和mapDispatchToProps对状态进行更改时,我总是得到默认状态。因此,在account.js中,我希望获得所选语言,然后将其添加到redux存储中。我尝试在其他组件中调用它,但最终总是使用reducer/Language.js defaultState。我做错了什么

Account.js

class Account extends React.Component {
        static navigationOptions = ({ navigation }) => {};

        constructor(props) {
            super(props);

            this.state = {
                language: {
                    sq: true,
                    en: false,
                    selected: '',
                },
            };
        }

        changeLanguage = (selected) => {
            if (this.state.sq) {
                this.setState({ selected: 'sq' });
            } else {
                this.setState({ selected: 'en' });
            }
        };


        render() {
            const navigation = this.props.navigation;
            return (
                <ScrollView>
                <View>
                        <ThemeProvider>
                            <TableView header={I18n.t('account.lang_label')}>
                                <CheckboxRow
                                    selected={this.state.language.sq}
                                    onPress={() => {
                                        this.setState(state => ({
                                            language: {
                                                sq: !state.language.sq,
                                                en: !state.language.en,
                                            },
                                        }));
                                        this.changeLanguage();
                                    }}
                                    title={I18n.t('account.albanian')}
                                />
                                <CheckboxRow
                                    selected={this.state.language.en}
                                    onPress={() =>
                                        this.setState(state => ({
                                            language: {
                                                en: !state.language.en,
                                                sq: !state.language.sq,
                                            },
                                        }))
                                    }
                                    title={I18n.t('account.english')}
                                />
                            </TableView>
                        </ThemeProvider>
                    </View>
                                </ScrollView>
            );
        }
    }

    const mapDispatchToProps = dispatch => {
        return {
            changeLanguage: (selected) => { dispatch(changeLanguageEn(selected))},
        };
    };

    const mapStateToProps = state => {
        return {
            language: state.language.selected,

        };
    };

    export default withNavigation(connect(
        mapStateToProps,
        mapDispatchToProps
    )(Account));
reducers/Language.js

import {CHANGE_LANGUAGE_EN, CHANGE_LANGUAGE_AL} from "./types";

export const changeLanguageEn = (language) => {
    return {
        type: CHANGE_LANGUAGE_EN,
        lang: language,
    }
};

export const changeLanguageAl = (language) => {
    return {
        type: CHANGE_LANGUAGE_AL,
        lang: language,
    }
};
const defaultState = {
    lang: '',
};

export default function reducer(state = defaultState, action) {
    switch (action.type) {
        case 'CHANGE_LANGUAGE_EN':
           return {...state, lang: 'en'};
        case 'CHANGE_LANGUAGE_AL':
            return Object.assign({}, state, {
                lang: 'sq',
            });
        default:
            return state;
    }
}

您对所选语言的访问不正确<代码>状态.语言.选定

在reducer中,您正在状态中添加
lang
属性,因此在MapStateTrops中使用相同的属性名称访问它

const mapStateToProps = state => {
    return {
        language: state.language.lang,
    };
};

您对所选语言的访问不正确<代码>状态.语言.选定

在reducer中,您正在状态中添加
lang
属性,因此在MapStateTrops中使用相同的属性名称访问它

const mapStateToProps = state => {
    return {
        language: state.language.lang,
    };
};

MapStateTrops
函数中,直接尝试使用
state.lang

const mapStateToProps = state => {
    return {
        language: state.lang,
    };
};

希望这能起作用。

在您的
MapStateTrops
函数中,直接尝试使用
state.lang

const mapStateToProps = state => {
    return {
        language: state.lang,
    };
};

希望这能起作用。

我不完全确定我是否理解你的问题,但听起来你好像想用
帐户的内部状态更新redux状态?您应该能够做到:

this.props.changeLanguage(this.state.language.selected)

您在组件上也定义了一个方法
changeLanguage
,也许您可以在更改内部状态后在该方法中执行上面的一行

另外,在
帐户
类中的changeLanguage方法中,我认为
这个.state.sq
不存在,因为sq是
语言
状态对象中的一个键。相反,它应该是
this.state.language.sq
。您也不需要将所选参数添加到此方法中。尝试使您的changeLanguage方法如下所示

changeLanguage = () => {
    if (this.state.sq) {
        this.setState({ language.selected: 'sq' });
    } else {
        this.setState({ language.selected: 'en' });
    }
   // dispatch your action here after updating the state
  this.props.changeLanguage(this.state.language.selected)
};

现在调用
this.changeLanguage()
将更新您的内部状态,然后发送您的changeLanguage redux操作

不完全确定我是否理解您的问题,但听起来您正试图用
帐户的内部状态更新redux状态
?您应该能够做到:

this.props.changeLanguage(this.state.language.selected)

您在组件上也定义了一个方法
changeLanguage
,也许您可以在更改内部状态后在该方法中执行上面的一行

另外,在
帐户
类中的changeLanguage方法中,我认为
这个.state.sq
不存在,因为sq是
语言
状态对象中的一个键。相反,它应该是
this.state.language.sq
。您也不需要将所选参数添加到此方法中。尝试使您的changeLanguage方法如下所示

changeLanguage = () => {
    if (this.state.sq) {
        this.setState({ language.selected: 'sq' });
    } else {
        this.setState({ language.selected: 'en' });
    }
   // dispatch your action here after updating the state
  this.props.changeLanguage(this.state.language.selected)
};

现在调用
this.changeLanguage()
将更新您的内部状态,然后发送您的changeLanguage redux操作

您将获得默认状态,这意味着您将获得
lang:“
?@McRist是的,您将获得默认状态,这意味着您将获得lang:“
?@McRist是的,没错,但是我如何将所选值添加到lang属性?您已经将其添加到了reducer中。在MapStateTops中使用它作为
语言:state.language.lang
,现在您可以作为组件中的道具访问它作为->
this.props.language
谢谢,但我是说,如何将此.state.selected值传递给还原程序lang prop您已经将其传递给了操作,但是在reducer中,您总是返回
lang:'en'
,要返回所选语言,您应该执行:
return{…state,lang:action.lang}
我更改了这个
const-mapStateToProps=state=>{return{language:state.language.lang,};}
但是我如何将所选值添加到lang属性?您已经将其添加到了reducer中。在MapStateTops中使用它作为
语言:state.language.lang
,现在您可以作为组件中的道具访问它作为->
this.props.language
谢谢,但我是说,如何将此.state.selected值传递给还原程序lang prop您已经将其传递给了操作,但是在reducer中,您总是返回
lang:'en'
,要返回所选语言,您应该执行:
return{…state,lang:action.lang}我更改了这个
const-mapStateToProps=state=>{return{language:state.language.lang,};}