把useState变成响应式

本文介绍了如何使用Proxy改造React中的useState,实现在不直接修改状态时自动触发setState,从而简化状态管理并避免回调嵌套问题。但注意,这仅适用于第一层对象属性,深层属性需递归处理可能导致资源消耗增加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ⅰ、前言

  • 我们知道 React 中 , 要想修改 状态 => 必须要
  • state , setState = useState() 中
  • setState 去修改 => state
  • 那么如果用 Proxy => 去改造 useState,那么 摸鱼的时间又增加啦 ?

在这里插入图片描述

Ⅱ、proxy 改造 useState

  • 首先我们直接修改状态,页面是无法直接更新的;
  • 但是 proxy ,可以监听到;
  • 监听到的同时,再触发 setState => 修改 setState
  • 同时再次赋予 proxy ,让下一次 proxy 正常监听到;

下面我们实例去看 👇

改造 👇
export default function  Reactive(obj) {
  const [value, setValue] = useState(setProxy(obj))
  function setProxy(value) {
	return new Proxy( value ,{
		get:Reflect.get,
		set(proxy,key,value,reciver){
			setValue(proxy)
			return Reflect.set(proxy,key,value,reciver)
		}
	})
  }
  return value
}
使用 👇
import  useReactive from './proxyState'
export default function Index() {
  const obj = useReactive({ num: 0 })
  return (
    <div>
		<button onClick={()=>{ obj.num-- }} >减少</button>
		<span> { obj.num } </span>
		<button onClick={()=>{ obj.num++ }} >增加</button>
	</div>
  )
}
  • 直接修改 , 让 proxy 监听自动 setState ;
优势👇
import  useReactive from './proxyState'
export default function Index() {
  const [state, setState] = useState({ num:0 })
  const state2 = useReactive({ num: 0 })
   
  function add(){
	setState(
		{ num: state.num + 1  }, 
		(res) => {   console.log('当前最新的值为', res.num)
	})
  	
  	state2.num++
  	console.log('当前最新的值为',  state2.num2)
  }
  // ...
}
  • useState 必须在 callback 回调函数里才能获取最新状态;
  • 如果 setState 后面拿去 state 则还是之前的值;
  • 改造后的获取则,会走 proxyget 总是为最新,
  • 避免了setStatecallback 回调函数嵌套问题;
缺陷 👇
  • 只能监听对象的 第一层属性 , 对于深层的属性变化是没法监听到的;
  • 如果需要监听深层,需要递归 proxy ,可能对资源消耗过大;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生吃饼怪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值