React 类组件 与 函数式组件 + Hooks

news/2024/7/15 17:37:42 标签: react.js, hooks, typescript

React 类组件

类组件式我们经常用到的组件形式,也是React最基础的组件形式。类组件拥有自己的状态state(存储数据的仓库)状态改变函数setState(在仓库中操作数据的管理人员),能够很方便地对页面上的数据进行各种操作。

函数式组件 + Hooks

函数式组件相对于类组件比较轻量写起来也更加方便,在平常开发中更多的用在一些小的数据展示组件上面。但是,函数式组件它没有和类组件一样的state,setState不能维持所谓的状态state。因此,在函数式组件中的数据操作显得比较复杂,一般需要调用父组件中的数据和数据操作函数。直到Hooks的出现,让函数式组件也可以像类组件一样拥有并维持自己的状态state以及改变自己的状态

使用方法

函数式租价的基本结构就是一个方法(或者说是一个函数),这个函数相当于类组件中的render函数(渲染函数),因此函数式组件最关键的就是一定要有return值

函数式组件格式1(基于TS)

typescript">import React from 'react'
// const 就是申明一个函数,然后再export暴露出去可以作为组件使用
// React.FC 的意思就是Function Components,也就是函数式组件,即指定了Count这个函数的类型
export const Count: React.FC = () => {
  return (
    <div>
		hello world
	<div>
  )
}

函数式组件格式2(基于TS)

typescript">import React from 'react'
// const 就是申明一个函数,然后再export暴露出去可以作为组件使用
export function Count(){
  return (
    <div>
		hello world
	<div>
  )
}

useState

用函数式组件和Hooks完成的计数器:

typescript">import React, { useState } from 'react'
import { Button } from 'antd';

export const Count: React.FC = () => {
  // useState<number>(0) 中 <number>指定了数据类型,括号中的0就是计数器的初始值count
  // [count, setCount] 是解构赋值,一个是申明变量count,另一个是申明修改变量的方法
  // 其实就相当于类组件中的 state 和 setState
  const [count, setCount] = useState<number>(0)

  const increase = () => {
  	// setCount 括号中的值就是更新后的值,直接填入即可
    setCount(count + 1)
  }

  const decrease = () => {
    setCount(count - 1)
  }

  const reset = () => {
    setCount(0)
  }

  return (
    <>
        <div>计数:{count}</div>
        <div>
          <Button type="primary" onClick={increase}>增加</Button>
          <Button type="primary" onClick={decrease}>减少</Button>
          <Button type="primary" onClick={reset}>重置</Button>
        </div>
     </>
  )
}

这里还有一个改写方法,就是将关于数据count和数据操作封装到另一个方法中去。不过好像没啥必要。再加上一层封装对安全性比较好,在实际中不需要这样。代码如下:

typescript">import React, { useState } from 'react'
import { Button } from 'antd';

export const Count: React.FC = () => {
  const { count, increase, decrease, reset } = useCount();
  return (
    <>
        <div>计数:{count}</div>
        <div>
          <Button type="primary" onClick={increase}>增加</Button>
          <Button type="primary" onClick={decrease}>减少</Button>
          <Button type="primary" onClick={reset}>重置</Button>
        </div>
     </>
  )
}

function useCount() {
  // useState<number>(0) 中 <number>指定了数据类型,括号中的0就是计数器的初始值count
  // [count, setCount] 是解构赋值,一个是申明变量count,另一个是申明修改变量的方法
  // 其实就相当于类组件中的 state 和 setState
  const [count, setCount] = useState<number>(0)
 
  const increase = () => {
  	// setCount 括号中的值就是更新后的值,直接填入即可
    setCount(count + 1)
  }

  const decrease = () => {
    setCount(count - 1)
  }

  const reset = () => {
    setCount(0)
  }
  // 这里没有把setCount直接暴露出去,这样调用的时候只能进行+1,-1,归零这三种操作了。
  return { count, increase, decrease, reset } 
}

useEffect

类组件中,存在render()渲染函数,构造器函数还有一些生命周期函数等等…,但是在函数式组件中没有生命周期,就需要使用useEffect来实现生命周期的功能。useEffect可以看成是componentDidMountcomponentDidUpdatecomponentWillUnmount这三个函数的组合。默认情况下,它在第一次渲染以及每次更新的时候都会执行。

你可以通知 React 跳过对 effect 的调用,只要传递数组作为 useEffect 的第二个可选参数即可,如果想执行只运行一次的 effect(仅在组件挂载和卸载时执行),可以传递一个空数组[])作为第二个参数。这就告诉 React 你的 effect 不依赖于 props 或 state 中的任何值,所以它永远都不需要重复执行。

代码示例:

typescript">export function Count3({ fatherCount,aa } : CountProps) {
  const [count, setCount] = useState<number>(0)
  // 在下面的useEffect中,设置只监听来自父组件的fatherCount发生变化时才会执行
  useEffect(() => {
    console.log(`父组件中的值发生了变化,新的值为${fatherCount}`)
  },[fatherCount]);

  const increase = () => {
    setCount(count + 1)
  }

  const decrease = () => {
    setCount(count - 1)
  }

  const reset = () => {
    setCount(0)
  }

  return (
    <>
        <div>father:{fatherCount}</div>
        <div>aa{aa}</div>
        <div>计数:{count}</div>
        <div>
          <Button type="primary" onClick={increase}>增加</Button>
          <Button type="primary" onClick={decrease}>减少</Button>
          <Button type="primary" onClick={reset}>重置</Button>
        </div>
      </>
  )
}

如果想要useEffect仅执行一次,那么就把useEffect的第二个参数设置为空数组([]),如果想在渲染或父组件中的值发生变化(执行多次)就执行,那么就去掉第二个参数


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

相关文章

Email-Ext Plugin install ------ Jenkins Plugins

一、基本信息 1. Email-Ext Plugin功能简介 支持Jenkins邮件发送时&#xff0c;自定义邮件内容功能。详情可以查看jenkins的wiki : https://wiki.jenkins-ci.org/display/JENKINS/Email-extplugin 2. 运行环境 系统环境: OS X 10.10.5 Jenkins版本: 1.532.2 二、安装 1. 分析 通…

十六进制下的(6+2) 8位数颜色代码

十六进制下的(62) 8位数颜色代码 8位数十六进制颜色代码 平常我们在写代码用到颜色的时候&#xff0c;经常写的是&#xff0c;六位十六进制代码 例如&#xff1a; 白色&#xff1a;#FFFFFF 黑色&#xff1a;#000000 网易云红色&#xff1a;#E20000 如果要加上颜色透明度&…

基础排序算法:选择排序

一、原理&#xff1a; 1、遍历整个数组找到最小的那个元素。 2、将他和数组的第一个元素交换位置&#xff08;如果第一个元素是最小元素&#xff0c;则和自己交换&#xff09;。 3、在剩下的元素中找到最小的元素&#xff0c;将他和数组的第二个元素交换位置。 4、如此往复&…

React ref用法

React ref 官方文档 1.介绍 Refs 提供了一种方式&#xff0c;允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。 DOM 节点&#xff1a;就是平常所说的能在页面中直接获取到的原生DOM节点。在 render 方法中创建的 React 元素&#xff1a;通过React中的render()方…

分享九:php易混淆的语法

一&#xff1a;php后期静态绑定 从php5.3开始&#xff0c;php增加了一个叫后期绑定的功能&#xff0c;用于在继承范围内引用静态调用的类 该功能从语言内部角度考虑北命名为“后期静态绑定”&#xff1b;“后期绑定”意思说&#xff1a;static&#xff1a;&#xff1a;不再被解…

天地图引擎加载自定义WMTS图层

天地图引擎加载自定义WMTS图层 问题描述 最近在开发过程中碰到在天地图引擎中叠加自定义的WMTS图层&#xff0c;天地图官网API&#xff1a;天地图JavaScript API 4.0 在代码示例中添加自定义图层只有一行代码&#xff1a; var imageURL "http://t0.tianditu.gov.cn/im…

phplib系统开发经验总结

数据库设计&#xff1a; 数据库的设计一定要在了解整个系统需求的情况下&#xff0c;把数据库设计&#xff0c;及ER图画出来&#xff0c;数据库字典也要及时把握&#xff0c;只有掌握了这些才能下手开始设计界面&#xff0c;后期如果有需要&#xff0c;可以在数据库中添加数据&…

axios token权限认证请求机制,前端实现无感刷新

axios token权限认证请求机制 参数属性详解 access_token&#xff1a;axios请求时需要携带的请求头的值 refresh_token&#xff1a;刷新token时需要传的参数 expires_in&#xff1a;token的有效时间&#xff0c;例如66666秒 expires&#xff1a;这个是前端处理expires_in过后…