Default.HOC.js

import React from "react";
import { Route, Routes } from "react-router-dom";
import DefaultLayout from "../layouts/Default.layout";

const DefaultHOC = ({ component: Component, ...rest }) => {
  // component
  // props -> path exact
  return (
    <Routes>
      <Route
        {...rest}
        component = {(props) => {
          <DefaultLayout>
            <Component {...props} />
          </DefaultLayout>
        }}
      />
    </Routes>
  );
};

export default DefaultHOC;

Tem.js

import React from "react";

function Temp() {
  return <h1>This is a temp component</h1>
}

export default Temp;

Default.layout.js

import React from "react";

const DefaultLayout = (props) => {
  return (
    <div style={{ padding: '10px' }}>
      <h1>Default Layout Page</h1>
      {props.children}
    </div>
  );
};

export default DefaultLayout; 

App.js

import { Route, Routes } from "react-router-dom";

// HOC
import DefaultHOC from "./HOC/Default.HOC";

// Component
import Temp from "./components/temp";

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

export default App;

我关注的视频讲座使用的是较旧的版本,问题是当我拨打children时,只有Temp在渲染,即屏幕上只显示:

"这是一个临时组件"

而它应该将结果显示为:

"默认布局页面 这是一个临时组件"

我试着用element代替component,结果是一样的.此外,当我删除非 struct 化props 和所有,它只显示"默认布局页面".

推荐答案

Issues

  1. DefaultHOC命名错误,它不是高阶组件,例如返回函数组件的函数组件,它只是一个常规的react 函数组件.
  2. DefaultHOC需要正确地渲染Route,例如通过正确的props .没有componentprops ,只存在一个以React.ReactNode作为参数的elementprops ,例如JSX.

当前代码仅呈现<Temp />组件,因为它被传递到elementprops 上的DefaultHOC,该props 与pathprops 一起传播到Route组件.componentprops 将被忽略.

<DefaultHOC path="/" exact element={<Temp />} />
const DefaultHOC = ({ component: Component, ...rest }) => {
  return (
    <Routes>
      <Route
        {...rest} // <-- path and element pass through here
        component={(props) => { // <-- extraneous ignored prop
          <DefaultLayout>
            <Component {...props} />
          </DefaultLayout>;
        }}
      />
    </Routes>
  );
};

Solution

重构DefaultHOC以渲染DefaultLayout,并在Route组件的elementprops 上传递componentprops .我还建议重命名该组件,因为它不是临时的.

示例:

const DefaultComponent = ({ component, ...props }) => {
  return (
    <Routes>
      <Route {...props} element={<DefaultLayout>{component}</DefaultLayout>} />
    </Routes>
  );
};
<DefaultComponent path="/" component={<Temp />} />

Edit the-file-thats-calling-props-children-its-not-rendering-the-content-in-the-p

enter image description here

建议的解决方案

以上似乎是一种非常非常规的方法,就是通过布局来分享UI.在react-router@6中,将某些组件呈现到某些UI中的惯用方法是使用Layout Routes.布局路由呈现"公共UI",并且可能包含"公共状态/逻辑",并且呈现Outlet以供嵌套路由呈现其内容.

示例:

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

const DefaultLayout = () => {
  return (
    <div style={{ padding: "10px" }}>
      <h1> Default Layout Page </h1>
      <Outlet />
    </div>
  );
};

App.js

import { Route, Routes } from "react-router-dom";

...

export default function App() {
  return (
    <Routes>
      <Route element={<DefaultLayout />}>
        <Route path="/" element={<Temp />} />
      </Route>
    </Routes>
  );
}

Edit the-file-thats-calling-props-children-its-not-rendering-the-content-in-the-p (forked)

enter image description here

Javascript相关问答推荐

materialized - activeIndex返回-1

Plotly热图:在矩形上zoom 后将zoom 区域居中

使用javascript将Plotly Expandable Sparkline转换为HighCharter Plot在bslib卡中

PrivateRoute不是路由组件错误

如何使用JavaScript将文本插入空div

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

为什么按钮会随浮动属性一起移动?

Chart.js-显示值应该在其中的引用区域

如何 for each 输入动态设置输入变更值

面对代码中的错误作为前端与后端的集成

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

如何防止ionic 输入中的特殊字符.?

如何在Java脚本中对列表中的特定元素进行排序?

无法读取未定义的属性(正在读取合并)-react RTK

如何在独立的Angular 应用程序中添加Lucide-Angel?

在JavaScript中将Base64转换为JSON

如何在Java脚本中并行运行for或任意循环的每次迭代

我的NavLink活动类在REACT-ROUTER-V6中出现问题

验证Java脚本函数中的两个变量

为什么我的Reaction组件不能使用createBrowserRouter呈现?