反应功能组件默认道具与默认参数


78

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

默认道具:

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

Component.defaultProps = {
  prop1: false,
  prop2: 'My Prop',
}

默认参数:

const Component = ({ prop1 = false, prop2 = 'My Prop' }) => (
  <div></div>
)    

3
@AbdennourTOUMI请不要破坏默认的初始化语法!
Bergi

谢谢@Bergi。没关系!我认为这是错误的语法。是吗 ?
Abdennour TOUMI

3
@AbdennourTOUMI不,这是默认值的语法。您已将其更改为对象文字语法,该参数对于参数中的字符串/布尔文字无效。
Bergi

Answers:



39

一般来说(ES6),第二种方法更好。

在特定情况下(在React上下文中),第一个更好,因为它是组件生命周期中的一个主要阶段,即初始化阶段。

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


1
您是否可以扩展它的使用范围defaultProps,使其在React上下文中优于默认参数?在React中如何处理它们是否有基本原则,还是出于维护约定的目的而更优选?
亚历山大·尼德

1
@AlexanderNied检查之前先defaultProps经过评估。同样,如@fforw响应中所述,销毁默认值不适用于此处。propTypes
卡皮·埃瑟里尔19'Mar

@AlexanderNied,对于一些更复杂的连接组件而言,微小的差异非常重要,请参见下面的答案。
Jkarttunen

5
这个答案现在已经过时,因为功能组件的默认道具最终将被弃用(请参阅下面的答案)。
汤姆

2

无耻的插件,我是with-default-props的作者。

如果您是TypeScript用户,with-default-props可能会为您提供帮助,它使用高阶函数在给定defaultProps的情况下提供正确的组件定义。

例如。

import { withDefaultProps } from 'with-default-props'

type Props = {
    text: string;
    onClick: () => void;
};

function Component(props: Props) {
    return <div onClick={props.onClick}>{props.text}</div>;
}

// `onClick` is optional now.
const Wrapped = withDefaultProps(Component, { onClick: () => {} })


function App1() {
    // ✅
    return <Wrapped text="hello"></Wrapped>
}

function App2() {
    // ✅
    return <Wrapped text="hello" onClick={() => {}}></Wrapped>
}

function App3() {
    // ❌
    // Error: `text` is missing!
    return <Wrapped onClick={() => {}}></Wrapped>
}

1

第一个可能导致一些难以调试的性能问题,尤其是在使用redux的情况下。

如果使用对象,列表或函数,则这些对象将成为每个渲染上的新对象。如果您有复杂的组件来检查组件的完整性以查看是否应进行重新渲染,那么这可能很不好。

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

现在可以正常工作,但是如果您具有更复杂的组件和状态,例如带有数据库连接和/或react useffect挂钩的react-redux连接的组件以及组件状态,则可能导致大量重新发布。

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

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

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

要么

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

1

甚至您可能会问,为什么不像下面的代码那样使用sthprops || value而不是defaultProps

class SomeComponent extends React.Component {
  render() {
    let data = this.props.data || {foo: 'bar'}
    return (
      <div>rendered</div>
    )
  }
}

// SomeComponent.defaultProps = {
//   data: {foo: 'bar'}
// };

ReactDOM.render(
  <AddAddressComponent />,
  document.getElementById('app')
)

但是请记住defaultProps使代码更具可读性,特别是如果您有更多代码props并且用||运算符控制它们可能会使您的代码看起来难看

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.