当前位置:首页 > React

react 实现 watch

2026-01-26 14:13:58React

在 React 中实现类似 Vue 的 watch 功能,可以通过以下几种方式监听状态变化并执行副作用:

使用 useEffect 钩子

useEffect 是 React 提供的标准方式,用于监听依赖项的变化并执行副作用。

import { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('count changed:', count);
    // 可以在这里执行副作用逻辑
  }, [count]); // 依赖数组,仅当 count 变化时触发

  return (
    <button onClick={() => setCount(count + 1)}>
      Increment: {count}
    </button>
  );
}

自定义 useWatch Hook

封装一个自定义 Hook 来模拟 Vue 的 watch 行为,提供更灵活的监听逻辑。

import { useEffect, useRef } from 'react';

function useWatch(value, callback, options = { immediate: false }) {
  const isFirstRun = useRef(true);

  useEffect(() => {
    if (isFirstRun.current && !options.immediate) {
      isFirstRun.current = false;
      return;
    }
    callback(value);
  }, [value]);
}

// 使用示例
function Demo() {
  const [data, setData] = useState(null);

  useWatch(data, (newValue) => {
    console.log('data changed:', newValue);
  }, { immediate: true });

  return <button onClick={() => setData(Date.now())}>Update Data</button>;
}

使用第三方库

一些库(如 ahooks)提供了现成的 useWatch 或类似功能:

import { useWatch } from 'ahooks';

function Component() {
  const [state, setState] = useState({});

  useWatch(state, (prev, next) => {
    console.log('prev:', prev, 'next:', next);
  });

  return <button onClick={() => setState({ ...state, time: Date.now() })}>Update</button>;
}

对比依赖数组的旧值

useEffect 中通过引用对比或深比较实现类似 watch 的旧值访问:

useEffect(() => {
  const subscription = someObservable.subscribe();
  return () => subscription.unsubscribe(); // 清理函数
}, [someObservable]);

注意事项

  • 对于对象或数组等引用类型,需注意浅比较问题,可能需要配合 useMemo 或深比较工具。
  • 频繁触发的监听可能导致性能问题,可使用防抖(debounce)或节流(throttle)优化。
  • Class 组件中可通过 componentDidUpdate 实现类似功能。

react 实现 watch

标签: reactwatch
分享给朋友:

相关文章

react如何使用

react如何使用

React 的基本使用 React 是一个用于构建用户界面的 JavaScript 库,以下是一些核心概念和使用方法。 安装 React 通过 create-react-app 快速搭建 React…

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: nod…

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impo…

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

电脑如何安装react

电脑如何安装react

安装 Node.js 和 npm React 依赖于 Node.js 和 npm(Node Package Manager)。从 Node.js 官网下载并安装最新稳定版本,安装完成后会自动包含 np…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修…