Как принять условные атрибуты в 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;



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете передать 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 тоже не проходит.
@FacyoKouch Может быть. Но разве это не избыточно, так как только для двух условий мы пишем один и тот же компонент дважды ??
Логическое выражение { onSubmitFn && onSubmitFn }. Так что использование && вместо ?, так что нет, я вовсе не нахожу это излишним
@FacyoKouch О, я понимаю другой подход. Тоже хороший способ.
я бы сделал так:
Идея состоит в том, чтобы иметь объект 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
/>
Вы не должны использовать условные атрибуты, а лучше обрабатывать их в функции. В функции вы можете проверить состояние ввода и на основе этого вы можете сделать преобразование по желанию (обновить, изменить, отправить и т. д.)