React功能组件默认props与默认参数

Iag*_*lem 40 javascript ecmascript-6 reactjs

在React 功能组件中,这是设置默认道具,使用Component.defaultProps或使用函数定义上的默认参数的更好方法,示例:

默认道具:

const Component = ({ prop1, prop2 }) => (
  <div></div>
)

Component.defaultProps = {
  prop1: false,
  prop2: 'My Prop',
}
Run Code Online (Sandbox Code Playgroud)

默认参数:

const Component = ({ prop1 = false, prop2 = 'My Prop' }) => (
  <div></div>
)    
Run Code Online (Sandbox Code Playgroud)

Abd*_*UMI 22

一般来说(ES6),第二种方式更好.

具体而言(在React上下文中),第一个更好,因为它是组件生命周期中的主要阶段,即初始化阶段.

请记住,ReactJS是在ES6之前发明的.

  • 您能否详细说明一下使用“defaultProps”使其比 React 上下文中的默认参数更可取的原因吗?在 React 中,它们的处理方式是否有一些基本的内容,或者更倾向于维护约定? (3认同)
  • 这个答案现在已经过时了,因为功能组件的默认道具最终将被弃用(请参阅下面的答案)。 (2认同)

Jka*_*nen 13

第一个可能会导致一些难以调试的性能问题,特别是当您使用 redux 时。

如果您使用对象、列表或函数,那么这些将是每次渲染时的新对象。如果您有复杂的组件来检查组件身份以查看是否应该进行重新渲染,这可能会很糟糕。

const Component = ({ prop1 = {my:'prop'}, prop2 = ['My Prop'], prop3 = ()=>{} }) => {(
  <div>Hello</div>
)}
Run Code Online (Sandbox Code Playgroud)

现在工作正常,但如果您有更复杂的组件和状态,例如带有数据库连接和/或 React useffect 挂钩的 React-Redux 连接组件,以及组件状态,这可能会导致大量重新渲染。

通常更好的做法是单独创建默认的 prop 对象,例如。

const Component = ({prop1, prop2, prop3 }) => (
  <div>Hello</div>
)

Component.defaultProps = {
  prop1: {my:'prop'},
  prop2: ['My Prop'],
  prop3: ()=>{}
}
Run Code Online (Sandbox Code Playgroud)

或者

const defaultProps = {
  prop1: {my:'prop'},
  prop2: ['My Prop'],
  prop3: ()=>{}
}
const Component = ({
  prop1 = defaultProps.prop1,
  prop2 = defaultProps.prop2
  prop3 = defaultProps.prop3
 }) => (
  <div>Hello</div>
)
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这种方法。想知道名称是否应该是“DEFAULT_PROPS”而不是“defaultProps”,因为这些是常量并且不会改变。 (2认同)

Tom*_*Tom 13

defaultProps最终将不赞成使用功能性组件上的组件(根据核心团队之一Dan Abramov的观点,因此,为了将来进行验证,值得使用默认参数。

  • 那么,应该如何呢? (4认同)
  • 谢谢。对于那些使用 eslint 规则“re​​quire-default-props”并使用 ES6 默认参数的用户,您可以暂时禁用该规则:https://github.com/croutonn/next-template/issues/27 .eslintrc.json: "规则": { "react/require-default-props": "关闭" } (3认同)
  • 这意味着,如果您关心项目的可维护性,请使用默认参数而不是“defaultProps”。实际上有人在我自己的回复中交叉引用了这个答案,请参阅/sf/ask/2904197621/?noredirect=1 #评论102950610_42733457 (2认同)