Динамічний атрибут у ReactJS


92

Я хочу динамічно включати / опускати відключений атрибут елемента кнопки. Я бачив безліч прикладів динамічних значень атрибутів, але не самих атрибутів. У мене є така функція візуалізації:

render: function() {
    var maybeDisabled = AppStore.cartIsEmpty() ? "disabled" : "";
    return <button {maybeDisabled}>Clear cart</button>
}

Це видає помилку синтаксичного аналізу через символ "{". Як я можу включити / опустити атрибут disabled на основі (логічного) результату AppStore.cartIsEmpty ()?

Відповіді:


168

В даний час найчистішим способом додавання необов’язкових атрибутів (включаючи 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, ця відповідь працює добре.


Опинившись на місці, CSS типу: a[disabled] { pointer-events: none; }зупинить дії над елементом / компонентом
timbo

49

Ви можете передати логічне значення disabledатрибуту.

render: function() {
    return <button disabled={AppStore.cartIsEmpty()}>Clear cart</button>
}

8
Ні, ви не можете. наявність атрибута disabled відключає кнопку повністю. див. http://jsfiddle.net/ttjhyvmt/
Тіммі

20
React досить розумний, щоб умовно встановити disabledатрибут на отриманий HTML в залежності від значення, яке ви передали jsfiddle.net/kb3gN/10379
Александр Кірзенберг,

2
не впевнений, як я це пропустив, дякую! хоча це працює для мого конкретного випадку, я прийняв іншу відповідь, яка опускає / включає атрибути
Тіммі

1
Були проблеми з IE11, однак ми не використовували останню реакцію. Відповідь атрибутів розповсюдження JSX спрацювала.
LessQuesar

24

Я використовую React 16, і це працює для мене (де bool ваш тест):

<fieldset {...(bool ? {disabled:true} : {})}>

В основному, на основі тесту (bool ) ви повертаєте об’єкт з атрибутом або повертаєте порожній об’єкт.

Крім того, якщо вам потрібно додати або опустити кілька атрибутів, ви можете зробити це:

<fieldset {...(bool ? {disabled:true} : {})} {...(bool ? {something:'123'} : {})}>

Для більш складних атрибутів, якими я управляю, я пропоную вам заздалегідь створити об’єкт з (або без) атрибутами поза JSX.


Дякую за цю просту, але дуже корисну відповідь!
tommygun

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

Поради:

  1. Ви можете мати dynamicAttributesфункцію в загальному місці / утилітах та імпортувати її, щоб використовувати її у всіх компонентах

  2. ви можете передати значення, nullщоб не відображати динамічний атрибут


Чому б не зробити так: <ReactComponent {... {"data-url": dataURL}} />? це простіше і не потребує "DynamAttributes"
gdbdable

Якщо атрибут нульовий, ми не хочемо реагувати на візуалізацію цього атрибута. приклад: "data-modal": null, ми не хочемо реагувати на показ data-model = "null". у цьому випадку мій наведений вище код навіть не показує атрибут, тобто динамічний атрибут на основі значення.
Венкат Редді

2

Ви можете знайти щось подібне до цього в документації.

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, але я розумію, що у вас ідея.

Це круто, тому що ви можете передавати багато інших атрибутів цьому компоненту, і він все одно буде працювати.


2

Версія, якою я користувалася:

<button disabled={disabled ? 'disabled' : undefined}>
    Click me (or dont)
</button>

Поганою практикою є використання невизначеного у коді. Це також непотрібно, оскільки ви можете просто написати <button disabled = {disabled}>, оскільки disabled - це логічна змінна, ніж повертає true або false
Рафаель Пінель

Чому невизначена погана практика? Посилання, якщо це можливо. Також, можливо, реагує належним чином на обробку булів, але на момент написання Вашої пропозиції не спрацює належним чином
AnilRedshift

2

Простий і чистий спосіб зробити це

<button {...disabled && {disabled: true}}>Clear cart</button>

інваліди повинні надходити з таких реквізитів

<MyComponent disabled />

1

Набагато чистішим за прийняте рішення є рішення, про яке згадував AnilRedshift, але про яке я розповім далі.

Простіше кажучи, атрибути HTML мають ім’я та значення. Як скорочення ви можете використовувати це ім'я лише для "відключених", "кількох" і т. Д. Але довговічна версія все ще працює, і React дозволяє працювати найкращим чином.

disabled={disabled ? 'disabled' : undefined} є найбільш читабельним рішенням.


0

Спочатку ви можете просто перевірити

<button disabled={true}>Button 1</button>
<button disabled={false}>Button 2</button>

Примітка: ** вимкнене значення не є рядком, воно має бути логічним .

Тепер щодо динаміки. Ви можете просто писати

<button type="button" disabled={disable}  
        onClick={()=>this.setSelectValue('sms')} >{this.state.sms}</button>

Як бачите, я використовую відключене властивість, і в фігурних дужках це може бути локальна змінна / стан var. Змінна disableмістить значення true / false.


-3

Це може спрацювати, проблема з відключеним полягає в тому, що не можна просто встановити для нього логічну форму.

if(AppStore.cartIsEmpty()){
  return "<button disabled>Clear cart</button>"
}
else
{
  return "<button>Clear cart</button>"
}

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