当前位置:首页 > React

react 实现 watch

2026-01-26 14:13:58React

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

使用 useEffect 钩子

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

react 实现 watch

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 行为,提供更灵活的监听逻辑。

react 实现 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 实现类似功能。

标签: reactwatch
分享给朋友:

相关文章

如何记忆react

如何记忆react

理解核心概念 React的核心概念包括组件、状态(state)、属性(props)、生命周期方法(类组件)和钩子(函数组件)。掌握这些基础概念是记忆React的关键。组件是React应用的构建块,分为…

react如何刷新

react如何刷新

刷新React组件的方法 使用状态更新触发重新渲染 通过更新组件的状态可以触发重新渲染。React会在状态变化时自动重新渲染组件。 const [count, setCount] = useStat…

react如何注销

react如何注销

React 组件的注销方法 在 React 中,组件的注销通常指的是在组件卸载时执行清理操作,例如取消订阅、清除定时器或释放资源。以下是几种常见的方法: 使用 useEffect 钩子的清理函数…

react如何实现录音

react如何实现录音

使用React实现录音功能 在React中实现录音功能通常需要借助浏览器的MediaRecorder API。以下是实现步骤: 获取用户麦克风权限 需要请求用户授权访问麦克风设备,使用navigat…

react如何传参数

react如何传参数

在 React 中传递参数的方法 React 提供了多种传递参数的方式,具体取决于组件的类型和场景。以下是常见的参数传递方法: 父子组件传递参数(Props) 父组件通过属性(props)向子组件传…

react如何传参

react如何传参

react传参方法 React中传递参数有多种方式,以下是常见的方法: 父组件向子组件传递参数 通过props传递参数是最常见的方式。父组件在调用子组件时,通过属性传递数据,子组件通过props接…