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>
    );
}
相关推荐
JAVA学习通2 小时前
北京明光云振铎数据科技Java面经
java·开发语言·科技
tedcloud1235 小时前
UI-TARS-desktop部署教程:构建AI桌面自动化系统
服务器·前端·人工智能·ui·自动化·github
jerryinwuhan8 小时前
基于各城市站点流量的复合功能比较
开发语言·php
UXbot8 小时前
AI原型设计工具如何支持团队协作与快速迭代
前端·交互·个人开发·ai编程·原型模式
迈巴赫车主9 小时前
Java基础:list、set、map一遍过
java·开发语言
ZC跨境爬虫9 小时前
跟着MDN学HTML_day_48:(Node接口)
前端·javascript·ui·html·音视频
南 阳10 小时前
Python从入门到精通day66
开发语言·python
红尘散仙11 小时前
一套 Rust 核心,跑通 Tauri + React Native
react native·react.js·rust
PieroPc11 小时前
CAMWATCH — 局域网摄像头监控系统 Fastapi + html
前端·python·html·fastapi·监控
十八旬11 小时前
快速安装ClaudeCode完整指南
开发语言·windows·python·claude