Я по существу пытаюсь внести вкладки в реакцию, но с некоторыми проблемами.Reactjs: как изменить динамическое состояние дочернего компонента или реквизит от родителя?
Вот файл page.jsx
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
При нажатии на кнопку А, компонент RadioGroup нужно отменить выбор кнопки B.
«Selected» просто означает Classname из состояния или свойства
Вот RadioGroup.jsx
:
module.exports = React.createClass({
onChange: function(e) {
// How to modify children properties here???
},
render: function() {
return (<div onChange={this.onChange}>
{this.props.children}
</div>);
}
});
Источник действительно не имеет значения, то есть кнопка регулярные HTML радио, который вызывает родной DOM onChange
событие
ожидаемый поток:
- Нажмите на кнопку "A"
- Кнопка "A" вызывает OnChange, родное событие DOM, который пузырится до RadioGroup
- RadioGroup OnChange слушатель называется
- RadioGroup необходимо отменить выбор кнопки B , Это мой вопрос.
Вот главная проблема, я встречая: Я не может двигаться <Button>
сек в RadioGroup
, потому что структура этого такова, что дети произвольное. То есть, разметка может быть
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
или
<RadioGroup>
<OtherThing title="A" />
<OtherThing title="B" />
</RadioGroup>
Я попробовал несколько вещей.
Попытка: В RadioGroup
's OnChange обработчика:
React.Children.forEach(this.props.children, function(child) {
// Set the selected state of each child to be if the underlying <input>
// value matches the child's value
child.setState({ selected: child.props.value === e.target.value });
});
Проблема:
Invalid access to component property "setState" on exports at the top
level. See react-warning-descriptors . Use a static method
instead: <exports />.type.setState(...)
Попытка: В RadioGroup
' обработчик OnChange s:
React.Children.forEach(this.props.children, function(child) {
child.props.selected = child.props.value === e.target.value;
});
Проблема: Ничего не происходит, даже я даю Button
класс это метод componentWillReceiveProps
Попытка: Я попытался пройти некоторое определенное состояние родителя к детям, поэтому я может просто обновить родительское состояние и дать детям ответ автоматически. В зависимости от RadioGroup визуализации:
React.Children.forEach(this.props.children, function(item) {
this.transferPropsTo(item);
}, this);
Проблема:
Failed to make request: Error: Invariant Violation: exports: You can't call
transferPropsTo() on a component that you don't own, exports. This usually
means you are calling transferPropsTo() on a component passed in as props
or children.
Bad решение # 1: Использование реагировать-addons.js cloneWithProps метод клонирования детей во время визуализации в RadioGroup
для того, чтобы передать им свои свойства
Bad решение # 2: Реализовать абстракцию вокруг HTML/JSX, так что я могу передать в свойствах динамически (убить меня):
<RadioGroup items=[
{ type: Button, title: 'A' },
{ type: Button, title: 'B' }
]; />
А потом в RadioGroup
динамически создавать эти кнопки.
This question мне не помогает, потому что мне нужно сделать мои дети, не зная, что они
Если дети могут быть произвольными, то как «Радиогруппа», возможно, знает, что ей нужно реагировать на случай произвольных детей? Он обязательно должен знать что-то о своих детях. –
В общем случае, если вы хотите изменить свойства компонента, которого у вас нет, клонируйте его, используя ['React.addons.cloneWithProps'] (https://facebook.github.io/react/docs/clone-with -props.html) и передать новые реквизиты, которые вы хотели бы иметь. 'props' неизменяемы, поэтому вы создаете новый хеш, объединяете его с текущими реквизитами и передаете новый хэш как« реквизит »в новый экземпляр дочернего компонента. –