состояние компонента получает старое состояние при редуксе при изменении средства выбора - PullRequest
0 голосов
/ 01 июня 2019

доброго дня всем,

Я работаю над реактивным проектом, в котором у меня есть сборщик, чтобы выбрать компанию, из которой будут получены ваши данные. когда я щелкаю по средству выбора, он ведет себя нормально и значение изменяется соответствующим образом, но состояние компонента получает предыдущее избыточное состояние при каждом изменении значения. Например, если старое сохраненное значение - «компания», то при следующем щелчке это значение будет преобразовано в состояние компонента вместо значения, которое я выбрал в средстве выбора.

это моя функция выбора выбора:

updateCompany = (id) => {
    try {
      const name = this.getNameFromID(id);
      this.setState({loading: true});
      this.props.saveChosenCompany(this.state.username, { id, name });
      this.props.getPermissions();
      console.log('on change permissions: ', this.state.permissions);
      const cards = this.initCardData(this.props.permissions);
      this.setState({
        permissions: this.props.permissions,
        cards,
        loading: false,
        selectedCompanyID: id,
        selectedCompanyName: name
      });
    } catch (error) {
      console.log("update err: ", error);
    }
  }

это мои редукционные действия:

действия разрешения:

export const getPermissions = () => dispatch => {
    Promise.all([AsyncStorage.getItem("token"),AsyncStorage.getItem("uname")])
      .then(([token, uname]) => {
        AsyncStorage.getItem(`${uname}.companyName`).then((chosenCompanyName) => {
            if(chosenCompanyName){
                fetch(
                  `http://${env.ip}:${env.port}/permissions`,
                  {
                    method: "POST",
                    headers: {
                      "content-type": "application/json",
                      accept: "application/json",
                      Authorization: "Bearer " + token
                    },
                    body: JSON.stringify({
                      company: chosenCompanyName
                    })
                  }
                )
                .then(permissions => permissions.json())
                .then(permissions => {
                    AsyncStorage.setItem(`${uname}.${chosenCompanyName}.permissions`, JSON.stringify(permissions))
                    .then(() => {
                        dispatch({
                          type: GET_PERMISSIONS,
                          payload: permissions
                        });
                    })
                })
                .catch(err => console.log('getPermissions error: ',err));
            }
        });
      })
      .catch(err => console.log('getPermissions error: ',err));
};

export const initPermissions = () => dispatch => {
    AsyncStorage.getItem('uname')
    .then(uname => {
        AsyncStorage.getItem(`${uname}.companyName`)
        .then(company => {
            if(company) {
                AsyncStorage.getItem(`${uname}.${company}.permissions`)
                .then(permissions => JSON.parse(permissions))
                .then(permissions => {
                    dispatch({
                        type: INIT_PERMISSIONS,
                        payload: permissions
                    });
                });
            }
        })
    })
    .catch(err => console.log('initPermissions error: ', err));
}

и действия компании:

export const saveChosenCompany = (username, company) => dispatch => {
    AsyncStorage.multiSet([
        [`${username}.companyID`, company.id],
        [`${username}.companyName`, company.name]
    ])
    .then(() => {
        dispatch({
            type: SAVED_COMPANY,
            payload: company
        })
    })
    .catch(err => {
        console.log(err);
        dispatch({
            type: SAVED_COMPANY,
            payload: {
                id: null,
                name: null
            }
        })
    })   
}

export const initCompany = (company) => dispatch => {
    dispatch({
        type: INIT_COMPANY,
        payload: company
    })
}

Я надеюсь, что кто-то может объяснить мне эту проблему и как ее решить. я должен также упомянуть, что при входе в систему из метода рендеринга реквизиты прав доступа в конечном итоге получают то значение, которое должно быть, но состояние компонента не изменяется и компонент не обновляется.

Спасибо всем заранее за помощь.

...