React-router-dom 渲染道具没有返回任何组件

Posted

技术标签:

【中文标题】React-router-dom 渲染道具没有返回任何组件【英文标题】:React-router-dom Render props isn't returning any component 【发布时间】:2022-01-12 19:43:11 【问题描述】:

我在这里使用 react-router-dom 版本 6.0.2 并且“渲染”道具不起作用,每次我到达我的 Route 标签的路径中提到的 url 时,它总是向我抛出这个错误 - “位置“/addRecipe”的匹配叶路由没有元素。这意味着默认情况下它将呈现一个空值,从而导致一个“空”页面。”。有人可以帮我解决这个问题吗

import './App.css';
import Home from './components/Home';
import AddRecipe from './components/AddRecipe';
import items from './data';
import React,  useState  from 'react';
import BrowserRouter as Router, Routes, Route from 'react-router-dom';

const App = () => 
  const [itemsList, setItemsList] = useState(items)
  const addRecipe = (recipeToAdd) => 
    setItemsList(itemsList.concat([recipeToAdd]));
  
  const removeItem = (itemToRemove) => 
    setItemsList(itemsList.filter(a => a!== itemToRemove))
  
  return (
    <Router>
      <Routes>
        <Route path="/addRecipe" render= (history) => 
          return (<AddRecipe onAddRecipe=(newRecipe) => 
            addRecipe(newRecipe);
            history.push('/');
             />);
          />
        </Routes>
    </Router>
  );


export default App;

【问题讨论】:

您是否正确导出AddRecipe.js 中的组件类/函数?因为我的猜测是在您发布的脚本中,AddRecipe 为空。错误消息只是由此产生的后果。 【参考方案1】:

Route 组件 API 从版本 5 到版本 6 发生了显着变化,而不是 componentrender 道具有一个单一的 element 道具,它被传递一个 JSX 文字而不是对 React 组件的引用(通过component)或函数(通过render)。

也不再有路由道具(historylocationmatch),它们只能通过 React 钩子访问。在此 RRDv6 之上也不再直接显示 history 对象,而是将其抽象为 navigate 函数,可通过 useNavigate 钩子访问。如果AddRecipe 组件是一个函数组件,它应该直接从钩子中访问navigate。如果它不能这样做,那么解决方案是创建一个可以的包装器组件,然后使用更正的onAddRecipe 回调呈现AddRecipe 组件。

例子:

const AddRecipeWrapper = ( addRecipe ) => 
  const navigate = useNavigate();

  return (
    <AddRecipe
      onAddRecipe=(newRecipe) => 
        addRecipe(newRecipe);
        navigate('/');
      
    />
  );
;

...

const App = () => 
  const [itemsList, setItemsList] = useState(items);

  const addRecipe = (recipeToAdd) => 
    setItemsList(itemsList.concat([recipeToAdd]));
  ;

  const removeItem = (itemToRemove) => 
    setItemsList(itemsList.filter(a => a !== itemToRemove))
  ;

  return (
    <Router>
      <Routes>
        <Route
          path="/addRecipe"
          element=<AddRecipeWrapper addRecipe=addRecipe />
        />
      </Routes>
    </Router>
  );
;

【讨论】:

【参考方案2】:

在 react-router-dom 版本 6 中,您应该为此使用 element prop。

我建议您阅读他们的document on upgrading from version 5,他们在其中解释了更改。

对于你的问题,你应该这样写:

<Route 
   path="/addRecipe" 
   element=
      <AddRecipe 
         onAddRecipe=(newRecipe) => 
           addRecipe(newRecipe);
           history.push('/');
          
      />
     
 />

【讨论】:

以上是关于React-router-dom 渲染道具没有返回任何组件的主要内容,如果未能解决你的问题,请参考以下文章

react-router-dom 失败的道具类型:无效的道具`exact`类型为`string`

使用 react-router-dom 在 Route 中添加组件作为道具

React-Router-DOM 中的 NavLink 组件不接受带有功能的样式道具

React-Router-Dom v5.2 ,无法从父级收到的道具中将道具传递给子组件

页面未呈现;在 react-router-dom 中使用受保护的路由将道具传递给孩子时

渲染没有返回任何内容;试图重定向到主页