React 功能组件中使用参数代替 Props

ytk*_*bot 2 arguments jsx reactjs react-functional-component

这个函数是正确的 React 函数组件吗?或者为什么我应该使用props对象?

function StyledLabel(value, cssClass){
   return <span className={cssClass}>{value}</span>
}
Run Code Online (Sandbox Code Playgroud)

我看到的唯一区别是调用此函数:

<App>
   {StyledLabel(value, cssClass)}
</App>
Run Code Online (Sandbox Code Playgroud)

Den*_*ash 5

函数组件是返回元素的函数JSX

这是一个作为普通函数调用函数组件。


但在这种情况下,还没有调用 with React.createElement

因为 JSX 是 的语法糖,所以React.createElement您需要使用 JSX 语法调用该函数,如下所示:

function StyledLabel({ value, cssClass }) {
  return <span className={cssClass}>{value}</span>;
}

<App>
  <StyledLabel value={value} cssClass={cssClass} />
</App>
Run Code Online (Sandbox Code Playgroud)

如果不调用React.createElement,React 将不会知道该组件(用于状态更新、比较算法等),因为它只是一个普通的函数调用。

另一个主要问题是函数参数:

// Not function StyledLabel(value, cssClass)
function StyledLabel(props)
Run Code Online (Sandbox Code Playgroud)

React.createElement接受一个参数,即组件的 props。

React.createElement(
  type,
  [props],
  [...children]
)
Run Code Online (Sandbox Code Playgroud)


Shu*_*tri 5

function StyledLabel(value, cssClass){
   return <span className={cssClass}>{value}</span>
}
Run Code Online (Sandbox Code Playgroud)

被使用就像

{StyledLabel(value, cssClass)}
Run Code Online (Sandbox Code Playgroud)

不是传统的功能组件,而是返回 JSX 的函数。

如果遵循这样的语法,您将无法利用函数组件的某些功能,例如使用React.memo.

尽管您仍然可以在功能组件中使用钩子。

使用这种语法的另一个缺点是,您无法像使用以下语法那样轻松地将子组件添加到 StyledLabel

<StyledLabel>
    <SomeChild/>
</StyledLabel>
Run Code Online (Sandbox Code Playgroud)

虽然 React 内部也通过调用它来调用该函数,并且 JSX render 只是一个Syntactic Sugar用于React.createElement转换它的 a,但它为您提供了一种使组件成为 Virtual DOM 的一部分的方法,而不是其返回值成为 virtual dom 的一部分