React中如何模拟vue中的watch,computer,v-model

一、模拟 Vue 的 watch

Vue 的 watch 用来监听数据变化并执行副作用,React 里用 useEffect 实现。

1. 基础用法(监听单个值变化)

javascript 复制代码
import { useState, useEffect } from 'react'; 
function Demo()
{ const [count, setCount] = useState(0);
// 等价于 watch: { count(newVal, oldVal) { ... } } 
useEffect(() => { console.log('count 变化了,新值:', count);
// 这里可以执行副作用,比如发请求、更新其他状态 }, 
[count]); 
// 依赖数组里放要监听的值 
return <button onClick={() => setCount(c => c + 1)}>count: {count}</button>; }

2. 立即执行(immediate: true)

Vue 中 immediate: true 会在组件初始化时就执行一次,React 里 useEffect 默认就会执行一次,无需额外配置。

3. 深度监听(deep: true)

监听对象内部属性变化时,直接放对象会导致每次渲染都触发,需要手动监听具体属性,或用 JSON 序列化

scss 复制代码
const [user, setUser] = useState({ name: '张三', age: 18 });
// 监听整个对象(不推荐,会频繁触发)
useEffect(() => { console.log('user 变化了:', user); }, 
[JSON.stringify(user)]); 
// 用 JSON.stringify 序列化对象
// 推荐:只监听具体属性
useEffect(() => { console.log('name 变化了:', user.name); }, [user.name]);

二、模拟 Vue 的 computed

Vue 的 computed 是基于依赖缓存的计算属性,React 里用 useMemo 实现。

1. 基础用法

javascript 复制代码
import { useState, useMemo } from 'react';
function Demo()
{ const [count, setCount] = useState(0); 
const [price, setPrice] = useState(10);
// 等价于 computed: { total() { return count * price; } } 
const totalPrice = useMemo(() =>
{ console.log('计算总价'); // 只有 count 或 price 变化时才会打印
return count * price; }, 
[count, price]); // 依赖数组放所有用到的变量
return 
( <div> 
<p>数量: {count}</p> 
<p>单价: {price}</p>
<p>总价: {totalPrice}</p>
<button onClick={() => setCount(c => c + 1)}>加数量</button> </div> ); }

2. 带 setter 的 computed(Vue 中 computed 可写)

React 没有直接的 setter,但可以通过自定义函数实现

javascript 复制代码
import { useState, useMemo } from 'react';
function Demo(){ 
const [count, setCount] = useState(0);
const [price, setPrice] = useState(10); 
// 只读计算属性
const totalPrice = useMemo(() => count * price, [count, price]);
// 模拟 setter,修改总价时反推数量
const setTotalPrice = (newTotal) => { setCount(Math.round(newTotal / price)); };
return(
<div>
<p>总价: {totalPrice}</p> 
<button onClick={() => setTotalPrice(100)}>设置总价为100</button> 
</div> ); 
}

三、模拟 Vue 的 v-model

Vue 的 v-model 是语法糖,本质是 :value + @input,React 里手动实现即可。

1. 基础表单元素(input/textarea)

ini 复制代码
import { useState } from 'react'; 
function Demo() {
const [value, setValue] = useState(''); 
// 等价于 <input v-model="value" />
return (
<input type="text"
value={value} 
onChange={(e) => setValue(e.target.value)}
placeholder="请输入内容" /> ); }

2. 自定义组件的双向绑定

React 里通过 value + onChange 实现自定义组件的双向绑定:

javascript 复制代码
// 自定义输入组件
function CustomInput({ value, onChange }) {
return ( 
<input type="text"
value={value} 
onChange={(e) => onChange(e.target.value)} /> ); } 
// 使用组件 
function Parent() { 
const [text, setText] = useState(''); 
// 等价于 <CustomInput v-model="text" /> 
return <CustomInput value={text} onChange={setText} />; }
  1. 多选框 / 单选框
ini 复制代码
import { useState } from 'react'; 
function Demo() {
const [checked, setChecked] = useState(false);
// 等价于 <input type="checkbox" v-model="checked" /> 
return ( 
<input 
type="checkbox" 
checked={checked} 
onChange={(e) => setChecked(e.target.checked)}
/> ); }
Vue 特性 React 对应实现 核心差异
watch useEffect 需手动指定依赖数组,无内置 deep/immediate 配置
computed useMemo 只读缓存,需手动实现 setter
v-model value + onChange 无语法糖,需手动绑定属性和事件
相关推荐
放下华子我只抽RuiKe51 小时前
FastAPI 全栈后端(八):部署与运维
运维·数据库·react.js·oracle·数据挖掘·前端框架·fastapi
TheITSea1 小时前
一、React初体验:搭建、解析现代开发环境
前端·react.js·前端框架
光影少年2 小时前
避免不必要渲染:PureComponent、memo、useMemo、useCallback
react.js·面试·掘金·金石计划
aaaa954726653 小时前
终端与IDE形态Vibe Coding实测:主流AI编程工具迁移与迭代对比
javascript·react.js·ecmascript
放下华子我只抽RuiKe53 小时前
FastAPI 全栈后端(七):测试与自动化
运维·前端·人工智能·react.js·前端框架·自动化·fastapi
放下华子我只抽RuiKe51 天前
FastAPI 全栈后端(三):数据库与 ORM
前端·数据库·react.js·oracle·性能优化·前端框架·fastapi
oioihoii1 天前
探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程
react.js·低代码·rxjava
超哥--1 天前
B站视频内容智能分析系统(九):React 前端与管理面板
前端·react.js·前端框架