当前位置:首页 > React

react如何实现watch

2026-01-24 02:23:31React

React 中实现类似 Vue 的 watch 功能

在 React 中,没有内置的 watch 功能,但可以通过以下几种方式实现类似 Vue 的监听效果:

使用 useEffect Hook

useEffect 是 React 提供的副作用钩子,可以监听特定依赖项的变化。

import React, { useState, useEffect } from 'react';

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

  useEffect(() => {
    console.log('count changed:', count);
    // 在这里执行 count 变化后的逻辑
  }, [count]); // 依赖数组,只有 count 变化时才会执行

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

使用自定义 Hook

可以创建一个自定义 Hook 来封装 watch 功能:

import { useEffect, useRef } from 'react';

function useWatch(value, callback) {
  const prevValue = useRef(value);

  useEffect(() => {
    if (prevValue.current !== value) {
      callback(value, prevValue.current);
      prevValue.current = value;
    }
  }, [value, callback]);
}

// 使用示例
function MyComponent() {
  const [name, setName] = useState('');

  useWatch(name, (newVal, oldVal) => {
    console.log('Name changed from', oldVal, 'to', newVal);
  });

  return <input value={name} onChange={(e) => setName(e.target.value)} />;
}

使用第三方库

有一些第三方库提供了更接近 Vue watch 的功能:

  1. use-deep-compare-effect: 可以深度比较对象

    npm install use-deep-compare-effect
    import { useDeepCompareEffect } from 'use-deep-compare-effect';
    
    function MyComponent({ obj }) {
      useDeepCompareEffect(() => {
        console.log('obj changed:', obj);
      }, [obj]);
    }
  2. react-use-watch: 专门为 React 设计的 watch 库

    npm install react-use-watch
    import { useWatch } from 'react-use-watch';
    
    function MyComponent() {
      const [data, setData] = useState({ count: 0 });
    
      useWatch(data, (newVal, oldVal) => {
        console.log('data changed:', newVal, oldVal);
      });
    
      return <button onClick={() => setData({ count: data.count + 1 })}>Increment</button>;
    }

监听多个状态变化

如果需要同时监听多个状态的变化:

useEffect(() => {
  // 当 count 或 name 任一变化时执行
  console.log('count or name changed', count, name);
}, [count, name]);

监听 props 变化

组件 props 的变化也可以通过 useEffect 监听:

react如何实现watch

function MyComponent({ userId }) {
  useEffect(() => {
    console.log('userId changed:', userId);
    // 在这里可以执行数据获取等操作
  }, [userId]);
}

注意事项

  1. 避免在 useEffect 中直接修改依赖的状态,这可能导致无限循环
  2. 对于复杂对象的监听,默认的浅比较可能不会触发,需要使用深度比较或特定的比较方法
  3. 清理副作用:如果 useEffect 中有订阅或定时器等操作,需要返回清理函数
useEffect(() => {
  const timer = setInterval(() => {
    console.log('Timer running');
  }, 1000);

  return () => {
    clearInterval(timer); // 组件卸载时清理
  };
}, []);

以上方法提供了在 React 中实现类似 Vue watch 功能的不同方案,可以根据具体需求选择最适合的方式。

分享给朋友:

相关文章

react如何发音

react如何发音

React的发音 React的正确发音为 /riˈækt/,类似于“ree-akt”。以下是详细说明: 发音分解 第一个音节“Ree”发音类似英文单词“see”中的“ee”音。…

react如何折叠

react如何折叠

在 React 中实现折叠功能 使用 useState 管理折叠状态 通过 useState 定义一个状态变量来控制折叠面板的显示与隐藏。例如: const [isCollapsed, setIsC…

react如何减少setState

react如何减少setState

减少 React 中 setState 调用的方法 合并多次状态更新 使用函数式更新方式合并多次 setState 调用。React 会将多次状态更新批量处理,避免不必要的重新渲染。 // 非函…

java如何实现多线程

java如何实现多线程

实现多线程的方法 在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。此外,还可以使用ExecutorService等高级工具类来管理线程。 继承Thread类 通…

vue如何实现select

vue如何实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过原生 HTML <select> 元素或使用第三方 UI 库(如 Element UI、Ant Des…

react如何编码参数

react如何编码参数

编码参数的方法 在React中,编码参数通常涉及URL查询参数或路由参数的编码和解码。以下是几种常见场景的处理方法: URL查询参数编码 使用encodeURIComponent对参数进行编码,避免…