Отмените все подписки и асинхронные задачи в эффекте использования при использовании redux

#reactjs #react-native #redux

Вопрос:

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

Ниже приведены коды, по которым я отменяю все подписки, но я не уверен, что поступаю правильно!

 const useFetchProperty = (propertyId, refresh = false) => {
  const dispatch = useDispatch();
  const property = useSelector(state => selectPropertyById(state, propertyId));
  const isConnected = useIsConnected();

  useEffect(() => {
    let isSubscribed = true;
    if (
      isSubscribed amp;amp;
      isConnected amp;amp;
      (property === undefined || refresh === true)
    ) {
      dispatch(fetchProperty({propertyId: propertyId}));
    }
    return () => (isSubscribed = false);
  }, [dispatch, refresh, isConnected, property, propertyId]);

  return property;
};

export default useFetchProperty;
 

CarDesign.js

 const CardDesign = ({postId}) => {
  const {t} = useContext(LocalizationContext);
  const post = useFetchProperty(postId);
  const currentLanguage = useSelector(currentAppLanguage);
  const navigation = useNavigation();

//the rest show data would be here
}
 

Вы бы увидели, что я использую эти два
let isSubscribed = true; и. return () => (isSubscribed = false); Правильно ли отменять все подписки и асинхронные задачи с отправкой ???

Вот скриншот этой ошибки, которую я получил. ошибка подписки

Ответ №1:

Область действия ваших isSubscribe переменных находится внутри useEffect , поэтому нет необходимости делать следующее

 return () => (isSubscribed = false);
 

Причина в том, что, когда ваш эффект использования вступит в силу, подписка на выпуск всегда будет иметь true значение из — за объявления переменной. Поскольку область действия находится внутри useEffect so, удаление возврата решит эту проблему

Но если вам действительно нужно его использовать, объявите isSubscribe переменную глобально

Комментарии:

1. Привет @moshfiqrony, извините, мне непонятно, как это может произойти, если я определяю глобально или локально определяющую isSubscribe переменную. Я думаю, что определение переменной только не может заставить отменить все подписки.

2. Проблема здесь в том. Вы определяете isSubscribed переменную внутри эффекта использования, и когда возврат вызывается isSubscribed , теряется контекст или память. Так что происходит то, что он не может выполнить isSubscribed = false строку. Потому что он уже размонтирован.