React函数与类组件

news/2024/7/15 17:26:59 标签: react.js, 前端, 前端框架

目录

函数组件

React.FC组件函数化(传参)

类组件

const function = ()=>{}和function(){}

函数组件

函数式组件是一个只接收props并返回JSX元素render 函数。这意味着他们没有任何状态,这也就意味着他刷新一次里面的数据就没了,概念类似于一帧一帧,并且只负责渲染  传递给它们的数据

  • 代码简洁,易于阅读
  • 没有状态,避免了许多生命周期方法的使用
  • 更容易编写和测试
  • 可以轻松转换为 React Hooks

适合展示静态页面,或者数据从父组件传到子组件进行展示的话

例如所有的图表都由无状态组件写(函数组件、Hooks),因为它们只负责拿到数据并渲染。并无自己维护的状态。

在已经熟悉 React Hooks 并希望从旧项目升级到新的 API 时,函数式组件也很有用。

React.FC组件函数化(传参)

const GridItem: React.FC<{
    index: number,//必须提供number值
    defaultOptions?: number,//不必提供值,若提供必为number
    onGridBlur: () => any
//为GridItem组件传入参数
}> = ({ index,defaultOptions,onGridBlur }) => {
    const [status, setStatus] = useState(false)

    let size = options.length;
    const getIcon = () => {
        return <MinusCircleOutlined style={{ color: "red" }} />;
    }

    return (
//字符串模板字面量:字符串拼接变量'str${}'
        <div key={`gridItem${Math.random()}`}>
            <div key={`div${Math.random()}`}>
                <Select
                    key={`sel${Math.random()}`}
                    defaultValue={defaultOptions}
                    onChange={(value, item: any) => {
                        onChange(item, index);
                    }}
                    onBlur={() => {
                        onGridBlur();
                    }}
                />
        </div >
    );
}

export default GridItem;

类组件

  • 可以使用状态和生命周期函数
  • 适用于组件有复杂的业务逻辑,或涉及 I/O 操作,例如调用 API
  • 不同组件之间共享数据
  • 更复杂的状态管理和生命周期方法调用

import React, { PureComponent, RefObject } from "react";
import { Layout, Menu, Tabs, Button, Form, Select, DatePicker} from 'antd';
import { FormInstance } from "antd";
import { JSX } from "react/jsx-runtime";

import "./App.css";

import { judgeSuccess, getDate,DATA_APIS, PARAMS_API, TABS, RANGE_PRESETS,LAST_WEEK} from "./utils/AppUtil";

import ListChart from "./components/ListChart";

const { Header } = Layout;
const { Option } = Select;
const { RangePicker } = DatePicker;

export default class App extends PureComponent<any, any, any>  {
  eChartsRef: RefObject<HTMLDivElement>;
  formRef:RefObject<FormInstance>;
  jsonUrl: string[];
  jsonMsgs: Map<string, any>;
  fromValues: any;
  isError:boolean;

  constructor(props: any) {
    super(props);
    this.eChartsRef = React.createRef();
    this.formRef=React.createRef()
    this.jsonUrl = [];// CPU_BPU,FPS_Delay_Mem,DSP
    this.jsonMsgs = new Map();
    this.fromValues={
      proj:'',
      comp:'',
      mode:'',
      dates:null,
    }
    this.isError=false;
    this.state = {
      formItemDoms: [],
      pref_items: [
        {
        },
      ],//TabsProps['items'];
    }
  };

  requestParams = () => {
    fetch(PARAMS_API, { method: 'GET' })
      .then(function (response) {
        return response.json();
      })
      .then((data) => {
        if (judgeSuccess(data) && data.data.proj?.proj_list) {
          this.initialFormItems(data.data)     
        }
      }).catch(error => {
        console.error('Error:', error);
        if(!this.isError){
          this.isError=true;
          alert(`发生错误:${error},请在控制台查看详情原因`);
        }
      });
  }

  getOption = (list: string[]) => {
    let doms: JSX.Element[] = [];
    list.forEach((val: string) => {
      doms.push(<Option value={val} key={`${val}`} >{val}</Option >);
    });
    return doms;
  }


  requestData = async (values: any) => {
    Promise.all(
      this.jsonUrl.map(url => fetch(url, { method: 'GET' }))
    )
      .then(async ([res1, res2, res3]) => {
        return [await res1.json(), await res2.json(), await res3.json()];
      }).then((datas) => {
        datas.forEach((data) => {
          this.jsonMsgs.set(data.data.data_type, data);
          if (this.jsonMsgs.size === 3) {
            this.setData();
          }
        })
      }).catch(errors => {
          console.error('Error:', errors);
          alert(`请求失败,发生错误:${errors},请在控制台查看详情原因`);
      });
  }

  render(): React.ReactNode {
    return (
      <>
          {this.state.formItemDoms}

      </>
    );
  }

  componentDidMount() {
    this.requestParams();
  }
  componentDidUpdate(prevProps: Readonly<any>, prevState: Readonly<any>, snapshot?: any): void {
    this.isError=false;
  }
};

类组件在未来事件切片与并发模式中,由于生命周期带来的复杂度,并不易于优化。

函数组件本身轻量简单,且在 Hooks 的基础上提供了比原先更细粒度的逻辑组织与复用,更能使用 React 的未来发展。

随着 React 的发展,许多具有状态的传统 class 组件已被弃用,render props 和高阶组件模式被 hooks 所取代。

但建议平时两类组件都用,以根据需求会向下兼容。

const function = ()=>{}和function(){}

使用箭头函数定义的函数被强制使用父级函数的作用域,与闭包有关

function(){}适合export 工具函数Util

const fun 适合组件内部的函数

class MyComponent extends React.Component {
  handleClick = () => {
    console.log(this); // this指向MyComponent组件本身
  }

  render() {
    return (
      <button onClick={this.handleClick}>按钮</button>
    );
  }
}

class MyComponent extends React.Component {
  handleClick() {
    console.log(this); // this指向window对象或undefined(视情况而定)
  }

  render() {
    return (
      <button onClick={() => this.handleClick()}>按钮</button>
    );
  }
}


http://www.niftyadmin.cn/n/446420.html

相关文章

使用 Sa-Token 实现 [记住我] 模式登录、七天免登录

一、需求分析 如图所示&#xff0c;一般网站的登录界面都会有一个 [记住我] 按钮&#xff0c;当你勾选它登录后&#xff0c;即使你关闭浏览器再次打开网站&#xff0c;也依然会处于登录状态&#xff0c;无须重复验证密码&#xff1a; 本文将详细介绍在 Sa-Token中&#xff0c;…

【设计模式与范式:行为型】69 | 访问者模式(下):为什么支持双分派的语言不需要访问者模式?

上一节课中&#xff0c;我们学习了访问者模式的原理和实现&#xff0c;并且还原了访问者模式诞生的思维过程。总体上来讲&#xff0c;这个模式的代码实现比较难&#xff0c;所以应用场景并不多。从应用开发的角度来说&#xff0c;它的确不是我们学习的重点。 不过&#xff0c;…

Android 逆向之脱壳实战篇

作者&#xff1a;37手游安卓团队 前言 这篇文章比较干&#xff0c;比较偏实战&#xff0c;看之前建议先喝足水&#xff0c;慎入。 在学脱壳之前&#xff0c;我们先来复习一下&#xff0c;什么时候是加固&#xff1f; 加固本质上就是对 dex 文件进行加壳处理&#xff0c;让一些…

蔚来测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

某农业大学c/c++第二次实验

1.完数&#xff08;循环&#xff09; 【问题描述】一个数如果恰好等于它的因子之和&#xff0c;这个数就成为“完数”。例如&#xff0c;6的因子为1、2、3&#xff0c;而6&#xff1d;1&#xff0b;2&#xff0b;3&#xff0c;因此6是“完数”。编程序打印出1000之内&#xff…

k8s搭建-centos7.2

这里写自定义目录标题 环境说明遇到的坑 搭建上网代理安装nginx反向代理正向代理 安装k8s安装docker安装k8s准备环境执行安装配置集群主节点操作从节点操作 安装网络插件flannel主节点操作解决办法 环境说明 操作系统内核centos 7.23.10.0.327 当做主节点的服务器要能免密访问…

0002-TIPS-2020-hxp-kernel-rop : bypass-smep-with-rop

使用的开始上一节中的pwn题 SMEP (Supervisor Mode Execution Prevention) SMEP安全机制&#xff1a;禁止在执行内核空间代码时突然执行用户空间代码。类似 NX。 在没有开启SMEP的情况下&#xff0c;攻击者将rip或者函数指针指向了用户空间&#xff0c;可在用户空间布局shell…

go 调试利器之pprof指标分析

文章目录 概要一、指标类型1.1、堆栈指标1.2、CPU指标分析1.3、http-pprof 二、go tool pprof2.1、可视化2.2、CPU火焰图 概要 Go语言原生支持对于程序运行时重要指标或特征进行分析。pprof是其中一种重要的工具&#xff0c;其不仅可以分析程序运行时的错误&#xff08;内存泄…