将对象道具作为 JSX 属性而不是对象传递

Posted

技术标签:

【中文标题】将对象道具作为 JSX 属性而不是对象传递【英文标题】:Pass in object prop as JSX attributes instead of object 【发布时间】:2017-07-22 17:01:54 【问题描述】:

给定以下组件。我正在寻找一种方法来获取这些道具、属性并将它们以这种格式传递给另一个组件。

<AdminHeader
  logoSource='https://dummyimage.com/85x85/c718de/ffffff'
  leftStyle=flexGrow: 2
  centerText='Painel De Administração · Clientes'
  rightStyle=flexBasis: 'content', flexGrow: 0
  right=(
    <AdminNotification
      imageSource='https://dummyimage.com/65x85/a8a8a8/000000.png'
      circleScheme='red'
      count=21
      text='Admin Master'
    />
  )
/>

例如,假设我像这样包装&lt;AdminHeader/&gt;

function WrappedAdminHeader (props) 
  return (
    <AdminHeader ...props.adminHeader/>
  )

然后我想调用&lt;WrappedAdminHeader /&gt; 并传入adminHeader 道具,而不必将它们全部转换为JSON

<WrappedAdminHeader
  adminHeader=(
    <ResolveToJSON
      logoSource='https://dummyimage.com/85x85/c718de/ffffff'
      leftStyle=flexGrow: 2
      centerText='Painel De Administração · Clientes'
      rightStyle=flexBasis: 'content', flexGrow: 0
      right=(
        <AdminNotification
          imageSource='https://dummyimage.com/65x85/a8a8a8/000000.png'
          circleScheme='red'
          count=21
          text='Admin Master'
        />
      )
    />
  )
/>

然后必须像这样将属性转换为 JSON:

<WrappedAdminHeader adminHeader=
  logoSource: 'https://dummyimage.com/85x85/c718de/ffffff',
  leftStyle: flexGrow: 2,
  centerText: 'Painel De Administração · Clientes',
  rightStyle: flexBasis: 'content', flexGrow: 0,
  right:(
    <AdminNotification
      imageSource='https://dummyimage.com/65x85/a8a8a8/000000.png'
      circleScheme='red'
      count=21
      text='Admin Master'
    />
  )
>

这可能吗?

【问题讨论】:

你的第二个例子我不清楚。 &lt;ResolveToJSON&gt; 是什么? 我想我明白你在说什么......这与 JSON 无关,但你想使用 jsx 节点和属性而不是对象文字来指定 AdminHeader 的道具。我认为这没有任何意义。您可以将 AdminHeader 作为道具传入,然后从 props.children 在 WrappedAdminHeader 中呈现它。 【参考方案1】:

如果您的意思是要将&lt;WrappedAdminHeader&gt; 的属性传递给&lt;AdminHeader&gt;,您可以直接在道具上使用属性传播:

function WrappedAdminHeader (props) 
  return (
    <AdminHeader ...props/>
  )

现在您可以使用&lt;WrappedAdminHeader&gt; 作为&lt;AdminHeader&gt; 的直接替代品:

<WrappedAdminHeader
  logoSource='https://dummyimage.com/85x85/c718de/ffffff'
  leftStyle=flexGrow: 2
  centerText='Painel De Administração · Clientes'
  rightStyle=flexBasis: 'content', flexGrow: 0
  right=(
    <AdminNotification
      imageSource='https://dummyimage.com/65x85/a8a8a8/000000.png'
      circleScheme='red'
      count=21
      text='Admin Master'
    />
  )
/>

【讨论】:

谢谢你,我已经知道了,这不是我要找的。​​span> 【参考方案2】:

你的意思是这样的?

const A = ( message ) => <span>message</span>;
const B = ( propsForA ) => <A ...propsForA />;

const a = <A message="Hi!" />;    

const App = () => (
  <div><B propsForA=a.props /></div>
);

ReactDOM.render(
  <App />,
  document.getElementById("entry")
);

您从a 获取道具的位置,这是A 的“实例”。

【讨论】:

以上是关于将对象道具作为 JSX 属性而不是对象传递的主要内容,如果未能解决你的问题,请参考以下文章

将对象作为道具传递是不是会干扰 componentWillReceiveProps?

将嵌套对象作为道具映射到自定义组件

将嵌套对象名称作为道具传递给组件

为啥数组中的两个对象中只有一个作为道具传递?

如何将对象数组作为道具传递给组件,然后将数组的成员作为道具传递给嵌套组件?

你可以将 props 传递给 JSX 引用吗?