当前位置: 首页 > news >正文

hook函数之useEffect的使用——自定义hook函数网络请求——

hook函数之useEffect的使用


此hook可以模拟函数组件的生命周期,函数组件对于在一些生命周期中操作还是无能为力,所以 React提供了 useEffect 来帮助开发者处理函数组件,来帮助模拟完成一部份的开发中非常常用的生命周期方法。常被别的称为:副作用处理函数。此函数的操作是异步的。

  • 注:useEffect中不能有返回值,React它要自动回收

模拟的生命周期就有三个:

useEffect副作用函数  它可以让函数组件中模拟生命周期
生命周期 componentDidMount componentDidUpdate componentWillUnmout

原理:

[]记录下来
[] => []  所有值比对,如果值没有变化则不执行,有变化执行
arguments.length
deparr undefined 没有第2

模拟 componentDidMount , componentWillUnmout

useEffect(()=>{
    console.log("App");
})

模拟挂载 componentDidMount

参数2:依赖项,如果为空数组,则只执行1次
一般在这样的写法中,完成网络请求

useEffect(()=>{
    console.log("App");
},[])

模拟更新 componentDidUpdate

只针对某个数据count的值来做更新周期的检测
useEffect(()=>{
    console.log("App");
},[count])

模拟卸载 componentWillUnmout

有依赖项,数据更新就卸载原来的,重新渲染页面

useEffect(()=>{
    console.log("App");
},[count])
const Child = () => {
    useEffect(() => {
        return () => {
            console.log("child_____componentWillUnmout");
        }
    }, [])
    return (
        <div>
            <h2>Child</h2>
        </div>
    )

useEffect 网络请求

  • 在之前的版本:第1个参数要求只能是一个普通的函数,没有返回对象,可以返回回调函数,回调函数它模拟生命周期componentWillUnmout
  • 在代码中,我们使用async / await从第三方API获取数据。如果你对async/await熟悉的话,你会知道,每个async函数都会默认返回一个隐式的promise。但是,useEffect不应该返回任何内容。这就是为什么会在控制台日志中看到以下警告:
  • Warning: useEffect function must return a cleanup function or nothing. Promises and useEffect(async () => …) are not supported, but you can call an async function inside an effect

最新的写法

useEffect(async () => {
   let ret = await get('/api/swiper')
   setFilms(ret.data)
 }, [])

版本普世的写法,利用一个自执行的函数;
如果useEffect顶层不支持 async/await可以使用如下的解决方案

    useEffect(()=>{
        (async function(){
            let ret = await get("/api/swiper");
            setFime(ret.data)
            console.log(ret.data);
        })()
    },[])

自定义hook函数网络请求

import { get } from '@/utils/http';
import { useState, useEffect } from 'react';

const useSwiper = (initState = [])=>{
    let [fime,setFime] = useState(initState);

    useEffect(()=>{
        (async function(){
            let ret = await get("/api/swiper");
            setFime(ret.data)
        })()
    },[])

    return fime
}

export default useSwiper;

把函数也传出去,完成对useEffect的操作

使用闭包的原理,操作了原来函数中的数据

import { get } from '@/utils/http';
import { useState, useEffect } from 'react';

const useGoodFood = (initState = [])=>{
    let [data,setData] = useState(initState);
    let [page,setPage] = useState(1);

    const loadData = async ()=>{
        let ret =await get("/api/goodfood?page="+page);
        if(ret.data.length>0){
            // setData(ret.data)
            setData(v=>[...v,...ret.data])
            setPage(v=>v+1)
        }
    }
    useEffect(()=>{
        loadData()
    },[])

    return [data,loadData]
}

export default useGoodFood;
import useForm from "@/hook/useGoodFood.js"
const App = () => {
    let [fime,loadData] = useForm()
    console.log(fime);
    return (
        <div>
            <ul>
                {fime.map(({name,id})=><li key={id}>{name}</li>)}
            </ul>
            <button onClick={()=>loadData(2)}>下一页</button>
        </div>
    );
}

相关文章:

  • Windows 窗体显示的“模式方式”与“非模式方式”
  • JDBC详讲Connection与 jdbc-Statement
  • 外部 SRAM 实验
  • Redis从入门到精通(二)
  • 2021.09青少年软件编程(Python)等级考试试卷(四级)
  • JAVA计算机毕业设计毕业论文管理系统Mybatis+系统+数据库+调试部署
  • Redis实战 - 01 Redis 和 SpringSecurity Oauth2 实现认证授权中心
  • 数据结构:堆
  • 基于机器学习的搜索推荐系统
  • MATLAB | 分段赋色折线图及其图例绘制
  • C#面向对象程序设计课程实验三:实验名称:C#数组和集合
  • 数据结构--(栈、队列实现及3个OJ题)
  • 实时数据同步工具<Maxwell 操作案例>
  • 【设计模式】-创建型模式-第2章第3讲-【建造者模式】
  • CS231n Module2: CNN part1:Architecture
  • “大数据应用场景”之隔壁老王(连载四)
  • Android 控件背景颜色处理
  • Android开源项目规范总结
  • canvas 五子棋游戏
  •  D - 粉碎叛乱F - 其他起义
  • ECS应用管理最佳实践
  • HTML中设置input等文本框为不可操作
  • iOS 系统授权开发
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • MaxCompute访问TableStore(OTS) 数据
  • MobX
  • ng6--错误信息小结(持续更新)
  • php面试题 汇集2
  • python3 使用 asyncio 代替线程
  • 从零开始的无人驾驶 1
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 记一次和乔布斯合作最难忘的经历
  • 如何设计一个比特币钱包服务
  • 微服务框架lagom
  • 与 ConTeXt MkIV 官方文档的接驳
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #《AI中文版》V3 第 1 章 概述
  • (1)Nginx简介和安装教程
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十)c52学习之旅-定时器实验
  • (四)Linux Shell编程——输入输出重定向
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)