React - useEffect、useRef、Fragment

一、useEffect

1、基本介绍
  • useEffect 用于在函数式组件中执行副作用操作,用于替代类组件中的生命周期钩子
jsx 复制代码
useEffect(() => {
    // 副作用操作
    return () => {
        // 清理函数(可选)
    };
}, [依赖项数组]);
  1. 副作用操作:发送请求数据获取、启动定时器、手动更改真实 DOM 等

  2. 清理函数:返回的函数会在组件卸载或下次执行前调用

  3. 依赖项数组:指定依赖项数组后,只有依赖项数组中的值发生变化时,才会执行副作用操作

    1. 不传依赖项:每次渲染后执行

    2. 空依赖项数组:首次渲染后执行一次

    3. 传依赖项:首次渲染后 + 依赖项变化时执行

  • 可以把 useEffect 看做这三个函数的组合:componentDidMount、componentDidUpdate、componentWillUnmount
2、基本使用
  1. 类式组件
jsx 复制代码
import { Component } from "react";
import ReactDOM from "react-dom";

export default class App extends Component {
    state = { count: 0 };

    unmount = () => {
        ReactDOM.unmountComponentAtNode(document.getElementById("root"));
    };

    componentDidMount() {
        this.timer = setInterval(() => {
            this.setState((state) => ({ count: state.count + 1 }));
        }, 1000);
    }

    componentWillUnmount() {
        clearInterval(this.timer);
    }

    render() {
        return (
            <div>
                <h2>当前求和为:{this.state.count}</h2>
                <button onClick={this.unmount}>卸载组件</button>
            </div>
        );
    }
}
  1. 函数式组件
jsx 复制代码
import { useState, useEffect } from "react";
import ReactDOM from "react-dom";

export default function Demo() {
    const [count, setCount] = useState(0);

    function unmount() {
        ReactDOM.unmountComponentAtNode(document.getElementById("root"));
    }

    useEffect(() => {
        const timer = setInterval(() => {
            setCount((count) => count + 1);
        }, 1000);
        return () => {
            clearInterval(timer);
        };
    }, []);

    return (
        <div>
            <h2>当前求和为:{count}</h2>
            <button onClick={unmount}>卸载组件</button>
        </div>
    );
}

二、useRef

1、基本介绍
  • useRef 可以在函数组件中存储 / 查找组件内的标签或任意其它数据,用于保存标签对象,功能与 React.createRef() 一样
js 复制代码
const refContainer = useRef()
2、基本使用
  1. 类式组件
jsx 复制代码
import { Component, createRef } from "react";

export default class App extends Component {
    myRef = createRef();

    show = () => {
        alert(this.myRef.current.value);
    };

    render() {
        return (
            <div>
                <input type="text" ref={this.myRef} />
                <button onClick={this.show}>点我提示数据</button>
            </div>
        );
    }
}
  1. 函数式组件
jsx 复制代码
import { useRef } from "react";

export default function Demo() {
    const myRef = useRef();

    const show = () => {
        alert(myRef.current.value);
    };

    return (
        <div>
            <input type="text" ref={myRef} />
            <button onClick={show}>点我提示数据</button>
        </div>
    );
}

三、Fragment

1、基本介绍
  1. 在 React 中,组件只能返回一个根元素,如果需要返回多个并列的元素,传统做法是用一个 <div> 包裹它们

  2. Fragment 是一个让开发者能够在不添加额外 DOM 节点的情况下,将一组子元素组合起来的组件

2、基本使用
  1. 完整写法,需要引入 Fragment 组件
jsx 复制代码
import { Component, Fragment } from "react";

export default class Demo extends Component {
    render() {
        return (
            <Fragment>
                <input type="text" />
                <input type="text" />
            </Fragment>
        );
    }
}
  1. 简写,不需要引入 Fragment 组件
jsx 复制代码
import { Component } from "react";

export default class Demo extends Component {
    render() {
        return (
            <>
                <input type="text" />
                <input type="text" />
            </>
        );
    }
}
3、带 key 的 Fragment
  • 当在循环中渲染列表时,如果需要为 Fragment 添加 key 属性,必须使用完整语法
jsx 复制代码
import { useState, Fragment } from "react";

export default function App() {
    const [items] = useState([
        { id: 1, term: "React", description: "A JavaScript library for building user interfaces." },
        { id: 2, term: "React Native", description: "A framework for building native mobile apps using React." },
    ]);

    return (
        <dl>
            {items.map((item) => (
                <Fragment key={item.id}>
                    <dt>{item.term}</dt>
                    <dd>{item.description}</dd>
                </Fragment>
            ))}
        </dl>
    );
}
相关推荐
小糖学代码12 小时前
LLM系列:1.python入门:15.JSON 数据处理与操作
开发语言·python·json·aigc
空中海12 小时前
第七章:vue工程化与构建工具
前端·javascript·vue.js
handler0112 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
zhensherlock12 小时前
Protocol Launcher 系列:Trello 看板管理的协议自动化
前端·javascript·typescript·node.js·自动化·github·js
zhuà!12 小时前
element的el-form提交校验没反应问题
前端·elementui
小白学大数据12 小时前
现代Python爬虫开发范式:基于Asyncio的高可用架构实战
开发语言·爬虫·python·架构
龙猫里的小梅啊12 小时前
CSS(一)CSS基础语法与样式引入
前端·css
小码哥_常12 小时前
从0到1,开启Android音视频开发之旅
前端
渔舟小调12 小时前
P19 | 前端加密通信层 pikachuNetwork.js 完整实现
开发语言·前端·javascript
不爱吃炸鸡柳12 小时前
数据结构精讲:树 → 二叉树 → 堆 从入门到实战
开发语言·数据结构