博客
关于我
useEffect补充与自定义hooks
阅读量:527 次
发布时间:2019-03-08

本文共 2559 字,大约阅读时间需要 8 分钟。

React Hook useEffect 实用指南

在 React 开发过程中,useEffect 是一个强大的工具,用于在组件树中执行副作用操作。它可以嵌入到组件的任何位置,并且能够感知组件的变更状态。在以下内容中,我们将详细探讨 useEffect 的使用场景以及如何手动绑定变量值以获取旧值与新值。

1. 准备一组可以被监听的变量值

为了利用 useEffect 的能力,我们需要准备一组可以被监听到的变量值。这些变量值可以是 React 组件中的任何状态值、属性值,或者是其他可以被跟踪的数据。例如:

function Child(props) {  const [txt, setTxt] = useState("1");  return  setTxt(e.target.value)} />;}

上述代码展示了一个简单的输入组件,状态值 txt 会随着用户输入而改变。接下来,我们需要以绑定的方式实现旧值与新值的获取和存储。

2. 通过 useRef 实现绑定

为了实现变量值的绑定,我们可以结合 useRef hook 和 useEffect 进行操作。useRef hook 可以帮助我们持有变量值在每次重新渲染时的最新值。

import React, { useState, useRef } from 'react';function Child(props) {  const [txt, setTxt] = useState("1");  const txtRef = useRef(txt);    useEffect(() => {    console.log('旧值:', txtRef.current, '新值:', txt);    txtRef.current = txt; // 将新值赋值给当前引用,以便下一次获取  }, [txt]);  return (     setTxt(e.target.value)}    />  );}

浏览器反馈

在上述代码中,每次 txt 的状态发生变化时,useEffect hook 会被重新调用。随后,txtRef.current 会持有 txt 断=http的新值,而浏览器反馈显示了旧值与新值的状态。

这是为什么需要额外步骤

在浏览器反馈中可以看到,每次修改完成后,txtRef.current 维持的是旧值,而不是最新的新值。这导致如果我们直接完成这样做,下一次 useEffect 调用时,txtRef.current 就不会反映最新的新值。这意味着我们需要额外的一步,将新值赋值给 txtRef.current 以便下一次获取。

3. useEffect 实现变量值的监听

为了更高效地进行数据绑定,很多开发者会直接在 useEffect 的依赖数组中使用 txt。这种单纯的方式能够确保每次状态改变都会触发 useEffect 钩子的调用,从而实现旧值与新值的获取和存储。

import React, { useState, useEffect, useRef } from 'react';function Child(props) {  const [txt, setTxt] = useState("1");  const txtRef = useRef(txt);    useEffect(() => {    console.log('旧值:', txtRef.current, '新值:', txt);    txtRef.current = txt;  }, [txt]);  return (     setTxt(e.target.value)}    />  );}

浏览器反馈

浏览器反馈的结果显示,每次组件渲染时,useEffect 钩子的依赖项发生改变时,钩子的副作用函数会被执行。这实质上实现了我们想要的旧值与新值的获取和展示。同时,通过在副作用函数中将 txtRef.current 更新为最新 txt 的值,我们确保了在以后需要使用旧值时能够引用到正确的值。

自定义 Hooks

除了内置的 useEffectuseRef,我们有时候需要为特定的业务逻辑创造通用的解决方案,这就是自定义 Hooks 的作用。下面是一个关于自定义 Keys 创建的示例:

import React, { useState } from 'react';function useTitle(title) {  return document.title = title;}export { useTitle };

自定义 Hooks 的规则

  • 只在顶层调用的 Hooks,避免在循环、条件语句或嵌套函数中使用。
  • 只在函数组件中使用 Hooks,适用于 React 的自定义解决方案。
  • 自定义 Hooks 必须以 use 开头。
  • 通过使用自定义 Hooks,我们可以更灵活地管理组件的副作用逻辑。例如,在以下代码中,App 组件不仅能够展示输入字段,还能通过 useTitle 自定义顶部标题。

    import React, { useState } from 'react';import { useTitle } from './hooks';function App() {  const [tit, setTit] = useState('App');  useTitle(tit);  return (     {        setTit(e.target.value);        e.target.value = '';      }}    />  );}export default App;

    这种方式使我们的组件代码更加清晰,便于管理和维护复杂的业务逻辑。

    总结

    通过以上方法,我们可以在 React 组件中实现变量值的旧值与新值监听。这对于数据校验、状态管理等场景都有十分重要的应用价值。同时,合理地使用 useEffect 和自定义 Hooks 能够让我们的代码更加简洁和高效。如果需要更多的 React Hook 相关内容,建议查阅官方文档以获取更深入的理解和实用技巧。

    转载地址:http://hlwiz.baihongyu.com/

    你可能感兴趣的文章
    NetBeans IDE8.0需要JDK1.7及以上版本
    查看>>
    netcat的端口转发功能的实现
    查看>>
    netfilter应用场景
    查看>>
    netlink2.6.32内核实现源码
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    NetScaler的常用配置
    查看>>
    netsh advfirewall
    查看>>
    NETSH WINSOCK RESET这条命令的含义和作用?
    查看>>
    Netty WebSocket客户端
    查看>>
    netty 主要组件+黏包半包+rpc框架+源码透析
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    Netty事件注册机制深入解析
    查看>>
    Netty原理分析及实战(四)-客户端与服务端双向通信
    查看>>
    Netty客户端断线重连实现及问题思考
    查看>>
    Netty工作笔记0006---NIO的Buffer说明
    查看>>
    Netty工作笔记0007---NIO的三大核心组件关系
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>
    Netty工作笔记0013---Channel应用案例4Copy图片
    查看>>
    Netty工作笔记0014---Buffer类型化和只读
    查看>>