简体   繁体   English

SetState无法与传播运算符一起使用

[英]SetState not working with spread operator

I have a language switcher in a React native app, it has the selected language ticked, which is stored in state. 我在React本机应用程序中有一个语言切换器,它选中了所选的语言,并存储在状态中。 However this is not working, any advice appreciated. 但是,这不起作用,任何建议都值得赞赏。 The code is as below. 代码如下。 The selectedLanguage is being populated so it knows what needs updating but it's not updating the state object. selectedLanguage正在填充,因此它知道需要更新哪些内容,但不更新状态对象。

   constructor(props) {
    super(props);
    this.state = {
        languages: [
            {
                language: 'Dutch',
                selected: false,
            },
            {
                language: 'English',
                selected: true,
            },
            {
                language: 'French',
                selected: false,
            },
            {
                language: 'German',
                selected: false,
            },
            {
                language: 'Polish',
                selected: false,
            }
        ],

    };
};

changeLanguage(selectedLanguage){

    this.state.languages.map((language) => {
        if(language.language === selectedLanguage){
           this.setState(prevState => ([
               ...prevState.languages, {
                   language: selectedLanguage,
                   selected: true,
               }
           ]));
        }
    });
}

First need to find out the right object for given selectedLanguage from an array. 首先需要从数组中查找给定的selectedLanguage的正确对象。 Use Array#map to traverse and update the matched object selected prop value with boolean true and rest to false . 使用Array#map遍历并更新匹配的对象(布尔true ,其余值为false selected prop值。

const {languages} = this.state;

const updatedLang = languages.map((lang, key) => {
  if (lang.language == selectedLanguage) {
    lang.selected = true;
  } else {
    lang.selected = false;
  }
  return lang;
})

Now do setState . 现在执行setState

this.setState(prevState => ({languages: updatedLang}));

The spread operator isn't going to deep compare objects in an array. 散布运算符不会深入比较数组中的对象。 You've got to either move from a languages array to a languages object, as in: 您必须从一个语言数组移动到一个语言对象,如下所示:

languages: {
  Dutch: false,
  English: true,
  ...
}

Or, you need to copy and replace: 或者,您需要复制并替换:

changeLanguage(selectedLanguage){

this.state.languages.map((language, index) => {
    if(language.language === selectedLanguage){
       this.setState(prevState => {
           const newLangs = [...prevState.languages];
           newLangs[index].selected = true;
           return newLangs;
       });
    }
});
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM