当前位置: 首页 > news >正文

Steps + Input.TextArea + InfiniteScroll 联调优化

<Modaltitle="人才特征模型"open={modalOpen}centeredonCancel={() => { setModalOpen(false); setEditingItemId(null); }}footer={null}width={800}maskClosable={false}classNames={{header: styles.modalHeader,content: styles.modal,}}>{modalInitialLoading ? (<div className={styles.initialLoading}>加载中...</div>) : (modelDesc.length === 0 ? (<div className={styles.emptyTip}>暂无人才特征模型数据</div>) : (<div id="scrollContainer" style={{ height: 700, overflow: 'auto',padding: '0 10px', }}><InfiniteScrolldataLength={modelDesc.length}next={loadMore}hasMore={hasMore}loader={<div className={styles.loading}>加载中...</div>}endMessage={<div style={{ textAlign: 'center', padding: 16 }}>已加载全部数据</div>}scrollableTarget="scrollContainer"><Stepsdirection="vertical"className={styles.steps}progressDotstyle={{ width: '100%' }}>{modelDesc.map((item, index) => (<Steps.Stepkey={index}status='finish'title={<Flex justify="space-between" align="center" className={styles.infoBar}><div style={{ width: 500 }}><Flex gap={20} align="center"><span className={styles.infoItem} style={{ width: '45%' }}><imgsrc="https://xingge-ai.oss-cn-shenzhen.aliyuncs.com/fusi/Users Group Two Rounded.png"style={{ marginRight: 4, verticalAlign: 'middle', marginTop: -2 }}alt="" width={18} height={18}/>候选人:{item.applyName || 'null'}</span><span className={styles.infoItem} style={{ width: '65%' }}><imgsrc="https://xingge-ai.oss-cn-shenzhen.aliyuncs.com/fusi/Clock Circle.png"style={{ marginRight: 4, verticalAlign: 'middle', marginTop: -2 }}alt="" width={18} height={18}/>更新时间:{item.updateTime || 'null'}</span></Flex></div><div style={{ width: '30%', textAlign: 'right' }}>{editingItemId === item.id ? (<><Buttonsize="small"type="text"style={{ color: '#0057FF', fontSize: 16, fontWeight: 500 }}onClick={() => saveEdit(item)}loading={modalLoading}>保存</Button><Buttonsize="small"type="text"style={{ fontSize: 16, fontWeight: 500 }}onClick={() => cancelEdit(item.id)}>取消</Button></>) : (<Buttonicon={<EditOutlined style={{ color: '#0057FF' }} />}size="small"type="text"style={{ color: '#0057FF', fontSize: 16, fontWeight: 500 }}onClick={() => startEdit(item)}>编辑</Button>)}</div></Flex>}description={<div className={styles.timelineContentWrapper}>{editingItemId === item.id ? (<Input.TextAreavalue={editContents[item.id] || ''}onChange={(e) =>setEditContents((prev) => ({...prev,[item.id]: e.target.value,}))}autoSize={{ minRows: 10, maxRows: 10 }}/>) : (<divclassName={styles.viewModeContainer}dangerouslySetInnerHTML={{ __html: md.render(item.modelContent || '')}}/>)}</div>}/>))}</Steps></InfiniteScroll></div>))}</Modal >

主要优化点:

  • 利用 InfiniteScroll 实现滚动加载
  • modalInitialLoading 添加内容加载显示

import InfiniteScroll from 'react-infinite-scroll-component';const [modalOpen, setModalOpen] = useState(false); // 模型弹窗const [modelDesc, setModelDesc] = useState([]); // 模型描述const [currentPage, setCurrentPage] = useState(1);const [pageSize, setPageSize] = useState(5);const [modalLoading, setModalLoading] = useState(false);const [editingItemId, setEditingItemId] = useState(null);const [editContents, setEditContents] = useState({});const [hasMore, setHasMore] = useState(true); // 是否还有更多数据const [modalInitialLoading, setModalInitialLoading] = useState(false);
// 处理模型弹窗const handleModal = async (item) => {setModalOpen(true);setModalInitialLoading(true);setCurrentPage(1);setModelDesc([]);setHasMore(true);setJobId(item.id);try {const res = await getPersonalityModel({jobId: item.id,pageNum: 1,pageSize: pageSize,});if (res.code === 200) {setModelDesc(res.rows || '');setTotal(res.total || 0);setHasMore((res.rows || []).length < (res.total || 0));} else {message.warning('当前职位不存在人才特征模型');setModalOpen(false);}} catch (error) {console.log(error);} finally {setModalInitialLoading(false);}}const loadMore = async () => {try {const nextPage = currentPage + 1;const res = await getPersonalityModel({jobId: jobId,pageNum: nextPage,pageSize: pageSize,});if (res.code === 200) {const newData = res.rows || [];setModelDesc(prev => [...prev, ...newData]);setCurrentPage(nextPage);setHasMore([...modelDesc, ...newData].length < total);} else {message.warning('没有更多数据了');}} catch (error) {console.log('加载更多失败:', error);}};const startEdit = (item) => {setEditingItemId(item.id);setEditContents((prev) => ({...prev,[item.id]: item.modelContent,}));};const cancelEdit = (itemId) => {setEditingItemId(null);setEditContents((prev) => {const newState = { ...prev };delete newState[itemId];return newState;});};const saveEdit = async (item) => {setModalLoading(true);try {const res = await saveFeatureModel({id: item.id,modelContent: editContents[item.id] || ''});if (res.code === 200) {message.success('保存成功');} else {message.warning('保存失败');}const updatedData = modelDesc.map((modelItem) => {if (modelItem.id === item.id) {return { ...modelItem, modelContent: editContents[item.id] || '' };}return modelItem;});setModelDesc(updatedData);setEditingItemId(null);} catch (error) {console.log(error);message.error('保存失败');} finally {setModalLoading(false);}};
.modal {background-image: url('https://xingge-ai.oss-cn-shenzhen.aliyuncs.com/fusi/image 28.png');background-size: 500px 350px;background-repeat: no-repeat;background-position: right top;height: 800px;
}.initialLoading {text-align: center;padding: 45% 0;font-size: 16px;color: #666;
}.listItem {padding: 0 !important;border: none !important;
}.emptyTip {color: #333;font-size: 16px;font-weight: 500;text-align: center;margin-top: 45%;
}.timelineItem {display: flex;margin-bottom: 30px;position: relative;
}.steps {margin-right: 10px;:global(.ant-steps-item-title) {color: #000000 !important;padding: 0;width: 700px;}
}.timelineContentWrapper {margin-top: 10px;flex: 1;
}.infoBar {width: 100%;flex-wrap: nowrap;overflow: hidden;.infoItem {color: #767676;font-size: 16px;height: 30px;font-weight: 500;}
}.viewModeContainer {min-height: 200px;padding: 6px 12px;border: 1px solid #d9d9d9;border-radius: 4px;word-break: break-all;
}.loading {text-align: center;padding: 20px 0;
}

http://www.dtcms.com/a/511998.html

相关文章:

  • /dev/mem 原理及使用
  • 机关网站建设 方案泰安新闻完整版
  • Endpoint
  • 阿里巴巴双11微服务智能监控体系:从全链路追踪到AI自愈的技术实践
  • 在ros2 humble版本上安装D455相机并获取图像和深度信息
  • C++DirectX9坐标系与基本图元之渲染状态(RenderState)_0304
  • 网站建设app长春seo技术
  • 【C++】力扣hot100错误总结
  • C++中的vector讲解
  • 笔记【字符串,转义字符,注释】
  • visual studio安装本地帮助手册
  • 北京市基础建设质量监督局网站wordpress 插件怎么看
  • 大模型技术分析与演进逻辑
  • 苏州模板网站建站长沙网站建设推广
  • 从零起步学习MySQL || 第六章:MySQL数据库中的一条数据是如何存储的?(结合源码深度解析)
  • 微信小程序页面配置,基本语法,页面切换,tabbar全局配置
  • 数据结构 07
  • 18.基本的ACL
  • 网站后台编程语言创业中文网站模板
  • 从“刘易斯拐点”到“骑手拐点”,即时零售3.0时代还有多远?
  • 有没有一种app类似网站建设开发定制软件开发
  • 沈阳网站建设建设公司普洱网站建设
  • 蓝桥杯题库——部分简单题题解(Java)
  • 新民电商网站建设程序wordpress淘宝发货插件
  • 多服务隔离部署jenkins自动化脚本:从构建到上线的全流程保障
  • React JSX完全指南
  • CSS进阶 | 不用一行JS!用纯CSS打造会动的现代化单页应用(3D翻转卡片)
  • 云栖重磅|瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
  • LeetCode 410.分割数组的最大值
  • python批量读取word表格写入excel固定位置