Как условно добавить атрибуты для компонентов React?
Есть ли способ добавлять атрибуты к компоненту React, если выполняется определенное условие?
Я должен добавить необходимые атрибуты readOnly для формирования элементов на основе ajax-вызова после рендеринга, но я не вижу, как это решить, поскольку readOnly = "false" не то же самое, что полностью исключить атрибут.
В приведенном ниже примере объясняется, что я хочу, но не работаю (Parse Error: Неожиданный идентификатор).
var React = require('React');
var MyOwnInput = React.createClass({
render: function () {
return (
<div>
<input type="text" onChange={this.changeValue} value={this.getValue()} name={this.props.name}/>
</div>
);
}
});
module.exports = React.createClass({
getInitialState: function () {
return {
isRequired: false
}
},
componentDidMount: function () {
this.setState({
isRequired: true
});
},
render: function () {
var isRequired = this.state.isRequired;
return (
<MyOwnInput name="test" {isRequired ? "required" : ""} />
);
}
});
Ответы
Ответ 1
Очевидно, для определенных атрибутов React достаточно умен, чтобы пропустить атрибут, если значение, которое вы передаете ему, неверно. Например:
var InputComponent = React.createClass({
render: function() {
var required = true;
var disabled = false;
return (
<input type="text" disabled={disabled} required={required} />
);
}
});
приведет к:
<input type="text" required>
Обновление: если кому-то интересно, как и почему это происходит, подробности можно найти в исходном коде ReactDOM, в частности, в строках 30 и 167 из файл DOMProperty.js.
Ответ 2
Просто выберите другой вариант, но ответ @juandemarco, как правило, правильный.
Создайте объект, как вам нравится:
var inputProps = {
value: 'foo',
onChange: this.handleChange
};
if (condition) inputProps.disabled = true;
Render with spread, необязательно передавая другие реквизиты.
<input
value="this is overridden by inputProps"
{...inputProps}
onChange={overridesInputProps}
/>
Ответ 3
Вот пример использования BootstrapButton
через React-Bootstrap (версия: 0.32.4).
var condition = true;
return (
<Button {...(condition ? {bsStyle: 'success'} : {})} />
);
В зависимости от условия будут возвращены {bsStyle: 'success'}
или {}
. Затем оператор распространения распространит свойства возвращаемого объекта на компонент Button
. В ложном случае, поскольку в возвращаемом объекте не существует никаких свойств, компоненту ничего не передается.
Альтернативный способ, основанный на комментарии @Andy Polhill ниже:
var condition = true;
return (
<Button bsStyle={condition ? 'success' : undefined} />
);
Единственное небольшое отличие состоит в том, что во втором примере объект внутреннего компонента <Button/>
props
будет иметь ключ bsStyle
со значением undefined
.
Ответ 4
Поздняя вечеринка. Вот альтернатива.
var condition = true;
var props = {
value: 'foo',
...( condition && { disabled: true } )
};
var component = <div { ...props } />;
Или его встроенная версия
var condition = true;
var component = (
<div
value="foo"
{ ...( condition && { disabled: true } ) } />
);
Ответ 5
Вот как я это делаю.
с условным:
<Label
{...{
text: label,
type,
...(tooltip && { tooltip }),
isRequired: required
}}
/>
Я по-прежнему предпочитаю использовать обычный способ передачи подпорок, потому что он более читабелен (на мой взгляд) в случае отсутствия каких-либо условий.
без условного:
<Label text={label} type={type} tooltip={tooltip} isRequired={required} />
Ответ 6
Вы можете использовать тот же ярлык, который используется для добавления/удаления (частей) компонентов ({isVisible && <SomeComponent />}
).
class MyComponent extends React.Component {
render() {
return (
<div someAttribute={someCondition && someValue} />
);
}
}
Ответ 7
Поздно к вечеринке.
Предположим, мы хотим добавить настраиваемое свойство (используя aria- * или data- *), если условие истинно:
{...this.props.isTrue && {'aria-name' : 'something here'}}
Предположим, мы хотим добавить свойство стиля, если условие истинно:
{...this.props.isTrue && {style : {color: 'red'}}}
Ответ 8
Если вы используете es6, вы можете просто написать вот так.
// first, create a wrap object.
const wrap = {
[variableName]: true
}
// then, use it
<SomeComponent {...{wrap}} />
Ответ 9
Это должно работать, поскольку ваше состояние изменится после вызова ajax, и родительский компонент будет повторно рендерить.
render : function () {
var item;
if (this.state.isRequired) {
item = <MyOwnInput attribute={'whatever'} />
} else {
item = <MyOwnInput />
}
return (
<div>
{item}
</div>
);
}
Ответ 10
В React вы можете условно визуализировать компоненты, а также их атрибуты, такие как props, className, id и другие.
В React очень хорошая практика использовать "Тернарный оператор", который может помочь вам условно визуализировать Компоненты.
Пример показывает также, как условно визуализировать Компонент и его атрибут стиля
Вот простой пример:
class App extends React.Component {
state = {
isTrue: true
};
render() {
return (
<div>
{this.state.isTrue ? (
<button style={{ color: this.state.isTrue ? "red" : "blue" }}>
I am rendered if TRUE
</button>
) : (
<button>I am rendered if FALSE</button>
)}
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
Ответ 11
Принимая во внимание этот пост JSX в глубине, вы можете решить свою проблему следующим образом
if (isRequired) {
return (
<MyOwnInput name="test" required='required' />
);
}
return (
<MyOwnInput name="test" />
);