React.useRef 与ES6 Proxy实现数据劫持

在处理包含多个筛选条件和表格排序的业务场景中,为了保存筛选条件但不保存状态,使用了React.useRef。由于ref数据变化时不触发通知,故采用ES6 Proxy监听数据变化,以在数据变更时自动发起请求。这种方法简化了子组件的处理逻辑,关注于数据状态的改变,但不确定是否为React官方推荐的做法。

case

遇到一个有很多筛选条件、 表格排序的业务场景,但是这些数据状态不需要保存,但是需要保存筛选条件以请求后台。于是使用useRef保存所有类型的筛选条件。考虑到想在ref数据变更时发起请求,但是ref.current变更时不会通知且useImperativeHandle使用复杂并不被推荐,于是想到使用Proxy实现

usage

Parent.tsx

import React, { useRef } from 'react';
import { useDispatch } from 'react-redux';

const defaultValues = {
  select: 'code1',
  input: 'input somrthing'
}

export default () => {
const dispatch = useDispatch();

const dataRef = useRef(new Proxy(defaultValues, {
  set: (target, prop, value) => {
    // do something
   dispatch({
   // ......
   })
   target[prop] = value;
   // 返回假值会抛出异常
   return true;
  }
}));

return (
  <>
    <Child1 wrapperRef={dataRef} />
    <Child2 wrapperRef={dataRef} />
  </>
 )
}

Child1.tsx

import React  from 'react';

export default ({
  wrapperRef, // ref不能作为属性名传递到子组件 key也是
}) => {

function onChange(value, type) {
  // Proxy拦截set,触发请求
  wrapper.current[type] = value;
}
return (
  <>
	  <Select defaultValue={wrapper.current.select} onChange={v => onChange(v, 'select')} />
	  <Input defaultValue={wrapper.current.input} onChange={({ target }) => onChange(target.value, 'input')} />
  </>
 )
}

我是觉着这样写就不需要在每个子组件里加一堆处理方法,只需要关心数据状态更改。用起来很好,但是不知道React官方是否推荐。但好用且不会造成异常或性能问题

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值