Реагуйте на функціональні компоненти за замовчуванням проти параметрів за замовчуванням


85

У функціональному компоненті 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. не зважай! Я вважав, що це неправильний синтаксис. Є це ?
Абденнур ТУМІ

3
@AbdennourTOUMI Ні, це синтаксис значень за замовчуванням. Ви змінили його на синтаксис літералу об’єкта, який недійсний для рядкових / булевих літералів у параметрах.
Бергі

Відповіді:


51

defaultPropsз часом функціональні компоненти будуть застарілими (згідно з Даном Абрамовим, одним з основних команд) , тому для перевірки майбутнього варто використовувати параметри за замовчуванням.


так, як це має бути?
ValRob

1
Це означає, що використовуйте параметри за замовчуванням, а не "defaultProps", якщо ви дбаєте про ремонтопридатність свого проекту. Хто - то на самому ділі перехресні посилання ця відповідь в своєму власному відповіді, див stackoverflow.com/questions/41488537 / ...
Vadorequest

Дякую. Для тих, хто використовує правило eslint "require-default-props" і використовує параметри ES6 за замовчуванням, ви можете відключити правило на даний момент: github.com/croutonn/next-template/issues/27 .eslintrc.json: "rules": { "response / require-default-props": "вимкнено"}
fjplaurr

40

Загалом (ES6) другий спосіб кращий.

У конкретному (в контексті React) перший є кращим, оскільки це основна фаза життєвого циклу компонента, а саме фаза ініціалізації.

Пам'ятайте, ReactJS був винайдений до ES6.


1
Чи не могли б Ви розширити те, про що йдеться про використання, defaultPropsщо робить кращим параметри за замовчуванням у контексті React? Чи є щось принципове в тому, як з ними поводиться під капотом у React, чи це переважно більше для цілей підтримання конвенції?
Олександр

1
@AlexanderNied defaultPropsоцінюється перед перевіркою на наявність propTypes. також, як згадується у відповіді @fforw, тут не застосовуються за замовчуванням деструктуризація.
Капі Етріель

@AlexanderNied, і ця невелика різниця дуже важлива для деяких більш складних підключених компонентів, див. Мою відповідь нижче.
Jkarttunen

6
Ця відповідь зараз застаріла, оскільки реквізити за замовчуванням для функціональних компонентів з часом будуть застарілими (див. Мою відповідь нижче).
Том,

2

Безсоромний штекер тут, я є автором реквізиту за замовчуванням.

Якщо ви користувач TypeScript, з пропсом за замовчуванням вам може допомогти , який використовує функцію вищого порядку для забезпечення правильного визначення компонента із заданими 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>
)}

Зараз це працює нормально, але якщо у вас є більш складні компоненти та стан, такі як підключені компоненти response-redux із підключенням до бази даних та / або реакція useffect хуки та стан компонента, це може спричинити багато повторного відтворення.

Як правило, кращою практикою є створення об’єктів проп за замовчуванням, що створюються окремо, наприклад.

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>
)

0

Навіть, можливо, ви запитаєте, чому б не використовувати sth, як показано нижче, код props || 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а керування ними за допомогою ||оператора може зробити ваш код неприємним

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.