当前位置:首页 > 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 监听:

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如何实现watch

分享给朋友:

相关文章

react如何更新

react如何更新

更新 React 项目的方法 检查当前 React 版本 在项目根目录的 package.json 文件中查看 react 和 react-dom 的版本号。也可以通过命令行运行以下命令查看: np…

react实现vue

react实现vue

React 实现 Vue 功能 React 和 Vue 是两种不同的前端框架,但可以通过一些方法在 React 中实现 Vue 的特性。以下是几种常见 Vue 功能在 React 中的实现方式:…

vue手写签名如何实现

vue手写签名如何实现

实现 Vue 手写签名的步骤 使用 canvas 实现基础签名功能 在 Vue 项目中创建一个组件,利用 HTML5 的 canvas 元素实现手写签名功能。通过监听鼠标或触摸事件来捕获用户的绘制路径…

react中monent如何获取日期

react中monent如何获取日期

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

react 如何执行

react 如何执行

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

如何降低react版本

如何降低react版本

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