包含组合

  1. import React from "react";
  2. import ReactDOM from "react-dom";
  3. class Container extends React.Component {
  4. render() {
  5. console.log(this.props);
  6. return <div className="container">{this.props.children}</div>;
  7. }
  8. }
  9. class App extends React.Component {
  10. render() {
  11. // return <Container></Container>;
  12. // return <Container>123</Container>;
  13. // return <Container><p></p></Container>;
  14. return <Container>123<p></p><div></div></Container>;
  15. }
  16. }
  17. ReactDOM.render(<App />, document.getElementById("app"));

children

  1. 如果 Container 内部有内容,React 会在 props 内部增加 children 属性
  2. 如果 Container 内部有非元素内容,children 对应是非元素内容
  3. 如果 Container 内部有单个元素内容,children 对应是 React 元素内容
  4. 如果 Container 内部有多个内容,children 对应 […( 非元素 或 React 元素对象)] 内容

    props 可以传递任何东西

    包括 JSX ```jsx import React from “react”; import ReactDOM from “react-dom”;

class Container extends React.Component { render() { return (

{this.props.header}
{this.props.sidebar}
{this.props.main}
); } }

class Header extends React.Component { render() { return

HEADER

; } }

class SideBar extends React.Component { render() { return

SIDEBAR

; } }

class Main extends React.Component { render() { return

MAIN

; } }

class App extends React.Component { render() { return ( } sidebar={} main={

} /> ); } } ReactDOM.render(, document.getElementById(“app”));

  1. <a name="GCYiP"></a>
  2. ### 为什么 JSX 还可以通过 props 传递视图元素 或 React 元素?
  3. JSX 本质上都会转成 React 元素(对象 Object)<br />视图通过 props 传递的机比较像 vue 的插槽,React 没有 slot 的概念定义。<br />React 本身 请允许通过 Props 传递任何类型的数据到子组件
  4. <a name="y7NCW"></a>
  5. # CSS Module
  6. CSS 模块化<br />用 JS 的逻辑来调用 CSS样式
  7. > vite 要后缀 .module.css
  8. index.module.css
  9. ```css
  10. html,
  11. body {
  12. margin: 0;
  13. height: 100%;
  14. }
  15. h1,
  16. p {
  17. margin: 0;
  18. font-weight: normal;
  19. }
  20. .container{
  21. postion: relative;
  22. hegith: 100%;
  23. }
  24. .header {
  25. position: absolute;
  26. top: 0;
  27. left: 0;
  28. z-index: 3;
  29. width: 100%;
  30. height: 60px;
  31. background-color: #000;
  32. }
  33. .sidebar{
  34. position: absolute;
  35. top: 0;
  36. left: 0;
  37. z-index: 2;
  38. width: 300px;
  39. height: 100%;
  40. padding-top: 80px;
  41. box-sizing: border-box;
  42. background-color: orange;
  43. }
  44. .main {
  45. position: absolute;
  46. top: 0;
  47. left: 0;
  48. z-index: 1;
  49. width: 100%;
  50. height: 100%;
  51. padding: 80px 0 0 320px;
  52. background-color: green;
  53. }
  1. import style from 'index.moudle.css';
  2. class Container extends React.Component {
  3. render() {
  4. return (
  5. <div className={style.container} >
  6. <div className={style.header}>{this.props.header}</div>
  7. <div className={style.sidebar}>{this.props.sidebar}</div>
  8. <div className={style.main}>{this.props.main}</div>
  9. </div>
  10. );
  11. }
  12. }

多层组合

做一个 模态框,体现多层组合
把最公共的提出来,再通过包含组合的方式,想插入什么就插入什么。

  1. import React from "react";
  2. import ReactDOM from "react-dom";
  3. import styles from "./css/style.module.css";
  4. function Modal(props) {
  5. return (
  6. <div className={styles.modal}>
  7. <header className={styles.modalHeader}>
  8. <h1>{props.headerTitle}</h1>
  9. </header>
  10. <div className={styles.modalContent}>{props.children}</div>
  11. </div>
  12. );
  13. }
  14. function Alert(props) {
  15. return (
  16. <Modal headerTitle={props.headerTitle}>
  17. <p>{props.alertText}</p>
  18. </Modal>
  19. );
  20. }
  21. function WelcomeAlert() {
  22. return (
  23. <Alert
  24. headerTitle="欢迎您,亲爱的用户"
  25. alertText="您是我们最尊贵的用户, 您将会体验到不一样的服务!"
  26. />
  27. );
  28. }
  29. class App extends React.Component {
  30. render() {
  31. return <WelcomeAlert />;
  32. }
  33. }
  34. ReactDOM.render(<App />, document.getElementById("app"));
  1. html,
  2. body {
  3. margin: 0;
  4. height: 100%;
  5. }
  6. h1,
  7. p {
  8. margin: 0;
  9. font-weight: normal;
  10. }
  11. .modal {
  12. position: fixed;
  13. top: 60px;
  14. left: 50%;
  15. margin-left: -150px;
  16. width: 300px;
  17. box-shadow: 1px 3px 5px #999;
  18. border-radius: 10px;
  19. overflow: hidden;
  20. }
  21. .modalHeader {
  22. height: 44px;
  23. padding: 0 15px;
  24. box-sizing: border-box;
  25. line-height: 44px;
  26. background-color: orange;
  27. }
  28. .modalHeader h1 {
  29. font-size: 16px;
  30. }
  31. .modalContent {
  32. padding: 15px;
  33. box-sizing: border-box;
  34. background-color: #fff;
  35. }

继承问题

React 目前还没有发现需要组件继承的需求

  • 因为通过 children 或者传递视图 React 元素的方式完全解决组件组合的问题
    • props 传递任何类型的数据,所以组合的方式完全可以替代继承方案
  • 逻辑部分需要继承或者共用
    • 这个需要自己写逻辑抽离的模块、函数、类、单独进行模块导入使用