2015-12-31 2 views
3

Что такое правильный способ использования булевых данных в переключателях. Значения будут преобразованы из булевых в строки, если они используются напрямую.ReactJS: Как использовать логические значения в переключателях?

JSON-данные для полого ввода, которые поджаты:

var question = [ 
    {value: true, name: "Yes"}, 
    {value: false, name: "Not this time"} 
] 

Кнопка радио поле:

<input type="radio" 
     name="question" 
     onChange={this.state.onRadioChange} 
     value={this.state.question[0].value} /> {this.state.question[0].name} 
<input type="radio" 
     name="question" 
     onChange={this.state.onRadioChange} 
     value={this.state.question[1].value} /> {this.state.question[1].name} 

связывание для onRadioChange:

onRadioChange: function(e) { 
    console.log(e.target.value); 
} 

на консоль журнал отображает, что выбранные значения преобразуются из булевых в строки.

Одним из способов обработки этого является добавление дополнительной функции к функции onRadioChange для преобразования строк "true"/"false" в booleans от e.target.value, но это немного походит на хакерство. Кроме того, использование только «e.target.checked» не будет работать, потому что в некоторых группах переключателей у меня есть другие значения, чем booleans (которые необходимо передать).

Некоторым универсальным и чистым решением было бы использовать таблицу постоянных значений, которая преобразуется из и в REST.

Есть ли какой-нибудь специальный способ ReactJS? Возможно, нет.

+0

Значение _Attribute_ всегда _String_. Если это значение должно быть _truthy_ или _falsy_, то единственным _falsy String_ является '' '' ', т. Е.'! '"; // true' –

+0

@PaulS. Да, хороший момент. С JSON-данными это довольно распространенная ситуация, когда вам нужно привязать булевы значения к радиокнонам, а некоторые фреймворки/библиотеки имеют автоматические преобразования при привязках. Я хочу знать, как люди это реагируют, и есть какие-то волшебные помощники. – Pekka

+0

Я думаю, что вы можете 'foo || '' ', но вам может потребоваться проверить ваши данные отправки после того, как может исчезнуть ложный выбор. –

ответ

1

В настоящее время решение состоит в том, чтобы преобразовать переданные атрибуты из строковых значений в boolean перед сохранением.

var function = str2bool(value) { 
    if (value && typeof value === 'string') { 
    if (value.toLowerCase() === "true") return true; 
    if (value.toLowerCase() === "false") return false; 
    } 
    return value; 
} 

и вызывая преобразование:

onRadioChange: function(e) { 
    console.log(str2bool(e.target.value)); 
    // Here we can send the data to further processing (Action/Store/Rest) 
} 

Таким образом, данные готовы быть отправлены через действия на отдых или магазины, и он работает непосредственно с радио-кнопок.

3

Используйте проверенный атрибут ввода для переключателей. Этот атрибут использует булевы.

+0

e.target.значение по-прежнему является строкой, которая отличается от исходного JSON (они могут использовать одну и ту же структуру данных в Store) – Pekka

+2

event.target.checked –

+0

Проверено, вероятно, правильный способ ведения булевых операций. Хотя (в этом случае) иногда мне нужно иметь строковые значения с несколькими кнопками. – Pekka

1

В случае, если вы ищете способ управления переключателем проверяется состояние с React, вот вам пример:

var RadioButtons = React.createClass({ 
    getInitialState: function() { 
    // Assuming there is always one option set to true. 
    return { 
     question: this.props.options.filter(function (option) { 
     return option.value; 
     })[0].name 
    }; 
    }, 
    onRadioChange: function (e) { 
    this.setState({ 
     question: e.target.value 
    }); 
    }, 
    render: function() { 
    var options = this.props.options.map(function (option, key) { 
     return (
     <li key={key}> 
      <input type="radio" 
      name="question" 
      onChange={this.onRadioChange} 
      checked={this.state.question === option.name} 
      value={option.name} /> {option.name} 
     </li> 
    ); 
    }, this); 
    return (
     <ul style={{listStyle: 'none'}}> 
     {options} 
     </ul> 
    ); 
    } 
}); 

Этот компонент можно затем использовать передавая свой question список в качестве свойств:

<RadioButtons options={question} /> 

Проверьте это fiddle.

Смежные вопросы