Nếu bạn đang làm điều này đơn giản chỉ vì bạn muốn Trẻ cung cấp một đặc điểm có thể sử dụng lại cho cha mẹ của nó, thì bạn có thể xem xét việc đó bằng cách sử dụng đạo cụ kết xuất thay thế.
Kỹ thuật đó thực sự làm đảo lộn cấu trúc. Các Child
nay kết thúc tốt đẹp phụ huynh, vì vậy tôi đã đổi tên nó để AlertTrait
bên dưới. Tôi giữ tên Parent
cho sự liên tục, mặc dù bây giờ nó không thực sự là cha mẹ.
// Use it like this:
<AlertTrait renderComponent={Parent}/>
class AlertTrait extends Component {
// You may need to bind this function, if it is stateful
doAlert() {
alert('clicked');
}
render() {
return this.props.renderComponent(this.doAlert);
}
}
class Parent extends Component {
render() {
return (
<button onClick={this.props.doAlert}>Click</button>
);
}
}
Trong trường hợp này, AlertTrait cung cấp một hoặc nhiều đặc điểm mà nó truyền lại dưới dạng đạo cụ cho bất kỳ thành phần nào được cung cấp trong chỗ dựa của nó renderComponent
.
Phụ huynh nhận được doAlert
như một chỗ dựa và có thể gọi nó khi cần thiết.
(Để rõ ràng, tôi đã gọi prop renderComponent
trong ví dụ trên. Nhưng trong các tài liệu React được liên kết ở trên, họ chỉ gọi nó render
.)
Thành phần Trait có thể kết xuất nội dung xung quanh Parent, trong chức năng kết xuất của nó, nhưng nó không kết xuất bất cứ thứ gì bên trong cha mẹ. Trên thực tế, nó có thể kết xuất những thứ bên trong Parent, nếu nó truyền một prop khác (ví dụ renderChild
) cho cha mẹ, mà sau đó cha mẹ có thể sử dụng trong phương thức render của nó.
Điều này hơi khác so với những gì OP yêu cầu, nhưng một số người có thể kết thúc ở đây (như chúng tôi đã làm) vì họ muốn tạo ra một đặc điểm có thể tái sử dụng và nghĩ rằng một thành phần trẻ em là một cách tốt để làm điều đó.