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