小编Teh*_*ila的帖子

渲染期间直接在组件主体中将状态更新为相同值会导致无限循环

假设我有这个简单的虚拟组件:

const Component = () => {

  const [state, setState] = useState(1);

  setState(1);

  return <div>Component</div>
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,我直接在组件主体中将状态更新为与之前相同的值。但是,即使值保持不变,这也会导致过多的重新渲染。

据我所知,在 中React.useState,如果状态值更新为与之前相同的值 - React 不会重新渲染组件。那么为什么会发生在这里呢?

但是useEffect,如果我尝试在组件主体中而不是直接在组件主体中执行类似的操作:

const Component = () => {

  const [state, setState] = useState(1);

  useEffect(() => {
    setState(1);
  }, [state])

  return <div>Component</div>
}
Run Code Online (Sandbox Code Playgroud)

不会导致任何无限循环,并且完全符合如果状态保持不变,React 不会重新渲染组件的规则。

所以我的问题是:为什么当我直接在组件主体中执行此操作时会导致无限循环,而在组件主体中却useEffect不会?

有人对此有一些“幕后”解释吗?

javascript infinite-loop reactjs react-hooks

13
推荐指数
1
解决办法
2330
查看次数

React - 添加 props.something 作为 useEffect 的依赖项

我这里有这个 useEffect 代码:

useEffect(() => {
    if (status === "completed" && !error) 
      props.onAddedComment();
  }, [status,error,props.onAddedComment]);
Run Code Online (Sandbox Code Playgroud)

但我在终端中收到此警告: React Hook useEffect 缺少依赖项:“props”。包含它或删除依赖项数组。但是,当任何prop 更改时,“props”也会更改,因此首选修复方法是在 useEffect 调用之外解构“props”对象,并引用 useEffect 内的那些特定 props

props.onAddedComment如果我传递的是而不是整个 props 对象,为什么需要使用解构?即使我添加了,它仍然会引用整个道具吗.onAddedComment

params我对这段代码中使用 , 有同样的问题:

useEffect(() => {
    sendRequest(params.quoteId);
  }, [params.quoteId, sendRequest]);
Run Code Online (Sandbox Code Playgroud)

我在这里没有收到此警告,为什么?

简而言之,我的问题是,即使我在.somethingprops 之后添加,我是否应该始终使用解构,以及为什么它不使用参数警告我。

谢谢!

javascript destructuring reactjs react-props react-hooks

7
推荐指数
1
解决办法
4026
查看次数

React router v6 - 从父路由导航到嵌套路由而不显示父路由

我正在尝试在我的以下代码中使用嵌套路由Router.js

return (
<Routes>
  <Route path="" element={<Home />} />
  <Route path="/DriverPage/*"  element={<DriverPage />}>
      <Route path="DriverSignUp" element={<DriverSignUp />}/>
      <Route path="DriverLogin" element={<DriverLogIn />} />
  </Route>
  <Route path="/PassengerPage/*" element={<PassengerPage />} />
</Routes>
Run Code Online (Sandbox Code Playgroud)

DriverPage.js这是父路由组件中的代码:

return (
<>     
  <div className="driver-auth">
    <button onClick={ ()=>navigate("DriverSignUp",{replace:true}) }> Sign up </button>
    <button onClick={ ()=>navigate("DriverLogin",{replace:true}) }> Sign in </button>
  </div>
  <Outlet />
</>
Run Code Online (Sandbox Code Playgroud)

问题是我想在单击按钮时用嵌套组件替换父组件,因为我不希望父组件继续显示。

这就是为什么我尝试使用navigate("DriverLogin",{replace:true})但它没有帮助,并且单击时我会看到父路线和子路线。

我认为这是因为/*我在父路由路径中拥有,这意味着即使只是开始匹配它也匹配。

那么,是否有任何解决方案仍然使用嵌套路由,或者我不应该使用嵌套?

还有一个问题是:为什么替换不起作用?

谢谢!

nested-routes reactjs react-router react-navigation react-router-dom

3
推荐指数
1
解决办法
6163
查看次数