经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
React antd tabs切换造成子组件重复刷新
来源:jb51  时间:2021/4/6 9:27:23  对本文有异议

描述:

Tabs组件在来回切换的过程中,造成TabPane中包含的相同子组件重复渲染,例如:

  1. <Tabs
  2. activeKey={tabActiveKey}
  3. onChange={(key: string) => this.changeTab(key)}
  4. type="card"
  5. >
  6. <TabPane tab={"对外授权"} key="/authed-by-me">
  7. <AuthedCollections
  8. collectionType={this.collectionType}
  9. />
  10. </TabPane>
  11. <TabPane tab={"申请权限"} key="/authed-to-me">
  12. <AuthedCollections
  13. collectionType={this.collectionType}
  14. />
  15. </TabPane>
  16. </Tabs>
  17.  
  18.  
  19. changeTab = (key: string) => {
  20. this.collectionType = key === '/authed-by-me' ? CollectionEnums.AUTHED_TO_GRANT : CollectionEnums.AUTHED_TO_APPLY;
  21. this.setState({
  22. tabActiveKey: key
  23. })
  24. };

分析:

在Tabs的onChange监听函数changeTab中调用setState,造成页面重新render。antd 的策略是,只渲染当前的。当用户切换过后,不删除之前渲染过的节点。所以点击切换会逐渐增多。为的是防止用户在 mount 阶段调用异步请求导致切换时反复渲染。所以 render 数量随着上层刷新而整体刷新并增加是预期行为。

解决方案:

运用react的条件渲染,在每一次tab切换的时候将上个页面移出Dom树

  1. <Tabs
  2. activeKey={tabActiveKey}
  3. onChange={(key: string) => this.changeTab(key)}
  4. type="card"
  5. >
  6. <TabPane tab={"对外授权"} key="">
  7. {
  8. this.collectionType === CollectionEnums.AUTHED_TO_GRANT &&
  9. <AuthedCollections
  10. collectionType={this.collectionType}
  11. />
  12. }
  13. </TabPane>
  14. <TabPane tab={"申请权限"} key="/authed-to-me">
  15. {
  16. this.collectionType === CollectionEnums.AUTHED_TO_APPLY &&
  17. <AuthedCollections
  18. collectionType={this.collectionType}
  19. />
  20. }
  21. </TabPane>
  22. </Tabs>

Antd Tabs 当前页面来回切换 表单数据不清空(或者清空)

清空表单的办法是this.props.form.resetFields();

但是本篇文章主要讲解不清空

灵活使用 display:none 就可以避免切换的时候表单数据被setState重新渲染清空掉 (即切换tab项,不清空表单)

查询区域

  1. {/* 查询区域 */}
  2. <div className="search-form-area">
  3. {
  4. <div style={{ display: activeKey === '1' ? 'block' : 'none' }}><SearchFieldForm // 项目角度
  5. ref={(form) => this.ProjSearchForm = form}
  6. submitFuc={this.getProjPage}
  7. fieldsData={projSearchData}
  8. colNum={4}
  9. diyItemLayout={{ labelCol: { span: 4 }, wrapperCol: { span: 17 } }}
  10. // moreSearchData={moreSearchData}
  11. /></div>
  12. }
  13. {
  14. <div style={{ display: activeKey === '2' ? 'block' : 'none' }}>< SearchFieldForm // 产品角度
  15. ref={(form) => this.PrdSearchForm = form}
  16. submitFuc={this.getProjPage}
  17. fieldsData={prdSearchData}
  18. colNum={4}
  19. diyItemLayout={{ labelCol: { span: 4 }, wrapperCol: { span: 17 } }}
  20. /></div>
  21. }
  22. </div>

列表区域

  1.  {/* 列表区域 */}
  2.         <div style={{ height: tableHeight + 100 }} className='myProjTable'>
  3.           <Tabs defaultActiveKey="1" onChange={this.handleTabsChange}>
  4.             <TabPane tab="项目角度" key="1" style={{ backgroundColor: '#fff' }}>
  5.               <CustomTable
  6.                 rowKey='projId'
  7.                 size="small"
  8.                 style={{ height: tableHeight }}
  9.                 columns={columns}
  10.                 tableData={projTableData}
  11.                 expandedRowRender={this.expandedRowRender}
  12.                 pagination={pagination}
  13.                 handleTableChange={this.handleTableChange}
  14.                 scroll={{ y: tableScrollHeight, x: 1660 }}
  15.                 tableRowSelection={this.tableRowSelection}
  16.               />
  17.             </TabPane>
  18.             <TabPane tab="产品角度" key="2" style={{ backgroundColor: '#fff' }}>
  19.               <CustomTable
  20.                 rowKey="projId"
  21.                 size="small"
  22.                 style={{ height: tableHeight }}
  23.                 columns={columnsPrd}
  24.                 tableData={prdTableData}
  25.                 handleTableChange={this.handleTableChange}
  26.                 pagination={pagination}
  27.                 scroll={{ y: tableScrollHeight, x: 1800 }}
  28.                 tableRowSelection={this.tableRowSelection}
  29.               />
  30.             </TabPane>
  31.           </Tabs>
  32.         </div>

到此这篇关于React antd tabs切换造成子组件重复刷新的文章就介绍到这了,更多相关antd tabs重复刷新内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号