react hooks & props change & pagination current bug

multi tables & pigination bug & current update

just listen to the props' unique value change, then update your local state!


  1. import React, {
  2. useState,
  3. useEffect,
  4. } from 'react';
  5. import ExportableTable from '@/components/ExportableTable';
  6. import { generateFilename } from '@/utils/exportUtils';
  7. const TrendTable = ({
  8. startDate,
  9. endDate,
  10. dataSource,
  11. moduleName,
  12. analysisName,
  13. units,
  14. initCurrent,
  15. }) => {
  16. const [current, setCurrent] = useState(initCurrent);
  17. const [tableName, setTableName] = useState(analysisName);
  18. // const [unmounted, setUnmounted] = useState(false);
  19. useEffect(() => {
  20. console.log(`did mount`);
  21. // props change
  22. if(tableName !== analysisName) {
  23. console.log(`tableName`, tableName, analysisName);
  24. setCurrent(1);
  25. setTableName(analysisName);
  26. }
  27. let unmounted = false;
  28. if(!unmounted) {
  29. // cancel update state
  30. }
  31. return () => unmounted = true;
  32. }, [analysisName, tableName]);
  33. const columns = [
  34. {
  35. title: 'date',
  36. dataIndex: 'date',
  37. key: 'date',
  38. align: 'center',
  39. width: 150,
  40. },
  41. {
  42. title: analysisName,
  43. dataIndex: 'value',
  44. key: 'value',
  45. align: 'center',
  46. render: text => `${text} ${units}`,
  47. width: 150,
  48. },
  49. ];
  50. const total = dataSource ? dataSource.length : 0;
  51. console.log(`total`, total, current);
  52. const filename = generateFilename({
  53. moduleName,
  54. analysisName,
  55. startDate,
  56. endDate,
  57. });
  58. return (
  59. <ExportableTable
  60. filename={filename}
  61. size="small"
  62. bordered={false}
  63. rowKey="name"
  64. columns={columns}
  65. pagination={{
  66. current,
  67. pageSize: 10,
  68. showSizeChanger: true,
  69. pageSizeOptions: ['5', '10', '20'],
  70. showQuickJumper: true,
  71. showTotal: total => <span>{total} items</span>,
  72. }}
  73. dataSource={dataSource}
  74. defaultCurrent={1}
  75. onChange={(p) => {
  76. setCurrent(p.current);
  77. }}
  78. />
  79. );
  80. };
  81. export {
  82. TrendTable,
  83. };
  84. export default TrendTable;

solution

https://github.com/facebook/react/issues/14830#issuecomment-550211522


  1. import React, {
  2. useState,
  3. useEffect,
  4. } from 'react';
  5. import ExportableTable from '@/components/ExportableTable';
  6. import { generateFilename } from '@/utils/exportUtils';
  7. const TrendTable = ({
  8. startDate,
  9. endDate,
  10. dataSource,
  11. moduleName,
  12. analysisName,
  13. units,
  14. initCurrent,
  15. }) => {
  16. const [current, setCurrent] = useState(initCurrent);
  17. const [tableName, setTableName] = useState(analysisName);
  18. useEffect(() => {
  19. let unmounted = false;
  20. if(!unmounted) {
  21. if(tableName !== analysisName) {
  22. setCurrent(1);
  23. setTableName(analysisName);
  24. }
  25. }
  26. return () => unmounted = true;
  27. }, [analysisName, tableName]);
  28. const columns = [
  29. {
  30. title: '日期',
  31. dataIndex: 'date',
  32. key: 'date',
  33. align: 'center',
  34. width: 150,
  35. },
  36. {
  37. title: analysisName,
  38. dataIndex: 'value',
  39. key: 'value',
  40. align: 'center',
  41. render: text => `${text} ${units}`,
  42. width: 150,
  43. },
  44. ];
  45. const total = dataSource ? dataSource.length : 0;
  46. console.log(`total`, total, current);
  47. const filename = generateFilename({
  48. moduleName,
  49. analysisName,
  50. startDate,
  51. endDate,
  52. });
  53. return (
  54. <ExportableTable
  55. filename={filename}
  56. size="small"
  57. bordered={false}
  58. rowKey="name"
  59. columns={columns}
  60. pagination={{
  61. current,
  62. pageSize: 10,
  63. showSizeChanger: true,
  64. pageSizeOptions: ['5', '10', '20'],
  65. showQuickJumper: true,
  66. showTotal: total => <span> {total} 条记录</span>,
  67. }}
  68. dataSource={dataSource}
  69. defaultCurrent={1}
  70. onChange={(p) => {
  71. setCurrent(p.current);
  72. }}
  73. />
  74. );
  75. };
  76. export {
  77. TrendTable,
  78. };
  79. export default TrendTable;


react hooks & props change & pagination current bug的更多相关文章

  1. react hooks & component will unmount & useEffect & clear up

    react hooks & component will unmount & useEffect & clear up useEffect & return === u ...

  2. React Hooks 深入系列 —— 设计模式

    本文是 React Hooks 深入系列的后续.此篇详细介绍了 Hooks 相对 class 的优势所在, 并介绍了相关 api 的设计思想, 同时对 Hooks 如何对齐 class 的生命周期钩子 ...

  3. React Hooks 实现和由来以及解决的问题

    与React类组件相比,React函数式组件究竟有何不同? 一般的回答都是: 类组件比函数式组件多了更多的特性,比如 state,那如果有 Hooks 之后呢? 函数组件性能比类组件好,但是在现代浏览 ...

  4. React Hooks总结

    Hook 前言 什么是Hook 自从 16.8 版本开始,hooks 的出现使得你可以在不编写 class 的情况下使用状态管理以及其它 React 的特性. 那么在 React Hooks 出现之前 ...

  5. [React Hooks长文总结系列一]初出茅庐,状态与副作用

    写在开头 React Hooks在我的上一个项目中得到了充分的使用,对于这个项目来说,我们跳过传统的类组件直接过渡到函数组件,确实是一个不小的挑战.在项目开发过程中也发现项目中的其他小伙伴(包括我自己 ...

  6. 谈谈react hooks的优缺点

    前言Hook 是 React 16.8 的新增特性.它是完全可选的,并且100%向后兼容.它可以让你使用函数组件的方式,运用类组件以及 react 其他的一些特性,比如管理状态.生命周期钩子等.从概念 ...

  7. react之react Hooks

    函数组件,没有 class 组件中的 componentDidMount.componentDidUpdate 等生命周期方法,也没有 State,但这些可以通过 React Hook 实现. Rea ...

  8. 你真的会用react hooks?看看eslint警告吧!(如何发请求、提升代码性能等问题)

    前言 看过几个react hooks 的项目,控制台上几百条警告,大多是语法不规范,react hooks 使用有风险,也有项目直接没开eslint.当然,这些项目肯定跑起来了,因为react自身或者 ...

  9. 关于React Hooks,你不得不知的事

    React Hooks是React 16.8发布以来最吸引人的特性之一.在开始介绍React Hooks之前,让咱们先来理解一下什么是hooks.wikipedia是这样给hook下定义的: In c ...

随机推荐

  1. 【LinuxShell】ps 命令浅析

    前言 Linux上查看进程状态最常用的命令,本文对 ps 命令参数以及状态做一下简单介绍. 参数 ps a 显示现行终端机下的所有程序,包括其他用户的程序. ps -A 显示所有程序. ps c 列出 ...

  2. Java 从数组来看值传递和引用传递

    从数组来看值传递和引用传递 惯例先看一段代码 public class DemoCollection14 { public static void main(String[] args) { Stri ...

  3. 慕课网金职位 Python工程师 百度网盘下载

    百度网盘链接:https://pan.baidu.com/s/1xshLRO3ru0LAsQQ0pE67Qg 提取码:bh9f 如果失效加我微信:610060008[视频不加密,资料代码齐全,超清一手 ...

  4. 微信小程序--使用云开发完成支付闭环

    微信小程序--使用云开发完成支付闭环 1.流程介绍 2. 代码实现和逻辑思想描述 云函数统一下单 对应云函数 unipay [CloudPay.unifiedOrder] 函数思路 : 调用云函数封装 ...

  5. 并发编程(Process对象的join方法)(

    一. Process对象的join方法 在主进程运行过程中如果想并发地执行其他的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况 情况一:在主进程的任务与子进程的任务彼此独立的情况下 ...

  6. WPF权限控制——【2】模块、菜单、按钮

    周末没有工作,没有写博客,因为觉得休息很必要:曾听到一句话是这样说的:"你们得救在乎归回安息:你们得力在乎平静安稳".当我想到太阳没秒钟要燃烧420万吨的燃料时,想到的就是造物主的 ...

  7. Java中的fail-fast和 fail-safe 的区别

    在我们详细讨论这两种机制的区别之前,首先得先了解并发修改. 1.什么是同步修改? 当一个或多个线程正在遍历一个集合Collection,此时另一个线程修改了这个集合的内容(添加,删除或者修改).这就是 ...

  8. HDU-6703 array (线段树)

    题意 一个长度为n的排列a,\(\forall i\in [1,n] ,1\le a_i \le n\) , m次操作,每次操作: (1,pos),把 \(a_{pos}\) 变为\(a_{pos} ...

  9. CF 1400G.Mercenaries 题解【SOSDP 组合数学】

    CF 1400G.Mercenaries 题意: 有\(n\)个佣兵,问雇佣至少一名雇佣兵且满足下述条件的方案数 如果雇佣第\(i\)个佣兵必须要求最终雇佣的总人数\(x\)满足\(l_i\le x\ ...

  10. 被收费绘图工具 PUA 了怎么办?来看看这个老实工具吧

    本文非常适合 Electron 入门选手,墙裂推荐! 本文作者:HelloGitHub-蔡文心 大家好!这里是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来的一款基于 ...