Динамический атрибут в ReactJS
Я хочу динамически включать/опускать отключенный атрибут на элемент кнопки. Я видел множество примеров динамических значений атрибутов, но не самих атрибутов. У меня есть следующая функция рендеринга:
render: function() {
var maybeDisabled = AppStore.cartIsEmpty() ? "disabled" : "";
return <button {maybeDisabled}>Clear cart</button>
}
Это вызывает ошибку синтаксического анализа из-за символа "{". Как включить/исключить отключенный атрибут на основе (логического) результата AppStore.cartIsEmpty()?
Ответы
Ответ 1
Самый чистый способ добавления дополнительных атрибутов (включая disabled
и другие, которые вы, возможно, захотите использовать), в настоящее время использовать атрибуты распространения JSX:
var Hello = React.createClass({
render: function() {
var opts = {};
if (this.props.disabled) {
opts['disabled'] = 'disabled';
}
return <button {...opts}>Hello {this.props.name}</button>;
}
});
React.render((<div><Hello name="Disabled" disabled='true' />
<Hello name="Enabled" />
</div>)
, document.getElementById('container'));
Используя атрибуты распространения, вы можете динамически добавлять (или переопределять) любые атрибуты, которые вам нужны, с помощью экземпляра объекта javascript. В моем примере выше код создает ключ disabled
(при этом в этом случае значение disabled
), когда свойство disabled
передается экземпляру компонента Hello
.
Если вы хотите использовать disabled
, но этот ответ хорошо работает.
Ответ 2
Вы можете передать логическое значение в атрибут disabled
.
render: function() {
return <button disabled={AppStore.cartIsEmpty()}>Clear cart</button>
}
Ответ 3
Я использую React 16, и это работает для меня (где bool
- ваш тест):
<fieldset {...(bool ? {disabled:true} : {})}>
В принципе, на основе теста (bool
) вы возвращаете объект с атрибутом или возвращаете пустой объект.
Кроме того, если вам нужно добавить или опустить несколько атрибутов, вы можете сделать это:
<fieldset {...(bool ? {disabled:true} : {})} {...(bool ? {something:'123'} : {})}>
Для более продуманного атрибута я предлагаю вам предварительно создать объект с (или без) атрибутами вне JSX.
Ответ 4
Более чистый способ динамических атрибутов, который работает для любых атрибутов,
function dynamicAttributes(attribute, value){
var opts = {};
if(typeof value !== 'undefined' && value !== null) {
opts['"'+attribute+'"'] = value;
return opts;
}
return false;
};
Вызовите свой реактивный компонент следующим образом
<ReactComponent {...dynamicAttributes("disabled",false)}
{...dynamicAttributes("data-url",dataURL)}
{...dynamicAttributes("data-modal",true)} />
Советы:
-
У вас может быть функция dynamicAttributes
в общем месте/утилитах и
импортировать его, чтобы использовать его во всех компонентах.
-
вы можете передать значение как null
, чтобы не отображать динамический атрибут
Ответ 5
В документации вы можете найти что-то подобное.
https://facebook.github.io/react/docs/transferring-props.html
В вашем случае может быть что-то вроде этого
function MyComponent(props) {
let { disabled, ...attrs } = props;
if (disabled) {
// thus, it will has the disabled attribute only if it
// is disabled
attrs = {
...attrs,
disabled: true
}
};
return (
<button {...attrs}>MyLabel</button>
)
}
Этот код использует ES6, но я понял, что у вас есть идея.
Это классно, потому что вы можете передать многие другие атрибуты этому компоненту, и он все равно будет работать.
Ответ 6
Версия, которую я использовал, была:
<button disabled={disabled ? 'disabled' : undefined}>
Click me (or dont)
</button>
Ответ 7
Решение, о котором упоминал AnilRedshift, гораздо более чистое, чем принятое решение, но которое я более подробно остановлюсь.
Проще говоря, атрибуты HTML имеют имя и значение. В качестве сокращения вы можете использовать имя только для "отключен", "множественный" и т.д. Но сокращенная версия по-прежнему работает и позволяет React работать в соответствии с предпочтениями.
disabled={disabled? 'disabled': undefined}
disabled={disabled? 'disabled': undefined}
является наиболее разборчивым решением.
Ответ 8
Простой и чистый способ сделать это
<button {...disabled && {disabled: true}}>Clear cart</button>
инвалиды должны прийти из реквизита, как это
<MyComponent disabled />
Ответ 9
Это может сработать, проблема с отключенным - нельзя просто установить для него boolean.
if(AppStore.cartIsEmpty()){
return "<button disabled>Clear cart</button>"
}
else
{
return "<button>Clear cart</button>"
}