Динамічний атрибут у 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.