Lưu ý tôi đã cung cấp một câu trả lời sâu hơn ở đây
Trình bao bọc thời gian chạy:
Đó là cách thành ngữ nhất.
const Wrapper = ({children}) => (
<div>
<div>header</div>
<div>{children}</div>
<div>footer</div>
</div>
);
const App = () => <div>Hello</div>;
const WrappedApp = () => (
<Wrapper>
<App/>
</Wrapper>
);
Lưu ý rằng đó children
là "chỗ dựa đặc biệt" trong React và ví dụ trên là đường cú pháp và (gần như) tương đương với<Wrapper children={<App/>}/>
Trình bao bọc khởi tạo / HOC
Bạn có thể sử dụng Thành phần bậc cao (HOC). Họ đã được thêm vào tài liệu chính thức gần đây.
// Signature may look fancy but it's just
// a function that takes a component and returns a new component
const wrapHOC = (WrappedComponent) => (props) => (
<div>
<div>header</div>
<div><WrappedComponent {...props}/></div>
<div>footer</div>
</div>
)
const App = () => <div>Hello</div>;
const WrappedApp = wrapHOC(App);
Điều này có thể dẫn đến (ít) hiệu suất tốt hơn vì thành phần trình bao bọc có thể làm ngắn mạch kết xuất trước một bước với ShouldComponentUpdate, trong khi trong trường hợp trình bao bọc thời gian chạy, prop trẻ em có thể luôn luôn là một ReactEuity khác và gây ra kết xuất lại ngay cả khi các thành phần của bạn mở rộng PureComponent.
Lưu ý rằng connect
Redux từng là trình bao bọc thời gian chạy nhưng đã được thay đổi thành HOC vì nó cho phép tránh kết xuất lại vô dụng nếu bạn sử dụng pure
tùy chọn (theo mặc định là đúng)
Bạn không bao giờ nên gọi HOC trong giai đoạn kết xuất vì việc tạo các thành phần React có thể tốn kém. Bạn nên gọi các hàm bao này lúc khởi tạo.
Lưu ý rằng khi sử dụng các thành phần chức năng như trên, phiên bản HOC không cung cấp bất kỳ tối ưu hóa hữu ích nào vì các thành phần chức năng không trạng thái không thực hiện shouldComponentUpdate
Giải thích thêm tại đây: https://stackoverflow.com/a/31564812/82609
this.props.children
là một phần của API thành phần và dự kiến sẽ được sử dụng theo cách này. Các ví dụ của nhóm React sử dụng kỹ thuật này, như trong việc chuyển đạo cụ và khi nói về một đứa trẻ .