Я новичок в ReactJS, извините, если это звучит не так. У меня есть компонент, который создает несколько строк таблицы в соответствии с полученными данными.
Каждая ячейка в столбце имеет флажок радио. Следовательно, пользователь может выбрать один site_name
и один address
из существующих рядов. Выбор должен быть показан в нижнем колонтитуле. И вот где я застрял.
var SearchResult = React.createClass({
render: function(){
var resultRows = this.props.data.map(function(result){
return (
<tbody>
<tr>
<td><input type="radio" name="site_name" value={result.SITE_NAME}>{result.SITE_NAME}</input></td>
<td><input type="radio" name="address" value={result.ADDRESS}>{result.ADDRESS}</input></td>
</tr>
</tbody>
);
});
return (
<table className="table">
<thead>
<tr>
<th>Name</th>
<th>Address</th>
</tr>
</thead>
{resultRows}
<tfoot>
<tr>
<td>chosen site name ???? </td>
<td>chosen address ????? </td>
</tr>
</tfoot>
</table>
);
}
});
В jQuery я мог сделать что-то вроде $("input[name=site_name]:checked").val()
выбора одного типа переключателя радио и вставить его в первую ячейку нижнего колонтитула.
Но, конечно же, должен быть способ Reactjs, который мне совершенно не хватает? Большое спасибо
input
элементы не имеют содержания. Так<input>content</input>
что бессмысленно и недействительно. Вы можете хотеть<label><input />content</label>
.Ответы:
Любые изменения в рендеринге должны быть изменены через
state
илиprops
( реагировать на документы ).Итак, здесь я регистрирую событие ввода, а затем изменяю
state
, после чего рендер будет отображаться в нижнем колонтитуле.jsbin
источник
}, this);
под</tbody>
. Что это такое и что оно делает? Я заметил без этого код вылетает.this
Контекст передаетсяmap
функции . Это было редактирование @FakeRainBrigand, хороший улов! Без этого вашаthis
функция на карте будет ссылаться наwindow
state
this
трюк не нужен, если вы используете стрелку ES6 вместо обычной функции. Например:var resultRows = this.props.data.map((result) => { ... });
я упоминаю об этом только потому, что React-ы обычно уже используют некоторую форму транспиляции (для JSX), поэтому ES6 обычно находится в пределах легкой досягаемости.onInputChange (e) {this.setState({ [e.target.name]: e.target.value }); }
Вот самый простой способ реализации переключателей в реагировать JS.
Edited
Вы можете использовать функцию стрелки вместо привязки. Замените приведенный выше код как
<div onChange={event => this.setGender(event)}>
Для значения по умолчанию используйте
defaultChecked
, как этоисточник
.bind(this)
будет создавать новую функцию каждый раз. Это означает, что когда реагируют проверки, чтобы увидеть, изменилось ли что-либо в виртуальной DOM, этот компонент всегда будет другим и всегда нуждается в повторной визуализации.name
опору. Они оба заключены в div сonChange
обработчиком, как описано в этом ответе. Я нажимаю на первое радио, происходит событие. Я нажимаю второе радио, событие происходит. Третий раз и далее, однако, ни одно событие не происходит. Зачем?На основании того, что React Docs говорят :
Например:
Ссылка на пример: https://codesandbox.io/s/6l6v9p0qkr
Сначала ни одна из переключателей не выбрана, поэтому
this.state
это пустой объект, но всякий раз, когда выбирается переключатель,this.state
появляется новое свойство с именем входа и его значением. Затем легко проверить, выбрал ли пользователь какую-либо кнопку-переключатель, например:РЕДАКТИРОВАТЬ:
В версии 16.7-alpha React есть предложение для чего-то под названием,
hooks
которое позволит вам делать такие вещи проще:В приведенном ниже примере есть две группы переключателей в функциональном компоненте. Тем не менее, они контролировали входы:
Рабочий пример: https://codesandbox.io/s/6l6v9p0qkr
источник
Сделайте радио компонент как тупой компонент и передайте реквизит от родителя.
источник
Просто идея здесь: когда речь идет о радиовходах в React, я обычно представляю их все по-другому, как было упомянуто в предыдущих ответах.
Если это могло бы помочь любому, кому нужно сделать много переключателей:
источник
checked={ this.state.gender === value }
. Функциональных компонентов нетthis
.источник
Нажатие переключателя должно вызвать событие, которое либо:
self.props.selectionChanged(...)
В первом случае изменение состояния вызовет повторную визуализацию, и вы можете сделать
<td>chosen site name {this.state.chosenSiteName} </td>
во втором случае источник обратного вызова будет обновлять вещи, чтобы гарантировать, что в дальнейшем ваш экземпляр SearchResult будет иметь selectedSiteName и selectedAddress, установленные в его свойствах.
источник
Для того, чтобы опираться на ChinKang, сказанный для его ответа, у меня есть более сухой подход и в es6 для тех, кто заинтересован:
кроме этого будет иметь проверенное значение по умолчанию.
источник
Я также запутался в радио, флажок реализации. Нам нужно прослушать событие изменения радио, а затем установить состояние. Я сделал небольшой пример гендерного отбора.
источник
Bootstrap, ребята, мы делаем это так:
источник