Есть ли способ добавить атрибуты в компонент React, только если выполняется определенное условие?
Я должен добавить обязательные атрибуты и атрибуты readOnly для элементов формы на основе вызова Ajax после рендеринга, но я не вижу, как это решить, поскольку readOnly = "false" - это не то же самое, что полное исключение атрибута.
Пример ниже должен объяснить, что я хочу, но это не сработает (Ошибка разбора: неожиданный идентификатор).
var React = require('React');
var MyOwnInput = React.createClass({
render: function () {
return (
<div>
<input type="text" onChange={this.changeValue} value={this.getValue()} name={this.props.name}/>
</div>
);
}
});
module.exports = React.createClass({
getInitialState: function () {
return {
isRequired: false
}
},
componentDidMount: function () {
this.setState({
isRequired: true
});
},
render: function () {
var isRequired = this.state.isRequired;
return (
<MyOwnInput name="test" {isRequired ? "required" : ""} />
);
}
});
javascript
reactjs
Реми Стуре
источник
источник
aria-modal=true
, вы помещаете изменения (в false) в хранилище атрибутов aria / data , но ничего больше не изменяется (например, содержимое компонента или класс или переменные в нем), так как в результате ReactJ не будет обновлять aria / атрибуты данных в этих компонентах. Я целый день возился с этим, чтобы понять это.Ответы:
Очевидно, для определенных атрибутов React достаточно умен, чтобы пропустить атрибут, если значение, которое вы передаете ему, неверно. Например:
приведет к:
Обновление: если кому - то интересно, как / почему это происходит, вы можете найти подробную информацию в исходном коде ReactDOM, в частности , в строках 30 и 167 из DOMProperty.js файла.
источник
null
означает «действовать так, как будто я этого не указал». Для логических атрибутов dom значение true / false предпочтительнее, чем повторение имени атрибута / false, например,<input disabled>
компилируется вReact.createElement('input', {disabled: true})
="required"
часть вручную . На самом деле Chrome отображал только атрибут без значения.readonly
никогда не добавляется, потому что React ожидает атрибутreadOnly
(с большой буквы O).alt={props.alt || null}
.false
, но толькоnull
удостоверился, что атрибут был фактически удален.Ответ Хуандемарко, как правило, правильный, но здесь есть другой вариант.
Постройте объект так, как вам нравится:
Рендеринг со спредом, при желании можно передать и другие реквизиты.
источник
_extends
к нему добавлена функция , которая (при нормальных обстоятельствах) будет приниматьprops
построенное из «нормальные атрибуты» и применитьObject.assign(props, inputProps)
.Ниже приведен пример использования Bootstrap «S с
Button
помощью React-Bootstrap (версия 0.32.4):В зависимости от условий, либо
{bsStyle: 'success'}
или{}
будут возвращены. Затем оператор распространения распространит свойства возвращаемого объекта наButton
компонент. В ложном случае, поскольку в возвращаемом объекте не существует никаких свойств, компоненту ничего не передается.Альтернативный способ, основанный на комментарии Энди Полхилла :
Лишь небольшая разница в том , что во втором примере внутренний компонент
<Button/>
«sprops
объект будет иметь ключbsStyle
со значениемundefined
.источник
{bsStyle: 'success'}
или{}
результаты от него), то , что объект является распространение.<Button bsStyle={ condition ? 'success': undefined } />
я найду синтаксис немного проще, передачаundefined
пропустит свойство.<Button/>
«sprops
объект будет иметь ключbsStyle
со значениемundefined
.Вот альтернатива.
Или его встроенная версия
источник
condition
равно false, это попытается расширить / перебрать значение false, что я не считаю правильным.false
не один. Просто посоветуйтесь с Бабелем. Это работает с ним, когдаcondition
оценивается как ложное, поскольку Бабель реализует оператор. Хотя тривиальный обходной путь может быть...( condition ? { disabled: true } : {} )
, он становится немного многословным тогда. Спасибо за этот хороший вклад!data-*
илиaria-*
атрибуты, так как они являются особым случаем в JSX, поэтомуdata-my-conditional-attr={ false }
выводит,data-my-conditional-attr="false"
а не пропускает атрибут. facebook.github.io/react/docs/dom-elements.htmlВот способ, которым я делаю это.
С условным :
Я по-прежнему предпочитаю использовать обычный способ передачи подпорок, потому что он более читабелен (на мой взгляд) в случае отсутствия каких-либо условий.
Без условного :
источник
...(tooltip && { tooltip }),
? Он работает на компоненте, но когда я пытаюсь использовать что-то подобное в коде, я получаю сообщение об ошибке, означающее, что я пытаюсь распространить не повторяемое значениеfalseyValue && {}
что вернет ложь, так что, вероятно, вы распространяетесь на ложь, например...(false)
. гораздо лучше использовать полное выражение, чтобы распространение продолжало себя вести...(condition ? {foo: 'bar'} : {})
Вы можете использовать тот же ярлык, который используется для добавления / удаления (частей) компонентов (
{isVisible && <SomeComponent />}
).источник
someCondition
это правда, ноsomeValue
ложно (например,false
само по себе или0
и т. Д.), Атрибут все еще включается? Это важно, если необходимо явно включить ложное значение, например, a0
для атрибута координаты и т. Д.data-*
иaria-*
, см. Мой комментарий выше. Если вы заключите значение в кавычки или приведете его в виде строки, атрибут будет отображаться: например,someAttr={ `${falsyValue}` }
может визуализироватьsomeAttr="false"
Допустим, мы хотим добавить пользовательское свойство (используя aria- * или data- *), если условие истинно:
Допустим, мы хотим добавить свойство стиля, если условие истинно:
источник
Если вы используете ECMAScript 6, вы можете просто написать так.
источник
Это должно работать, так как ваше состояние изменится после вызова Ajax, а родительский компонент будет перерисован.
источник
В React вы можете условно визуализировать Компоненты, а также их атрибуты, такие как props, className, id и многое другое.
В React очень полезно использовать троичный оператор, который может помочь вам условно визуализировать компоненты.
В примере также показано, как условно отобразить Компонент и его атрибут стиля.
Вот простой пример:
источник
Рассматривая пост JSX In Depth , вы можете решить свою проблему следующим образом:
источник