未捕获的错误:[Elements]不是<Route>组件.所有组件 <Routes>岁的子元素必须是<Route>分或<React.Fragment>

我甚至试着用Fragment

我也在使用受保护的路由.

    const App = () => {
  const { isAuthenticated, user } = useSelector((state) => state.user);

  const [stripeApiKey, setStripeApiKey] = useState();

  async function getStripeApiKey() {
    const { data } = await axios.get("/api/v1/stripeapikey");
    setStripeApiKey(data.stripeApiKey);
  }

  useEffect(() => {
    WebFont.load({
      google: {
        families: ["Roboto", "Droid Sans", "Chilanka"],
      },
    });
    store.dispatch(loadUser());
    getStripeApiKey();
  }, []);

  return (
    <div className="App">
      <BrowserRouter>
        <Header />
        <Routes>
          <Route path="/about" element={<About />} exact />
         
          <Route element={<ProtectedRoute />}>
            <Route path="/account" element={<Profile />} exact />
  
            {/* {stripeApiKey && (
              <Elements stripe={loadStripe(stripeApiKey)}>
                <Route exact path="/process/payment" element={<Payment />} />
              </Elements>
            )} */}
          </Route>
          <Route path="/password/forgot" element={<ForgotPassword />} exact />
          <Route
            path="/password/reset/:token"
            element={<ResetPassword />}
            exact
          />
          <Route path="/cart" element={<Cart />} exact />
        </Routes>

        <Footer />
      </BrowserRouter>
    </div>
  );
};

推荐答案

Issue

react-router-dom@6中,Route组件只能由Routes组件呈现,或者在嵌套路由的情况下,由另一个Route组件呈现.Elements组件不是这两个组件,因此它不能由RouteRoutes组件直接呈现.看起来Elements是某种条纹的"上下文提供者".

Solution

这里的解决方案是直接用Elements组件包装Payment,或者在呈现Outlet的布局路由中呈现它,以便嵌套的路由将其element内容呈现到其中.

包装器示例

如果只需要包装单个已布线的组件,则使用包装组件非常有用.

{stripeApiKey && (
  <Route
    path="/process/payment"
    element={(
      <Elements stripe={loadStripe(stripeApiKey)}>
        <Payment />
      </Elements>
    )}
  />
)}

布局示例

如果需要缠绕多条路由,则布局路由非常有用.

import { Outlet } from 'react-router-dom';

const ElementsLayout = ({ stripe }) => (
  <Elements stripe={stripe}>
    <Outlet />
  </Elements>
);

export default ElementsLayout;

...

import ElementsLayout from '../path/to/ElementsLayout';

const App = () => {
  ...

  const [stripeApiKey, setStripeApiKey] = useState();

  ...

  return (
    <div className="App">
      <BrowserRouter>
        <Header />
        <Routes>
          <Route path="/about" element={<About />} />
          <Route element={<ProtectedRoute />}>
            <Route path="/account" element={<Profile />} />
            {stripeApiKey && (
              <Route
                element={<ElementsLayout stripe={loadStripe(stripeApiKey)} />}
              >
                <Route path="/process/payment" element={<Payment />} />
              </Route>
            )}
          </Route>
          <Route path="/password/forgot" element={<ForgotPassword />} />
          <Route
            path="/password/reset/:token"
            element={<ResetPassword />}
          />
          <Route path="/cart" element={<Cart />} />
        </Routes>
        <Footer />
      </BrowserRouter>
    </div>
  );
};

Reactjs相关问答推荐

从另一个组件更改组件中const的状态

为什么Next.js 14无法解析页面路由路径?

Redux Provider Stuck甚至彻底遵循了文档

ReactJs;Reaction-Hook-Form:仅当 Select 了特定 Select 列表选项时才显示文本输入

下拉Tailwind CSS菜单与怪异beviour

有没有办法将在服务器端全局获取的一些数据传递到Next&>13应用程序目录中的客户端组件?

在Reaction中管理多个状态

在transformResponse中使用来自其他查询的缓存

如何在React组件中自动更新图表数据?

React 在第一次渲染时为 null

Symfony ux-react:使用react_component()时React组件不会渲染

Mui / Material UI 5:如何从 StaticTimePicker 中删除打开下一个视图/打开上一个视图按钮?

无法使axiosmockadapter正常工作

React 应用程序可以嵌入到 PowerPoint 中吗?

页面不显示

NextJS htaccess 设置

在 redux 工具包中使用 dispatch 发送多个操作

当状态改变时如何执行一些动作,但只针对第一次更新?

运行开发服务器时如何为 Vite 指定运行时目录

将 C# Razor 条件块转换为 React.js 代码