【问题标题】:Passing a component with props to another component as prop将带有 props 的组件作为 prop 传递给另一个组件
【发布时间】:2020-05-03 11:22:54
【问题描述】:

我正在尝试将带有道具的组件作为道具传递给另一个组件。我的意思是,像这样:

const App = ({ routes, graphqlProvider, themeProvider }) => {
  const GraphqlProvider = graphqlProvider
  const ThemeProvider = themeProvider

  return (
      <GraphqlProvider>
        <ThemeProvider>
          <BrowserRouter basename="/app">
            {renderRoutes(routes)}
          </BrowserRouter>
        </ThemeProvider>
      </GraphqlProvider>
  )
}

const MyApp = () => {
  const mockedProvider = <MockedProvider mocks={mocks} addTypename={false} />

  return (
    <App routes={routes} themeProvider={ThemeProvider} graphqlProvider={mockedProvider} />    
  )
}

在上面的示例中,我想将组件 MockedProvider(及其道具)作为道具传递给另一个组件(App)。我已经成功地传递了没有 props 的组件,但是,当组件有 props 时,同样的方法不起作用。

每次我尝试这样做时都会收到以下错误消息:

Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.

【问题讨论】:

  • mocks 未定义
  • @Andy 我删除了导入和其他声明以使其变得简单。
  • 尝试使用 React Childs
  • 我之前没有见过这种模式,即将组件 X 作为道具传递给组件 Y。为什么不直接将组件 X 导入组件 Y 的文件并在那里使用它呢?

标签: javascript reactjs


【解决方案1】:

在我看来是一种奇怪的模式。我可能会做这样的事情,将所有内容作为子元素传递:

return (
  <App routes={routes}>
    <MockedProvider mocks={mocks} addTypename={false} />
      <ThemeProvider>
         <BrowserRouter basename="/app">
            {renderRoutes(routes)}
          </BrowserRouter>
      </ThemeProvider>
    </MockedProvider>
  </App>
)

【讨论】:

  • 问题是当我需要编写测试时,因为当我运行应用程序时,我将使用 GraphqlProvider,然而,当我编写测试时,我将使用 MockedProvider(他们有不同的道具)。有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2019-08-09
  • 2018-08-11
相关资源
最近更新 更多