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

React 类组件

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

函数式组件 + Hooks

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

使用方法

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

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

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

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

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

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

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和数据操作封装到另一个方法中去。不过好像没啥必要。再加上一层封装对安全性比较好,在实际中不需要这样。代码如下:

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 中的任何值,所以它永远都不需要重复执行。

代码示例:

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的第二个参数设置为空数组([]),如果想在渲染或父组件中的值发生变化(执行多次)就执行,那么就去掉第二个参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶尔躲躲乌云_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值