【问题标题】:React App Not rendering With Layout First ApproachReact App 不使用布局优先方法呈现
【发布时间】:2022-02-02 15:42:12
【问题描述】:

我正在尝试制作一个新的 react 应用程序并使用我的布局优先方法呈现它,但我的屏幕上没有任何内容。这是我使用的代码--->

App.js

import React from "react";
import HomeLayoutHOC from "./HOC/Home.Hoc";
import Temp from "./Component/temp";


function App() {
  return (
    <>
      <HomeLayoutHOC path="/" exact component={Temp}/>
    </>
  );
};

export default App;

然后DefaultHOC

import React from "react";
import { Route } from "react-router-dom";
import HomeLayout from "../layout/home.layout";


const HomeLayoutHOC = ({ component: Component, ...rest }) => {
    return (
        <>
            <Route
                {...rest}
                component={(props) => {
                    <HomeLayout>
                        <Component {...props}/>
                    </HomeLayout>
            }}
        />
        </>
    );
};
export default HomeLayoutHOC;

还有主页布局

import React from "react";
const HomeLayout = (props) => {
    return (<>
        home Layout
        {props.children}
    </>);
};

export default HomeLayout;

这是我想解决的问题,我知道这是版本问题或其他问题,所以我将在此处添加package.json -->

{
  "name": "client",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.16.1",
    "@testing-library/react": "^12.1.2",
    "@testing-library/user-event": "^13.5.0",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^5.3.0",
    "react-scripts": "5.0.0",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "autoprefixer": "^10.4.2",
    "postcss": "^8.4.5",
    "tailwindcss": "^3.0.16"
  }
}

请帮我解决这个问题 目标 -> 渲染 Temp 组件。在 path ="/" 中使用默认的 HOC 。并在默认布局内。按照布局优先的方法,。

【问题讨论】:

  • 首先,只是指出HomeLayoutHOC 不是高阶组件,它只是一个普通的旧常规 React 组件。其次,您在哪里渲染任何路由器来处理任何路由/导航,以便您的代码可以将Route 与 URL 中的路径匹配?您应该能够在 HomeLayout 组件内包装您想要呈现的任何路由,并完全跳过 HomeLayoutHOC 包装器组件。
  • 是的,这就是我正在做的事情,您能否告诉我布局优先的方法以及如何制作合适的 HOC,谢谢您的帮助,请继续帮助其他人。
  • 这里的目标是什么,在 HomeLayout 包装器中呈现 Temp 组件在 Route 上,路径为 "/"?你有其他路由和路由器吗?您能否更新您的问题以包含更完整/全面的代码示例,以便为我们提供更好的用例上下文? stackoverflow.com/help/minimal-reproducible-example
  • 嘿,你是对的,我是新来的,但你还是做对了,你能告诉我这里有什么问题吗?

标签: reactjs react-router react-router-dom tailwind-css


【解决方案1】:

我看到的主要问题是您的 Route component 回调函数没有返回要在 HomeLayoutHOC 组件中呈现的任何内容。

const HomeLayoutHOC = ({ component: Component, ...rest }) => {
  return (
    <>
      <Route
        {...rest}
        component={(props) => {
          <HomeLayout> // <-- no JSX returned!!
            <Component {...props} />
          </HomeLayout>;
        }}
      />
    </>
  );
};

在此处添加 return 语句可让您的代码正常运行。

const HomeLayoutHOC = ({ component: Component, ...rest }) => {
  return (
    <>
      <Route
        {...rest}
        component={(props) => {
          return (
            <HomeLayout>
              <Component {...props} />
            </HomeLayout>
          );
        }}
      />
    </>
  );
};

我对@9​​87654330@ 不是真正的高阶组件的评论是关于它是一个包装器组件。 Wrapper 组件接受 props 并“包装”并渲染其他组件,而 HOC 是使用 React 组件并返回一个新的、增强的组件的高阶函数。您永远不会直接将 HOC 渲染为 JSX,而是将其传递给组件并渲染返回的组件。

HomeLayoutHOC 的 HOC 版本示例:

const withHomeLayout = (Component) => (props) => (
  <HomeLayout>
    <Component {...props} />
  </HomeLayout>
);

...

const HomeLayoutRoute = withHomeLayout(Route);

...

<HomeLayoutRoute path="/hoc" component={Temp} />

【讨论】:

  • 嘿,谢谢你的回答,但它没有用。都是一样的,我认为是版本问题
  • @kirito 奇怪,我选择了与您在 package.json 文件中指定的 react-router-dom 相同的版本,即 "react-router-dom": "^5.3.0"。你能更具体地说明什么不起作用吗?您能否创建一个您自己的代码框演示来重现我们可以实时检查和调试的这个问题?
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 2014-09-07
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 2012-12-31
相关资源
最近更新 更多