Về cơ bản, tôi đang cố gắng làm cho các tab phản ứng, nhưng có một số vấn đề.
Đây là tệp page.jsx
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
Khi bạn bấm vào nút A, nhu cầu phần RadioGroup để bỏ chọn nút B .
"Đã chọn" chỉ có nghĩa là Tên lớp từ một tiểu bang hoặc thuộc tính
Đây là 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>);
}
});
Nguồn của Button.jsx
không thực sự quan trọng, nó có một nút radio HTML thông thường kích hoạt onChange
sự kiện DOM gốc
Luồng dự kiến là:
- Nhấp vào nút "A"
- Nút "A" kích hoạt onChange, sự kiện DOM gốc, tạo bong bóng cho RadioGroup
- Trình nghe RadioGroup onChange được gọi
- RadioGroup cần phải de-chọn nút B . Đây là câu hỏi của tôi.
Đây là vấn đề chính mà tôi đang gặp phải: Tôi không thể chuyển <Button>
s vàoRadioGroup
, bởi vì cấu trúc của cái này là do trẻ em tùy tiện . Đó là, đánh dấu có thể là
<RadioGroup>
<Button title="A" />
<Button title="B" />
</RadioGroup>
hoặc là
<RadioGroup>
<OtherThing title="A" />
<OtherThing title="B" />
</RadioGroup>
Tôi đã thử một vài thứ.
Cố gắng: Trong RadioGroup
trình xử lý onChange của:
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 });
});
Vấn đề:
Invalid access to component property "setState" on exports at the top
level. See react-warning-descriptors . Use a static method
instead: <exports />.type.setState(...)
Cố gắng: Trong RadioGroup
trình xử lý onChange của:
React.Children.forEach( this.props.children, function( child ) {
child.props.selected = child.props.value === e.target.value;
});
Vấn đề: Không có gì xảy ra, ngay cả khi tôi cung cấp cho Button
lớp một componentWillReceiveProps
phương thức
Cố gắng: Tôi đã cố gắng chuyển một số trạng thái cụ thể của cha mẹ cho con cái, vì vậy tôi có thể chỉ cần cập nhật trạng thái gốc và yêu cầu con cái phản hồi tự động. Trong chức năng kết xuất của RadioGroup:
React.Children.forEach( this.props.children, function( item ) {
this.transferPropsTo( item );
}, this);
Vấn đề:
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.
Giải pháp tồi # 1 : Sử dụng phương thức react-addons.js cloneWithProps để sao chép các phần tử con tại thời điểm kết xuất RadioGroup
để có thể chuyển các thuộc tính của chúng
Giải pháp không hợp lệ # 2 : Triển khai trừu tượng xung quanh HTML / JSX để tôi có thể chuyển các thuộc tính vào trong một cách động (giết tôi):
<RadioGroup items=[
{ type: Button, title: 'A' },
{ type: Button, title: 'B' }
]; />
Và sau đó RadioGroup
xây dựng động các nút này.
Câu hỏi này không giúp ích được gì cho tôi bởi vì tôi cần vẽ lại những đứa con của mình mà không biết chúng là gì
RadioGroup
thể biết rằng nó cần phải phản ứng với một sự kiện của những đứa trẻ độc đoán của nó? Nó nhất thiết phải biết điều gì đó về con cái của nó.