我有一种情况,我应该通过id获得一首歌曲,以获得该歌曲的路径,然后点击按钮导航到该歌曲.

是否有任何特定的钩子可用于在数据到达时导航,useEffect将在任何时候状态改变时被调用,但问题是首先需要调度操作以获取歌曲,判断它是否返回任何项,然后导航.通常,如果它已经发布在列表上,则它应该存在于数据库中,但问题可能出在API端,因此判断results.length > 0就是为什么需要该判断.

useEffect(() => {
  const handleClick = (myId: string) => {
    dispatch(SongActions.searchSong(myId));
    if (results.length > 0) {
      if (Object.keys(results[0]).length > 0) {
        // navigate(`/songs/${results[0].myPath}`);
      }
    }
  }
}, [dispatch, results])

当用户点击具有歌曲标题的列表项时,它应该以歌曲的id为参数来调用函数handleClick(id),即获取歌曲的元数据、源路径等.

<Typography onClick={() => handleClick(songItem.songId)} sx={styles.songListItemText}>{songItem.Title}</Typography>

编辑

这就是我如何设置searchSong动作的:

searchSong: (obj: SearchSongInputModel): AppThunk<SearchPayload> => async (dispatch) => {
  dispatch({
    payload: { isLoading: true },
    type: SearchActionType.REQUEST,
  });
  try {
    const response = await SearchApi.searchSongAsync(obj);
    if (response.length === 0) {
      toast.info(`No data found: ${obj.SongId}`)
    }
    dispatch({
      type: SearchActionType.RECEIVED_SONG,
      payload: { results: response },
    });
  } catch (e) {
    console.error("Error: ", e);
  }
}

推荐答案

您似乎混淆了useEffect个钩子和异步事件处理程序(如按钮元素的onClick处理程序)的用途.useEffect钩子旨在响应some依赖性值更新而发出有意的副作用,并且绑定到React组件生命周期,而onClick处理程序/等旨在响应异步事件,即用户单击按钮.他们不能混为一谈.

假设SongActions.searchSong是一个异步操作,您已经正确地设置了Redux中间件来处理它们(i.e. Thunks),101操作返回获取的响应数据,然后分派的操作返回回调可以等待的promise .

示例:

const navigate = useNavigate();
const dispatch = useDispatch();

const handleClick = async (myId: string) => {
  const results = await dispatch(SongActions.searchSong(myId));
  if (results.length > 0 && Object.keys(results[0]).length > 0) {
    navigate(`/songs/${results[0].myPath}`);
  }
};

...

<Typography
  onClick={() => handleClick(songItem.songId)}
  sx={styles.songListItemText}
>
  {songItem.Title}
</Typography>

searchSong操作创建者应该返回一个解析值,供消费者等待.

searchSong: (obj: SearchSongInputModel): AppThunk<SearchPayload> => async (dispatch) => {
  dispatch(startRequest());
  try {
    const results = await SearchApi.searchSongAsync(obj);
    if (!results.length) {
      toast.info(`No data found: ${obj.SongId}`)
    }
    dispatch(receivedSong({ results }));
    return results; // <-- return resolved value here
  } catch (e) {
    console.error("Error: ", e);
  } finally {
    dispatch(completeRequest());
  }
}

Reactjs相关问答推荐

无法使用#13;或br将新行设置为文本区域'"&"<>

在迁移到Redux—Toolkit 2.0和Redux5.0之后,我在extraReducer和Slice方面有点挣扎,

为多租户SSO登录配置Azure AD应用程序

如何在React中正确地将密码输入类型切换为文本或反之亦然(下一页)

获取未捕获的错误:Gatsby生产版本上的最小化react 错误#418

MUiv5和TSS-Reaction SSR问题:无法可靠地处理样式定义.CSSprops 中的ArrowFunctionExpression

阻止组件更新的多分派Redux Thunk或setState是否有任何问题

为什么我的react 简单计时器项目不起作用?

PWA:注册事件侦听器不会被触发

通过createRoot创建的React元素无法调用Provider值

React Native - 如何处理错误带有有效负载的NAVIGATE操作..未被任何导航器处理?

Spring Boot + React + MySQL应用的架构层面有哪些?

未捕获的运行时错误:对象作为 React 子项无效

图像路径很奇怪,部署 Next.js 应用程序后我看不到任何图像

将 useState 设置为组件内部的值

使用 React Router v6 监听来自不同组件的组件状态变化

无法在 reactJS 中使用空包装器 <>

如何避免在 react useEffect 上滚动时出现小的延迟?

如何修复 Next.js 13 中类型 AppRouterInstance 上不存在 x?

无法有条件地更新useEffect中的setState