React 父子组件数据关系与状态提升(5)

父子组件数据关系与状态提升

状态提升:两个组件(无父子关系)共享一个数据并同步数据变化,即将子组件中的数据提升到父组件中进行操作和管理,通过 props 传递给子组件

类组件调用(实例化)的时候,组件内部的状态是唯一且独立的,组件之间数据不共享

组件嵌套与调用,和类组件还是函数组件没有关系

组合与继承、CSS Module

React 目前还没有发现有需要组件继承的需求,因为通过 children 或者传递视图 React 元素的方式完全可以解决组件组合的问题,props 可以传递任何类型的数据,所以组合的方式完全可以替代继承方案

逻辑部分需要继承或者共用时,需要自己去写逻辑抽离的模块、函数、类,单独进行模块导入使用


// 1. 如果 Container 内部有内容,React 会在 props 内部增加 children 属性

// 2. 如果 Container 内部有非元素内容,children:非元素内容,如文本

// 3. 如果 Container 内部有单个元素内容,children:React 元素对象

// 4. 如果 Container 内部有多个元素内容,childre:[...(React 元素对象)]



// css module 模块化

import styles from './index.module.css'



class Container extends React.Component {

  render() {

    return (

      <div className={styles.container}>

        <div className="header">{this.props.header}</div>

        <div className="sidebar">{this.props.sidebar}</div>

        <div className="main">{this.props.main}</div>

      </div>


    );

  }

}



class Header extends React.Component {

  render() {

    return <p>Header</p>;

  }

}

class SideBar extends React.Component {

  render() {

    return <p>SideBar</p>;

  }

}

class Main extends React.Component {

  render() {

    return <p>Main</p>;

  }

}



class App extends React.Component {

  render() {

    return (

      <Container header={<Header />} sidebar={<SideBar />} main={<Main />} />

    );

  }

}



ReactDOM.render(<App />document.querySelector("#app"));

为什么 JSX 可以通过 props 传递视图元素、React 元素?

JSX 本质上都会转为 React 元素,视图通过 props 传递的机制比较像 Vue 的插槽(slot),React 本身就允许通过 props 传递任何类型的数据到子组件


function Modal(props{

  return (

    <div>

      <header>

        <h1>{props.modalHeader}</h1>

      </header>

      <div className="content">{props.children}</div>

    </div>


  );

}



function Alert(props{

  return (

    <Modal modalHeader={props.headerTitle}>

      <p>{props.alertText}</p>

    </Modal>


  );

}



function WelcomeAlert(props{

  return <Alert headerTitle="Alert - 欢迎标题" alertText="Alert - 欢迎欢迎"></Alert>;

}



function LoginModal(props{

  return (

    <Modal modalHeader="登录">

      // 通过 props 将 JSX 传递给子组件

      <form action="" method="post">

        <p>

          <button>登录</button>

        </p>

      </form>

    </Modal>


  );

}



function App({

  return (

    <div>

      <WelcomeAlert />

      <LoginModal />

    </div>


  );

}



ReactDOM.render(<App />document.querySelector("#app"));


原文始发于微信公众号(前端华先生):React 父子组件数据关系与状态提升(5)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/55349.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!