【ProComponents】解决 ProTable 中 params 参数改变,request 函数未触发问题

文章目录

  1. 先建议自查下官方文档,了解paramsrequest直接的关系

在这里插入图片描述

  1. 确定params绑定的参数是否改变,例如 user_name 参数
import { ProTable, WxIcon } from '@/components';
import { getSearchParams } from 'ice';
import { useEffect, useMemo, useRef, useState } from 'react';
import store from '@/store';

export default function (props) {
  const searchParams = getSearchParams();
  const [selectValue, setSelectValue] = useState({
    a: 'user',
    b: undefined,
    c: null,
    user_name: null,
  });
  useEffect(() => {
    setSelectValue({ ...selectValue, user_name: searchParams.user_name});
    // 这里监听 user_name 是否发生了改变
    console.log('user_name = ', searchParams.user_name)
  }, [searchParams.user_name]);

  return (
    <>
      <ProTable
        {/* ...这里做了代码省略,只保留关键属性 */}
        params={{
          ...selectValue,
        }}
        request={async (params) => {
            console.log('参数 =', params);

            const data = await get_list({...省略});
            return {
              data,
              success: true,
              total: data.total,
            };
          }
        }
      />
    </>
  );
}
  1. 如果user_name 参数发生改变,且能正常监听,那导致request 未触发的原因就是:
  • params 更新频率过高,导致 ProTable 来不及及时更新,这时候采用节流或防抖就可以了
  • ProTable自带了一个防抖时间设置属性debounceTime,默认是10毫秒,这时候我们调高数据就好了,比如300毫米
import { ProTable, WxIcon } from '@/components';
import { getSearchParams } from 'ice';
import { useEffect, useMemo, useRef, useState } from 'react';
import store from '@/store';

export default function (props) {
  const searchParams = getSearchParams();
  const [selectValue, setSelectValue] = useState({
    a: 'user',
    b: undefined,
    c: null,
    user_name: null,
  });
  useEffect(() => {
    setSelectValue({ ...selectValue, user_name: searchParams.user_name});
    // 这里监听 user_name 是否发生了改变
    console.log('user_name = ', searchParams.user_name)
  }, [searchParams.user_name]);

  return (
    <>
      <ProTable
        {/* ...这里做了代码省略,只保留关键属性 */}
        params={{
          ...selectValue,
        }}
        debounceTime={300}
        request={async (params) => {
            console.log('参数 =', params);

            const data = await get_list({...省略});
            return {
              data,
              success: true,
              total: data.total,
            };
          }
        }
      />
    </>
  );
}
  • 然后我们还可以把params 提到 useMemo 中,可以避免每次 render 都触发创建一个新 params 对象导致不必要的更新
import { ProTable, WxIcon } from '@/components';
import { getSearchParams } from 'ice';
import { useEffect, useMemo, useRef, useState } from 'react';
import store from '@/store';

export default function (props) {
  const searchParams = getSearchParams();
  const [selectValue, setSelectValue] = useState({
    a: 'user',
    b: undefined,
    c: null,
    user_name: null,
  });
  useEffect(() => {
    setSelectValue({ ...selectValue, user_name: searchParams.user_name});
    // 这里监听 user_name 是否发生了改变
    console.log('user_name = ', searchParams.user_name)
  }, [searchParams.user_name]);
  
  const params = useMemo(()=>({
  	...selectValue,
  }),[selectValue])

  return (
    <>
      <ProTable
        {/* ...这里做了代码省略,只保留关键属性 */}
        params={params}
        debounceTime={300}
        request={async (params) => {
            console.log('参数 =', params);

            const data = await get_list({...省略});
            return {
              data,
              success: true,
              total: data.total,
            };
          }
        }
      />
    </>
  );
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一颗不甘坠落的流星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值