在 React Router v6 中将 Props 传递到 Outlet

Sch*_*101 49 javascript reactjs react-router

我无法设法将 props 传递到新的 React-router v6 中的 Outlet 组件。我尝试了简单的解决方案:

render() {
  return (
    <Outlet name="My name" />
  );
}
Run Code Online (Sandbox Code Playgroud)

这会正确渲染子组件,但是没有任何道具传递给子组件。React 团队(或其他任何人)提供的示例都没有显示带有 props 的 Outlet,所以我担心它实际上不是一个东西。是否有其他方法我没有找到或者我错误地使用了输出组件?

编辑:似乎没有直接的方法来传递道具,请参阅下面的答案。

Ser*_*hey 62

您可以使用 插座上下文来做到这一点

  • 据我所知,这似乎只支持功能组件。问题中使用的类组件是否有等效项? (3认同)

小智 22

当使用功能组件时,在父组件中声明名称,如下所示。

function Parent() {
  const const name='Your name'
  return <Outlet context={[name]} />;
}
Run Code Online (Sandbox Code Playgroud)

然后在子组件中执行此操作

//import this
import { useOutletContext } from "react-router-dom";

function Child() {


const [name] = useOutletContext();



return <p >{name}</p>;
}
Run Code Online (Sandbox Code Playgroud)


Ar2*_*r26 16

现在可以使用 context 属性(从版本 6.1.0 开始)

<Outlet context={}/>
Run Code Online (Sandbox Code Playgroud)

github问题

React 路由器插座文档


Roi*_*Roi 10

这里的另一种选择是使用Context API将父视图中的 props 共享到子视图。

const Context = React.createContext({})

function ParentView () {
  const outlet = useOutlet()
  return (
    <Context.Provider value={{ foo: 'bar' }}>
      <h1>Parent View</h1>
      {outlet}
    </Context.Provider>
  )
}

function ChildView () {
  const props = React.useContext(Context)
  return (
    <div>child view {props.foo}</div>
  )
}
Run Code Online (Sandbox Code Playgroud)

另一个选项(未经测试)可能是使用React.cloneElement克隆出口并向其添加道具。