Проблема с изменением моего вложенного состояния React Native

#javascript #reactjs #react-native

Вопрос:

У меня в приложении есть состояние, которое выглядит примерно так:

 const [companyCategories, setCompanyCategories] = useState({ loading: true, categories: null });
 

Я получаю свои категории из API и устанавливаю свои категории, как показано ниже:

   const fetchCategories = useCallback(() => {
    fetch(***link***)
      .then(res => {
        if (!res.ok) {
          throw new Error('Failed to fetch.');
        }
        return res.json()
      })
      .then(data => {
        setCompanyCategories({
          loading: false, categories: data.map((el, index) => {
            return {
              id: el.id,
              title: el.title,
              selected: false
            }
          })
        })
      })
      .catch(err => {
        console.log(err);
      });

  }, []);

 

и если я войду в свой companyCategories после этого:

 Object {
  "categories": Array [
    Object {
      "id": 7,
      "selected": false,
      "title": "Casual",
    },
    Object {
      "id": 8,
      "selected": false,
      "title": "Coffe Table",
    },
    Object {
      "id": 10,
      "selected": false,
      "title": "Dining Table",
    },
    Object {
      "id": 11,
      "selected": false,
      "title": "Workstation",
    },
  ],
  "loading": false,
}
 

и вот моя проблема : подумайте, что я показываю эти категории в виде кнопок в пользовательском интерфейсе приложения, и когда пользователь нажимает на каждую из них, она меняется по цвету, и мне нужно изменить selected атрибут категории, для true которой по умолчанию все они являются ложными, означает, что ни один не выбран.
для этого я кодирую так:

   const onRadioBtnClick = (item) => {
    let updatedState = companyCategories.categories.map((el) => {
      if (el.id == item.id) {
        return {
          ...el,
          loading: true,
          categories: {
            ...el.categories,
            selected: !el.selected
          }
        }
      }
      setCompanyCategories(updatedState)
    });
  };

 

и это не работает, мне показывает undefined updatedState . как я могу манипулировать одним свойством моего вложенного состояния?

Ответ №1:

Вы встали setCompanyCategories(updatedState) не на ту линию.

Это должно быть

 const onRadioBtnClick = (item) => {
  let updatedState = companyCategories.categories.map((el) => {
    if (el.id == item.id) {
      return {
        ...el,
        loading: true,
        categories: {
          ...el.categories,
          selected: !el.selected
        }
      }
    }
  });
  setCompanyCategories(updatedState);
};