react使用useRef实现h5表头和列表内容同步左右滑动

众所周知,移动端的页面左右空间有限,但是又要显示宽度很宽的表格列表怎么办,第一想到的必然是左右滚动,但是问题来了,要怎么实现表头和列表内容同步滚动呢?

废话不多说,先上效果图(滑动表头,列表内容跟着滑动,相反也是):

下面是具体实现过程:

1、首先就是画好表格头和表格内容(效果如下图):
(1)如果要实现上图的固定第一列的效果,表头和内容都要左右布局,也就是表头第一个是一个div,后面的是一个div,后面的div实现滚动。
(2)列表内容也是一样,要做好左右布局,也就是左边一列和右边其他的内容分开div,然后在各自的div里实现遍历列表(也就是左右个遍历一次),同时右侧div实现滚动。

下面是布局表头的实现代码(表内容类似,不要忘了右侧的div要加上滚动哦):

{/* 表格标题 */}
        <div className="rl_header">
          {/* 左侧 */}
          <div
            className={cls('list_title_left', showLeftBorder ? 'border_shadow' : '')}
          >
            <div className={'rl_col'}>
              {headerList[0].value}
            </div>
          </div>
          {/* 右侧 */}
          <div
            className="list_title_right"
            ref={tabsRef}
            onScrollCapture={() => {
              handleTabesRoll();
            }}
          >
            {
              headerList.slice(1).map((item, index) => {
                return (
                  <div
                    key={index}
                    className={'rl_col'}
                  >
                    {item.value}
                  </div>
                );
              })
            }
          </div>
        </div>
2、如果只想联动滚动,那可以省略第一步,直接画好上下两个滚动div就行,下面是增加联动的方法:
(1)首先引入两个ref
const tabsRef = useRef();
const listRef = useRef();
(2)将ref分别加到表头滚动div,和表内容滚动div上,且分别加上onScrollCapture滚动时方法

(3)最后分别实现这两个方法,方法的关键内容就是各自ref的scrollLeft对齐,另外我还在滚动的时候加上了阴影的效果,具体代码如下:
const handleListRoll = () => {
    tabsRef.current.scrollLeft = listRef.current.scrollLeft;
    if (listRef.current.scrollLeft > 2) {
      setShowLeftBorder(true);
      if (listLeftRef.current.className.indexOf('border_shadow') === -1) {
        listLeftRef.current.className = `${listLeftRef.current.className} border_shadow`;
      }
    } else {
      setShowLeftBorder(false);
      listLeftRef.current.className = listLeftRef.current.className.replace(
        ' border_shadow',
        ''
      );
    }
  };

const handleTabesRoll = () => {
    listRef.current.scrollLeft = tabsRef.current.scrollLeft;
};

好了,关键的功能都实现了,下面只要优化界面间距和css效果就能愉快的玩耍了~~~~~~~

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用React实现简单管理列表的示例代码,其中包括内容表格展示、删除和修改功能: 首先,创建一个ManagementList组件: ```javascript import React, { useState } from 'react'; const ManagementList = () => { const [items, setItems] = useState([]); const [newItem, setNewItem] = useState(''); const [editingIndex, setEditingIndex] = useState(-1); const [editedItem, setEditedItem] = useState(''); const handleSubmit = (e) => { e.preventDefault(); if (editingIndex === -1) { setItems([...items, newItem]); } else { const updatedItems = [...items]; updatedItems[editingIndex] = editedItem; setItems(updatedItems); setEditingIndex(-1); setEditedItem(''); } setNewItem(''); }; const handleDelete = (index) => { const updatedItems = [...items]; updatedItems.splice(index, 1); setItems(updatedItems); }; const handleEdit = (index) => { setEditingIndex(index); setEditedItem(items[index]); }; return ( <div> <h2>管理列表</h2> <table> <thead> <tr> <th>ID</th> <th>内容</th> <th>操作</th> </tr> </thead> <tbody> {items.map((item, index) => ( <tr key={index}> <td>{index + 1}</td> <td>{item}</td> <td> <button onClick={() => handleDelete(index)}>删除</button> <button onClick={() => handleEdit(index)}>修改</button> </td> </tr> ))} </tbody> </table> <form onSubmit={handleSubmit}> <input type="text" value={editingIndex === -1 ? newItem : editedItem} onChange={(e) => { if (editingIndex === -1) { setNewItem(e.target.value); } else { setEditedItem(e.target.value); } }} /> <button type="submit"> {editingIndex === -1 ? '添加' : '保存'} </button> </form> </div> ); }; export default ManagementList; ``` 然后,在你的主组件中使用ManagementList组件: ```javascript import React from 'react'; import ManagementList from './ManagementList'; const App = () => { return ( <div> <h1>简单管理列表</h1> <ManagementList /> </div> ); }; export default App; ``` 这样,你就可以在App组件中渲染ManagementList组件,并且可以在表格中展示内容、删除和修改列表项。 请注意,这只是一个简单的示例,没有使用任何数据持久化或复杂的状态管理。在实际的应用中,你可能需要使用更高级的状态管理库,如Redux或Mobx,并且与后端API交互来实现完整的管理列表功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值