美文网首页
react_06组件化开发(一)

react_06组件化开发(一)

作者: 小话001 | 来源:发表于2021-07-19 16:54 被阅读0次

组件化:

用分而治之的思想去处理应用或页面,一个页面分成多组件,每个组件实现功能块,可以重复利用,便于维护,模块化和组件化的概念就是基于此。

vscode插件:ES7 React

掌握常见的快捷键:rcc、rpc等等


React中的组件化:

以定义方式来划分:
1.类组件

  • 组件名称大写字符开头
  • 类组件需要继承React.Component
  • 类组件必须实现render函数
import React, { Component } from 'react'
export default class App extends Component {
  render() {
    return (
      <div>
          <h2>类组件</h2>
      </div>
    )
  }
}

2.函数式组件(不带hooks情况下)

  • 函数的返回值与类组件render函数返回一样的内容
  • 没有生命周期函数
  • 没有this(组件实例)
  • 没有内部状态(state)
export default function App(){
  return(
    <div>
       <h2>函数式组件</h2>
    </div>
  )
}

render函数返回值:

可以返回常见的jsx创建的React元素自定义组件数组fragmentsPortals字符串数值类型布尔null

//返回数组中间以逗号分割
export default class App extends Component {
  render() {
    return [
      <div>
        <h2>类组件</h2>
      </div>,
       <div>
       <h2>类组件2</h2>
     </div>,
    ];
  }
}

类组件生命周期

常见的生命周期,装载阶段、更新阶段、卸载阶段
1.constructor

  • 可以实现也可以不实现
  • 初始化state
  • 为事件绑定实例(this)

2.componentDidMount

  • 依赖于DOM的操作在这进行
  • 在此发送网络请求
  • 在此添加一些订阅

3.componentDidUpdate

  • 组件更新后立即被触发
  • 首次渲染不会被触发

4.componentWillUnmount

  • 执行必要的清理操作
  • 清除Timer,取消网络请求,清除订阅

不常见的生命周期
1.getDerivedStateFromProps,state的值在任何时候都依赖于props;方法返回一个对象更新state;
2.getSnapshotBeforeUpdate ,更新前的回调,获取DOM更新前的信息(比如滚动位置)
3.shouldComponentUpdate ,优化性能时候经常用到

生命周期演示
//app.js

import React, {Component} from 'react';
export default class App extends Component{
  constructor(){
    console.log("执行constructor");
    super();
    this.state={
      counter:10,
      flag:true
    }
    this.addNum=this.addNum.bind(this);
  }
  render(){
    return  (
    <div>
      <h2>App组件:{this.state.counter}</h2>
      <button onClick={this.addNum}>加1</button>
      <hr/>
       {this.state.flag && <Childtest/>}
    </div>
    )
  }
  addNum(){
    this.setState({
      counter:this.state.counter+1,
      flag:!this.state.flag
    })
  }
  componentDidMount() {
    console.log("执行了componentDidMount");
  }
  componentDidUpdate(prevProps, prevState) {
    console.log("执行了componentDidUpdate");
  }
}
class Childtest extends Component {
  render() {
    return (
      <div>
        <h2>我是子组件</h2>
      </div>
    )
  }
  componentWillUnmount() {
    console.log("子组件执行了componentWillUnmount");
  }
}

组件通信:

我们知道组件之间是可以相互嵌套的,那么他们之间如何通信?
父子组件:

  • 父传子(类组件)通信
  • 父传子(函数组件)通信


    父传子
//app.js
import React, { Component } from "react";
export default class App extends Component {
  constructor() {
    super();
    this.state = {};
  }
  render() {
    return (
      <div>
        <h2>App组件</h2>
        <hr />
        <Childtest name="张三" age="18" heigt={1.88} />
        <Childtest name="李四" age="19" heigt={1.89} />
        <hr />
        <Childtest2 name="王五" age="20" heigt={1.79} />
      </div>
    );
  }
}
class Childtest extends Component {
  //1、所有的属性都在props中,这是最完整的写法
  // constructor(props){
  //   super();
  //   this.props=props;
  // }

  //2、实际上是父类保存了props(Component源码有写),子类继承直接使用,不是通过super.props,依然还是用this.props使用
  // constructor(props){
  //   super(props);
  // }

  //3、子类默认的构造方法就是上面那样实现的,所有可以直接省略
  render() {
    const { name, age, heigt } = this.props;
    return (
      <div>
        <h2>我是类子组件:</h2>
        <h3>
          {name}---{age}--{heigt}
        </h3>
      </div>
    );
  }
}

function Childtest2(props) {
  const { name, age, heigt } = props;
  return (
    <div>
      <h2>我是函数子组件:</h2>
      <h3>
        {name}---{age}--{heigt}
      </h3>
    </div>
  );
}

传值参数propTypes验证:

  • 引入prop-types库
  • 函数组件与类组件可添加propTypes设置验证规则,不通过规则则会控制台报警告
  • 没有传值时,可设置默认值
  • 类组件还可以通过static关键字来单独设置propTypes


    验证不通过报错示意图
import React, { Component } from "react";
import PropTypes from 'prop-types';
export default class App extends Component {
  constructor() {
    super();
    this.state = {};
  }
  render() {
    return (
      <div>
        <h2>App组件</h2>
        <hr />
        <Childtest name="张三" age={18} heigt={1.88} />
        <Childtest name="李四" age="19" heigt={1.89} />
        <Childtest/>
        <hr />
        <Childtest2 name="王五" age="20" heigt={1.79} />
        <Childtest2 name="王五2" age={21} heigt={1.79} />
      </div>
    );
  }
}
class Childtest extends Component {
  render() {
    const { name, age, heigt } = this.props;
    return (
      <div>
        <h2>我是类子组件:</h2>
        <h3>
          {name}---{age}--{heigt}
        </h3>
      </div>
    );
  }
 //es6中class fields写法
  static propTypes={
    age:PropTypes.number
  }
 // 注释掉下面的就会报错,可以看到props的验证效果
 static defaultProps={
        age:66
    }
}
// 非static用法
Childtest.propTypes={
  name:PropTypes.string.isRequired,
}
Childtest.defaultProps={
  name:'默认小张',
  age:25,
  heigt:2.0
}

function Childtest2(props) {
  const { name, age, heigt } = props;
  return (
    <div>
      <h2>我是函数子组件:</h2>
      <h3>
        {name}---{age}--{heigt}
      </h3>
    </div>
  );
}
Childtest2.propTypes={
  name:PropTypes.string.isRequired,
  age:PropTypes.number,
  heigt:PropTypes.number
}

相关文章

  • react_06组件化开发(一)

    组件化: 用分而治之的思想去处理应用或页面,一个页面分成多组件,每个组件实现功能块,可以重复利用,便于维护,模块化...

  • Android组件化和插件化开发

    Android组件化和插件化开发 什么是组件化和插件化? 组件化开发 就是将一个app分成多个模块,每个模块都是一...

  • Android 组件化开发实践

    Android组件化开发实践(一):为什么要进行组件化开发?Android组件化开发实践(二):组件化架构设计An...

  • Android组件化和插件化开发

    Android组件化和插件化开发 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个...

  • Vue组件化开发

    ✍目录总览:(组件化概念、组件注册、数据存放、组件数据共享、组件插槽、使用步骤) 一、组件化概念 1. 组件化开发...

  • Android组件化开发实践笔记

    一、什么是组件化和插件化?   组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Module),开发...

  • 滚动栏的开发

    滚动栏的开发 1.组件化在开发之前2.组件化在开发之后 组件库开发流程将控件封装成pod库1.pod lib cr...

  • WebComponent介绍与简单使用

    WebComponent能够提供开发者组件化开发的能力什么是组件化组件化没有一个明确的定义,但是一般形容就是:“高...

  • 插件化介绍和原理解析

    什么是插件化 首先我们区分一下组件化和插件化的概念 组件化组件化开发就是将一个app分成多个模块,组件化强调功能拆...

  • Android插件化(一)

    插件化(一) 组件化和插件化的区别: 组件化是将一个app分成多个模块,每个模块都是一个组件(module),开发...

网友评论

      本文标题:react_06组件化开发(一)

      本文链接:https://www.haomeiwen.com/subject/ymkbpltx.html