Условные атрибуты в React js

Как принять условные атрибуты в react.js

ниже мой компонент поиска, я хочу, чтобы InputGroup имел атрибут onSubmit, если передается функция onSubmit, и атрибут по изменению, если передается функция onChange

class QueryBar extends PureComponent {
  render() {
    const { placeholder, leftIcon, onSubmit, onChange, width } = this.props;
    return (
      <form
        style = {{ width }}
        onSubmit = {e => {
          e.preventDefault();
          onSubmit(e.target[0].value);
        }}
      >
        <InputGroup
          placeholder = {placeholder}
          width = {width}
          leftIcon = "search"
          rightElement = {
            <Button
              type = "submit"
              icon = {leftIcon}
              minimal = {true}
              intent = {Intent.PRIMARY}
            />
          }
        />
      </form>
    );
  }
}

QueryBar.propTypes = {
  width: PropTypes.number,
  placeholder: PropTypes.string,
  leftIcon: PropTypes.oneOfType(['string', 'element']),
  onSubmit: PropTypes.func
};

QueryBar.defaultProps = {
  placeholder: 'Search...',
  leftIcon: 'arrow-right',
  width: 360
};
export default QueryBar;

Вы не должны использовать условные атрибуты, а лучше обрабатывать их в функции. В функции вы можете проверить состояние ввода и на основе этого вы можете сделать преобразование по желанию (обновить, изменить, отправить и т. д.)

Facyo Kouch 18.07.2019 10:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
522
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете передать null, если его там нет, т.е.:

<InputGroup
          placeholder = {placeholder}
          width = {width}
          leftIcon = "search"
          onChange = {onChangeFn?onChangeFn:null} 
          onSubmit = {onSubmitFn ? onSubmitFn : null}
          rightElement = {
            <Button
              type = "submit"
              icon = {leftIcon}
              minimal = {true}
              intent = {Intent.PRIMARY}
            />
          }
        />

Он убедится, что функция есть, а затем вызовет функцию, иначе ничего не будет.

Я думаю, что лучше использовать логическое выражение, которое будет выражать значение false. false тоже не проходит.

Facyo Kouch 18.07.2019 10:22

@FacyoKouch Может быть. Но разве это не избыточно, так как только для двух условий мы пишем один и тот же компонент дважды ??

Shubham Verma 18.07.2019 10:25

Логическое выражение { onSubmitFn && onSubmitFn }. Так что использование && вместо ?, так что нет, я вовсе не нахожу это излишним

Facyo Kouch 18.07.2019 11:01

@FacyoKouch О, я понимаю другой подход. Тоже хороший способ.

Shubham Verma 18.07.2019 11:03

я бы сделал так:

Идея состоит в том, чтобы иметь объект optionalProps, пустой объект для любых возможных условных свойств, когда свойство существует, мы добавляем его к объекту, затем в компоненте InputGroup мы применяем его как {...optionalProps}, который будет извлекать любые добавленные свойства в объект. и ничего не возвращать, если null.

мы могли бы использовать другой подход: onChange = {onChange && onChange}

Но обратите внимание, что это вернет false как значение для случаев, когда onChange не существует.

  render() {
    const { placeholder, leftIcon, onSubmit, onChange, width } = this.props;
    let optionalProps = {};
    if (onChange){
      optionalProps['onChange'] = onChange;
    }
    if (onSubmit){
      optionalProps['onSubmit'] = onSubmit;
    }

    return (
      <form
        style = {{ width }}
        onSubmit = {e => {
          e.preventDefault();
          onSubmit(e.target[0].value);
        }}
      >
        <InputGroup
          placeholder = {placeholder}
          width = {width}
          leftIcon = "search"
          {...optionalProps}
          rightElement = {
            <Button
              type = "submit"
              icon = {leftIcon}
              minimal = {true}
              intent = {Intent.PRIMARY}
            />
          }
        />
      </form>
    );
  }
Ответ принят как подходящий

Элементы jsx также могут принимать объекты. Инициализируйте объект, который содержит информацию для обеих ситуаций, а затем добавьте условие, чтобы добавить функцию, если она существует в переданных свойствах.

render() {
    const { placeholder, leftIcon, onSubmit, onChange, width } = this.props;
    const inputGroupProps = {
    placeholder,
    width,
    leftIcon: 'search',
    rightElement: (
        <Button
        type = "submit"
        icon = {leftIcon}
        minimal = {true}
        intent = {Intent.PRIMARY}
        />
      )
    }
    if (onChange) {
    inputGroupProps.onChange = onChange
    }
    if (onSubmit) {
        inputGroupProps.onSubmit = onSubmit
    }
    return (
    <form
        style = {{ width }}
        onSubmit = {e => {
        e.preventDefault();
        onSubmit(e.target[0].value);
        }}
    >
        <InputGroup {...inputGroupProps} />
    </form>
    );
}

Хотя я не рекомендую это, добавление обоих технически допустимо, потому что свойство, которое не передается от родителя, но деструктурировано, будет undefined. Я не рекомендую это, потому что это не выразительно и, вероятно, смутит вас в будущем.

<InputGroup
placeholder = {placeholder}
width = {width}
leftIcon = "search"
rightElement = {
    <Button
    type = "submit"
    icon = {leftIcon}
    minimal = {true}
    intent = {Intent.PRIMARY}
    />
}
onChange = {onChange} // will be undefined and have no behavior if parent does not pass an onChange prop
onSubmit = {onSubmit} // same for this one
/>

Другие вопросы по теме