useEffect导致无限循环

离子卡

我遇到了一个无限循环,它不断从API中获取信息。

如果将fetchTheMovie()包裹在if语句中,但我不理解原因,任何想法或任何更好的解决方案,则可以解决此问题?

if (!movie.Title) {
  fetchTheMovie(id);
}

端点是/ movie / id

电影组件:

const SingleMovie = (props) => {
  const { id } = useParams();
  const {movie} = props;

  useEffect(() => {
    const {fetchTheMovie} = props;
    fetchTheMovie(id);
  }, []);
}

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(WithSpinner(SingleMovie));

WithSpinner组件

const WithSpinner = (WrappedComponent) => {
  const Spinner = ({ isLoading, ...otherProps }) => {
    return isLoading ? (
      <SpinnerOverlay>
        <SpinnerContainer />
      </SpinnerOverlay>
    ) : (
      <WrappedComponent {...otherProps} />
    );
  };
  return Spinner;
};

使用组件的页面

const Page = ({ loading }) => {
  const { id } = useParams();
  return (
    <div>
      <SingleMovieComp isLoading={loading} />
    </div>
  );
};

行动:

export function fetchMovieStart() {
  return {
    type: SingleMovieActionTypes.FETCH_MOVIE_START,
  };
}

export function fetchMovieSuccess(movie) {
  return {
    type: SingleMovieActionTypes.FETCH_MOVIE_SUCCESS,
    payload: movie,
  };
}

export function fetchMovieError(error) {
  return {
    type: SingleMovieActionTypes.FETCH_MOVIE_ERROR,
    payload: error,
  };
}

export const fetchMovieAsync = (movieId) => {
  return (dispatch) => {
    dispatch(fetchMovieStart());
    fetch(`URL`)
      .then((response) => response.json())
      .then((movie) => dispatch(fetchMovieSuccess(movie)))
      .catch((error) => dispatch(fetchMovieError(error.message)));
  };
};

减速器:

const INITIAL_STATE = {
  loading: false,
  movie: {},
};

const singleMovieReducer = (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case SingleMovieActionTypes.FETCH_MOVIE_START: {
      return {
        ...state,
        movie: {},
        loading: true,
      };
    }
    case SingleMovieActionTypes.FETCH_MOVIE_SUCCESS: {
      return {
        ...state,
        movie: action.payload,
        loading: false,
      };
    }
    case SingleMovieActionTypes.FETCH_MOVIE_ERROR: {
      return {
        ...state,
        loading: false,
      };
    }
    default:
      return state;
  }
};
HMR

您可以尝试以下操作:

const ComponentWithSpinner = WithSpinner(SingleMovie);
//create single movie container
const SingleMovieContainer = (props) => {
  const { id } = useParams();
  const { fetchTheMovie } = props;
  //remove the useEffect from SingleMovie
  useEffect(() => {
    fetchTheMovie(id);
    //you need to add these dependencies
  }, [fetchTheMovie, id]);
  //Here you could try to use useSelector to get the movie
  //  and pass to SingleMovie but I think you already do
  //  that somewhere else
  //return component with spinner so SingleMovieContainer
  // will not unmount when you load movie
  return <ComponentWithSpinner {...props} />;
};

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(SingleMovieContainer);

问题在于,当您加载影片时,SingleMovie会被卸载,而当加载为false时会被加载,这会导致加载设置为true(调度了fetchMovie),因此会再次将其卸载。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

UseEffect中的SetState导致无限循环

来自分类Dev

useEffect导致无限循环或出现错误

来自分类Dev

由于UseEffect依赖关系导致无限循环而反应redux reducer

来自分类Dev

useEffect警告缺少依赖项,从而导致无限循环

来自分类Dev

由于UseEffect依赖关系导致无限循环而反应redux reducer

来自分类常见问题

反应useEffect无限循环

来自分类Dev

useEffect无限循环

来自分类Dev

反应useEffect无限循环

来自分类Dev

break 导致无限循环?

来自分类Dev

使用useSelector的无限循环useEffect

来自分类Dev

React useEffect在无限循环内

来自分类Dev

useCallBack和useEffect无限循环

来自分类Dev

useEffect导致具有恒定依赖性的无限循环

来自分类Dev

在useEffect挂钩中与AsyncStorage一起设置状态会导致无限循环吗?

来自分类Dev

UseEffect和useCallback仍然会在React项目中导致无限循环

来自分类Dev

在useEffect依赖项数组中添加数组会导致无限循环

来自分类Dev

列表操作导致无限循环

来自分类Dev

这会导致无限循环吗?

来自分类Dev

骆驼dynamicRouter导致无限循环

来自分类Dev

ng-if导致无限循环

来自分类Dev

setState数组导致无限循环

来自分类Dev

更新Total导致无限循环

来自分类Dev

导致无限摘要循环的指令

来自分类Dev

ng-if导致无限循环

来自分类Dev

std::cin 导致无限循环

来自分类Dev

我的代码导致无限循环

来自分类Dev

递归ViewComponent导致无限循环

来自分类Dev

Python:append() 导致无限循环

来自分类Dev

循环迭代器的ArrayList导致无限循环