所以我一直在寻找答案,但在大多数情况下,只是拼写错误或把电话放错了地方,我相信这里不是这样的.不知何故,我发现这是一种难以理解的react 逻辑.

我使用的是This type of React Router,我正在try 为Outlet提供一组数据,当用户在children网站上时,这些数据可以更改.我决定try React Providers而不是Reaction-Router工具useOutletContext,因为提供的数据可能会随着时间的推移而增长.我决定沿着This进场.

所以这就是代码. App.jsx

const App = () => {
  return (
    <AuthProvider>
      <Suspense fallback={<Loading />}>
        <Routing />
      </Suspense>
    </AuthProvider>
  )
}

Routing.jsx

const BrowserRouter = createBrowserRouter(
  createRoutesFromElements(
    <Route path="/" name="home" element={<HomePage />}>
      <Route path="device" name="device" element={<DevicePage />}>
        <Route path=":id" element={<DeviceList />}></Route>
      </Route>
      <Route path="*" element={<Roadblock.site404 />} />
    </Route>,
  ),
)

export default const Routing = () => {
  return <RouterProvider router={BrowserRouter} fallbackElement={<Loading />} />
}

DevicePage.jsx

export default function DevicePage() {
  return (
    <>
      <DeviceContent />
    </>
  )
}

DeviceContent.jsx

export default function DeviceContent() {
  return (
    <>
      <DeviceProvider>
        <Outlet />
      </DeviceProvider>
    </>
  )
}

DeviceProvider.jsx

export const DeviceContext = createContext()

export function DeviceProvider({ children }) {
  const [device, setDevice] = useState(null)

  const addDevice = () => {
    setDevice(data)
  }

  const deviceContext = {
    device,
    addDevice,
  }

  return <DeviceContext.Provider value={deviceContext}>{children}</DeviceContext.Provider>
}

下面是Route中调用的Outlet个DeviceList.jsx

export default function DeviceList() {
  const { device, addDevice } = useContext(DeviceContext)

  addDevice('1')
  console.log(device)

  return (
    <div>
      <h2>{device}</h2>
    </div>
  )
}

错误代码

react-dom.development.js:86 Warning: Cannot update a component (DeviceProvider) while rendering a different component (DeviceList). To locate the bad setState() call inside
DeviceList, follow the stack[...]

Question:是什么行为/逻辑导致了这个问题?我将来如何理解和避免它?

推荐答案

DeviceList在Reaction组件生命周期之外将状态更新入队.换句话说,作为103的副作用.将addDevice呼叫移动到useEffect挂钩,这样就会产生104的副作用.

示例:

import { useEffect } from 'react';

export default function DeviceList() {
  const { device, addDevice } = useContext(DeviceContext);

  // Update device state when component mounts
  useEffect(() => {
    addDevice('1');
  }, []);

  // Log device state updates
  useEffect(() => {
    console.log(device);
  }, [device]);

  return (
    <div>
      <h2>{device}</h2>
    </div>
  );
};

Javascript相关问答推荐

如何解决这个未能在响应上执行json:body stream已读问题?

如何使用Echart 5.5.0创建箱形图

如何使用侧边滚动按钮具体滚动每4个格?

按钮未放置在html dis位置

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

如何从一个列表中创建一个2列的表?

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

Chromium会将URL与JS一起传递到V8吗?

如何解决useState错误—setSelect Image不是函数''

用于在路径之间移动图像的查询

基于props 类型的不同props ,根据来自接口的值扩展类型

为什么云存储中的文件不能公开使用?

自定义图表工具提示以仅显示Y值

每次重新呈现时调用useState initialValue函数

使用jQuery find()获取元素的属性

为什么我的SoupRequest";被重置为初始值,以及如何修复它?

rxjs在每次迭代后更新数组的可观察值

使用Library chart.js在一个带有两个y轴的图表中绘制两个数据集

通过ng-绑定-html使用插入的HTML中的函数