reactjs React props vs children什么时候用?

9jyewag0  于 2023-05-06  发布在  React
关注(0)|答案(6)|浏览(226)

这两种方法有什么区别?
将按钮的文本作为 prop 传递

<TextComponent title="Save"/>

function TextComponent(props){
  return <button>{props.title}<button/>
}

vs
作为孩子传递文本

<TextComponent>Save<TextComponent />

function TextComponent(props){
  return <button>{props.children}<button/>      
}
xmjla07d

xmjla07d1#

children prop是当需要在子组件中呈现的结构不固定并且由呈现它的组件控制时使用的东西。
然而,如果组件的行为在其所有呈现中是一致的,则它可以定义它需要的特定 prop ,并且父组件可以将它们传递给它。
一个非常简单的例子是可以使用childrenNavbar。对于Navbar,它需要呈现的项以及项的顺序或对齐方式取决于它在不同示例或不同页面中的使用方式。例如,Navbar可以在某个地方有搜索组件,而在其他地方没有它。此外,菜单有时可能需要在左侧,然后是右侧的登录菜单项和它们之间的搜索栏,有时它们可能都出现在右侧而没有搜索栏。在这种情况下,父组件可以控制内部结构的方式

kqqjbcuj

kqqjbcuj2#

如果你不知道children,你应该使用childrenhttps://reactjs.org/docs/composition-vs-inheritance.html
在这里,如果你知道你会在你的子组件中使用一个标题,只需要使用一个命名的prop。
如果你问自己这个问题“好吧,但是那个通用组件会呈现什么呢?“是应该使用children的时候

rfbsl7qr

rfbsl7qr3#

您在一个充当容器的组件上使用props.children,并且该组件事先不知道其子组件。
基本上,props.children用于在调用“containing”组件时,显示在该组件的开始和结束标记之间包含的任何内容。

h7appiyu

h7appiyu4#

正如React官方文档中提到的:
有些组件无法提前知道它们的子组件。这对于表示通用“框”的边栏或对话框等组件尤其常见。
我们建议此类组件使用特殊的childrenprop将子元素直接传递到其输出中:
简单地说,它只是显示在开始和结束标记之间的任何内容。
正如你的问题中所问的,在你指定的用例中没有**太大的区别。
但是,假设你有一个小的左图标组件,然后通过'标题'作为一个单独的 prop 将更有意义。

<TextComponent title="Save" src="https://..." />
function TextComponent(props) {
  return (
    <div>
      <img src={props.src}/>
      <button>{props.title}<button/>
    </div>
  );
}
l5tcr1uw

l5tcr1uw5#

当你知道你的 prop 是什么,使用 prop 。否则,使用子项(又名containment)。
除此之外,在你的情况下使用props/children取决于你想要传递的内容:
1.如果它是一个单一的 prop (如item),那么你选择哪种方法都没关系。
1.否则,你应该检查你在children中传递的是什么,因为你可能会传递其他你不想呈现的值。

**我建议使用选择性方法(例如props.title),因为您总是知道组件内部发生了什么。

ubof19bj

ubof19bj6#

学究式地说,当我传递一个是子对象的东西时,我使用子对象,当我传递一个属性时,我使用一个 prop 。这里有一个例子。

const LoginForm = () => {
  // use hooks for form state
  return (
    <SomeForm>
      <UserNameTextField />
      <PassWordField />
    </SomeForm>
  )

现在我想添加一个忘记密码按钮,我选择将其定义为LoginForm的子项。

  • 我不想将它添加到LoginForm内部的JSX中,因为按钮与组件状态完全无关。
  • 我不想将它作为组件属性添加,因为忘记密码按钮不是窗体的属性。(这不是一个onSubmit回调,也不是一个样式,也不是调整LoginForm的表单方面的东西。

所以我用了一个孩子。

const LoginForm<{ children?: { forgotPasswordButton: ReactNode }}> = ({ children }) => {
  // same as before
  return (
  // ..
      <PasswordField />
      {children?.forgotPasswordButton}
    </SomeForm>

相关问题