ant-design / pro-components

🏆 Use Ant Design like a Pro!
https://pro-components.antdigital.dev
MIT License
4.04k stars 1.29k forks source link

🐛[BUG]:ProFormSelect的dependencies 发生变化(1→2→1),再次变成1时,request未再次请求 #4770

Closed wooxyz closed 2 years ago

wooxyz commented 2 years ago

🐛 bug 描述

一开始,点击男或女,request中代码是执行的。当再点击时(如1→2→1),代码就不往下执行了(实际调接口也是一样结果)。难道不是值发生变化,就重新请求吗?还是我理解的dependencies 发生变化,有问题???

💻 复现代码

<ProFormRadio.Group name="gender" label="性别"
  options={[
    { label: '男', value: '1' },
    { label: '女', value: '2' },
  ]}
/>
<ProFormSelect
  name="addr"
  width="md"
  label="与性别联动的选择器"
  // dependencies 的内容会注入 request 中
  dependencies={['gender']}
  request={async (params) => {
    const s = [
      // { label: params.radio2, value: 'all' },
      { label: 'Unresolved', value: 'open' },
      { label: 'Resolved', value: 'closed' },
      { label: 'Resolving', value: 'processing' },
    ]
    console.log(params)
    console.log("end~")
    return s
  }}
/>

© 版本信息

wooxyz commented 2 years ago

升级版本后,是可以的。

wooxyz commented 2 years ago

ant-design/pro-form版本不同,ProFormSelect的dependencies 发生变化,request代码执行不一。 这是pro-form@1.52.13,值切换,不请求,最新的也是。 https://codesandbox.io/s/ji-ben-shi-yong-forked-w7d2rc。 这是pro-form@1.49.3,值切换,请求。https://codesandbox.io/s/biao-dan-xiang-forked-p503qn?file=/App.tsx:0-888。 请老哥们好好看下,拜托!!! @chenshuai2144

wooxyz commented 2 years ago

上面第一个有点问题,请看这个,https://codesandbox.io/s/ji-ben-shi-yong-forked-tg9tpl?file=/App.tsx。 打开控制台,就可发现问题。

chenshuai2144 commented 2 years ago

看了下是被缓存了。

只要params 相同就不会重新发起请求。

wooxyz commented 2 years ago

看了下是被缓存了。

只要params 相同就不会重新发起请求。

但两个案例是完全相同的代码逻辑,只是版本不一而已。难道是1.49.3没有缓存?

Dunqing commented 2 years ago

缓存了,旧版的缓存和select都有点问题,已经不知道是哪个版本修复的了

Dunqing commented 2 years ago

是正常的现象,我们认为request查询的都是枚举,是不可变的,只要请求过了都会缓存在内存中,除非你重新刷新页面

wooxyz commented 2 years ago

从字面意思来看,dependencies是依赖值,就像hooks里的思想一样。我的场景就是值变化,需要重新发强求,不能加个加个参数控制吗?

Dunqing commented 2 years ago

做缓存主要是减少没必要的请求,除非你这个数据是一直在变的,否则没有重新请求的必要吧

可以描述下需求是啥样的?

wooxyz commented 2 years ago

好,按你的意思:第一次选男,请求,返回一个结果给下面的select框;选女,请求,返回另一个结果select。当再次切换到男时,不发请求,结果select是女的请求数据,难道这样不是怪怪的吗?

Dunqing commented 2 years ago

好,按你的意思:第一次选男,请求,返回一个结果给下面的select框;选女,请求,返回另一个结果select。当再次切换到男时,不发请求,结果select是女的请求数据,难道这样不是怪怪的吗?

那是你理解错了

缓存是缓存了你返回的值,当你选了女又选回了男,选项将自动展示男的时候的选项

看看这个demo你就懂了 https://codesandbox.io/s/ji-ben-shi-yong-forked-mms429?file=/App.tsx

wooxyz commented 2 years ago

我还有一个疑问,下拉框数据很多:当下拉列表滚动到底部时,开始发起新的请求(如第2页),能在request中能获取到第一页的缓存数据吗?新旧一起返回,还是得重新定义变量缓存下?

chenshuai2144 commented 2 years ago

page 不一样会重新请求的。

wooxyz commented 2 years ago

page 不一样会重新请求的。

我知道。能在request函数里一并搞定,新旧数据?(不想再定义变量缓存第一页的数据,或者第一页的缓存数据如何在request获取)

Dunqing commented 2 years ago

没发现select有滚动到底部加载下一页的功能

Dunqing commented 2 years ago

不过你这个需求好像确实不支持,当你到第二页,你想要[...第一页, ...第二页]的数据应该是这样吧,还没发现有这样的功能需求

wooxyz commented 2 years ago

不过你这个需求好像确实不支持,当你到第二页,你想要[...第一页, ...第二页]的数据应该是这样吧,还没发现有这样的功能需求

是的,想要这个功能。我们返回的数据量有点多

Dunqing commented 2 years ago

select本身就不支持分页请求,需要这种功能得去antd提

select是支持虚拟滚动,我测试过百万条数据也是首次加载会卡一点,性能问题antd扛着,放心使用

LzhH5 commented 2 years ago

@chenshuai2144 @1247748612
1、request只要请求过了都会缓存在内存中,提供了性能方面的部分优化。 2、但是目前有以下的场景: 有两个下拉框为 a和b[ a和b 有联动 , a的值会影响b的options选项。另外,在其他页面 b会有增删改查的情景,那么此时缓存无法取到最新的数据]。 3、您可能推荐在a的change事件中来处理(还需要结合hooks),但是我们想在proFormSelect组件中,统一处理相关逻辑。 4、能否再提供一个属性,来灵活的处理是否需要缓存。

Dunqing commented 2 years ago

4、能否再提供一个属性,来灵活的处理是否需要缓存。 有个 cacheForSwr 属性,置为false不启用缓存

能用codesandbox实现个示例吗?看看具体是什么场景

Dunqing commented 2 years ago

4、能否再提供一个属性,来灵活的处理是否需要缓存。 有个 cacheForSwr 属性,置为false不启用缓存

能用codesandbox实现个示例吗?看看具体是什么场景

LzhH5 commented 2 years ago

有个 cacheForSwr 属性,置为false不启用缓存

<ProFormSelect
cacheForSwr={false}
name="addr"
width="md"
label="与性别联动的选择器"
// dependencies 的内容会注入 request 中
dependencies={['gender']}
request={async (params) => {
//...
}}
/>

这么写不行啊,咋写啊?

LzhH5 commented 2 years ago

4、能否再提供一个属性,来灵活的处理是否需要缓存。 有个 cacheForSwr 属性,置为false不启用缓存

能用codesandbox实现个示例吗?看看具体是什么场景

https://codesandbox.io/s/ji-ben-shi-yong-forked-bh6hwg?file=/App.tsx 您好 添加这个这个属性,且更新最新版本的proForm,仍然存在缓存的问题。

Dunqing commented 2 years ago

https://codesandbox.io/s/ji-ben-shi-yong-forked-bh6hwg?file=/App.tsx 您好 添加这个这个属性,且更新最新版本的proForm,仍然存在缓存的问题。

看起来是个bug,form中没有设置cacheForSwr是不会设置缓存的