React组件

67 阅读1分钟

傻瓜组件(展示组件)

负责根据props显示页面信息

聪明组件(容器组件)

负责数据的获取,处理

函数式组件

import React from 'react';

export default function xxx() {
  return (<div>函数式组件</div>);
}

class组件

// es6的形式:React.Component
import React, { Component } from 'react';

export default class xxx extends Component {
  render() {
    return (
      <div>class组件</div>
    );
  }
}

组件化和ui库引入使用

ant-design

  • 安装
    npm install antd --save
    
  • 例:
import React, { Component } from 'react';
import { Button } from 'antd'
import "antd/dist/antd.css"

export default class AntdDemo extends Component {
  render() {
    return (
      <div>
        <Button type='primary'>点我</Button>
      </div>
    );
  }
}

性能优化之PureComponent

  • PureComponent是内部定制了shouldComponentUpdate⽣命周期,重写了⼀个⽅法来替换shouldComponentUpdate⽣命周期⽅法
  • 平常开发尽量使⽤PureComponent设计组件
  • 小个人原则
    • 确保数据类型是值类型
    • 如果是引⽤类型,确保地址不变,同时不应当有深层次数据变化
  • 使⽤PureComponent可以省去shouldComponentUpdate的代码,会简单很多
  • 例:
    class Title extends PureComponent {
      //   shouldComponentUpdate(nextProps) {
      //     return nextProps.title !== this.props.title;
      //   }
      render() {
        return <h1>{this.props.title}</h1>;
      }
    }
    

性能优化之React.memo

  • 是⼀个⾼阶组件的写法
  • 让函数组件也拥有了PureComponent的功能
  • 例:
    const MemoComponent = React.memo((props) => {
      return <h1>{props.title}</h1>;
    });
    

高级使用之组件复合写法

类似vue的组件插槽

import React from 'react';

function Dialog(props) {
  return (
    <div style={{ border: `1px solid ${props.borderColor || '#f00'}` }}>
      {/* 等同于vue中匿名插槽 */}
      {props.children}
      {/* 等同于vue中具名插槽 */}
      {props.footer}
    </div>
  );
}

export default function Composition() {
  const confirmBtn = <button onClick={() => alert('成功')}>确定</button>;

  return (
    <div>
      <Dialog borderColor='#0f0' footer={confirmBtn}>
        <h1>提示</h1>
        <p>确定***吗?</p>
      </Dialog>
    </div>
  );
}