Я по сути пытаюсь сделать вкладки в реакции, но с некоторыми проблемами.
Вот файл page.jsx
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
Когда вы нажимаете кнопку A, компонент RadioGroup должен отменить выбор кнопки B .
«Выбранный» означает просто 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>);
}
});
Источник на Button.jsx
самом деле не имеет значения, у него есть обычный переключатель HTML, который запускает собственное onChange
событие DOM
Ожидаемый поток:
- Нажмите кнопку "A"
- Кнопка «A» запускает onChange, собственное событие DOM, которое всплывает в RadioGroup.
- RadioGroup onChange слушатель называется
- RadioGroup нужно отменить выбор кнопки B . Это мой вопрос.
Вот основная проблема, с которой я сталкиваюсь: я не могу перейти в <Button>
sRadioGroup
, потому что его структура такова, что дочерние элементы являются произвольными . То есть разметка могла быть
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
или же
<RadioGroup>
<OtherThing title="A" />
<OtherThing title="B" />
</RadioGroup>
Я пробовал несколько вещей.
Попытка: В RadioGroup
обработчик OnChange «s:
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.
Плохое решение №1 : используйте метод response -addons.js cloneWithProps для клонирования дочерних элементов во время рендеринга, RadioGroup
чтобы иметь возможность передавать им свойства
Плохое решение №2 : реализовать абстракцию вокруг HTML / JSX, чтобы я мог передавать свойства динамически (убейте меня):
<RadioGroup items=[
{ type: Button, title: 'A' },
{ type: Button, title: 'B' }
]; />
А затем RadioGroup
динамически создавайте эти кнопки.
Этот вопрос мне не помогает, потому что мне нужно представить своих детей, не зная, что они из себя представляют.
RadioGroup
знать, что им нужно реагировать на событие своих произвольных потомков? Ему обязательно нужно что-то знать о своих детях.