最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react?實現(xiàn)表格列表拖拽排序的示例

 更新時間:2023年02月01日 08:25:43   作者:小劉加油!  
本文主要介紹了react?實現(xiàn)表格列表拖拽排序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

問題描述

在項目開發(fā)中,遇到這樣一個需求:需要對表格里面的數(shù)據(jù)進行拖拽排序。

效果圖如下所示:

在這里插入圖片描述

思路

安裝兩個插件:

  • react-sortable-hoc (或者 react-beautiful-dnd)
  • array-move
npm install --save react-sortable-hoc
npm install --save array-move

解析

1. react-sortable-hoc

react-sortable-hoc 是一組 react 高階組件(參數(shù)或返回值為函數(shù)),用于實現(xiàn)拖動排序功能,可以將任何列表轉換為動畫,可訪問和觸摸友好的可排序列表??梢院同F(xiàn)有組件集成,支持拖動手柄、自動滾動、鎖定軸和操作事件等功能,有著流程的動畫效果??伤?、垂直拖動。

react-sortable-hoc 的使用:

react-sortable-hoc 提供了兩個特別重要的API

  • SortableContainer :是所有可拖拽排序元素的容器
  • SortableElement :是每個要拖拽排序元素的容器
  • SortableHandle :是定義拖拽手柄的容器
import { SortableHandle } from 'react-sortable-hoc';
import { MenuOutlined } from '@ant-design/icons';

const DragHandle = SortableHandle(() => <MenuOutlined style={{ cursor: 'grab', color: '#999' }} />)


{
            title: '拖動排序',
            dataIndex: 'sort',
            width: 120,
            align: 'center',
            className: 'drag-visible',
            editable: false,
            render: () =>{
                if (editable) return <DragHandle />;
                return <span>禁止拖動</span>
            },
        },

SortableHandle 就是指下面的箭頭部分

在這里插入圖片描述

SortableElement 提供了一個 index 屬性來進行對每個要拖拽元素的排序

SortableContainer 提供一個方法 onSortEnd,這個方法可以解構兩個形參:{ oldIndex , newIndex },一個是拖拽元素的標記,一個是將要放的地方的標記。

最后在使用 arrayMoveImmutable 交換數(shù)組的位置。

axis 表示拖拽的方向,x 是水平拖拽,y 是垂直拖拽,默認是垂直拖拽

2. array-move

array-move 其實就是一個 API,它的主要作用是用來交換數(shù)組中元素的位置。

看下面的實例:

// 在tsx文件中
import React, { useEffect } from 'react';
import { arrayMoveImmutable } from 'array-move';

const Index = () => {
	useEffect(() => {
		let arr = ['a', 'b', 'c']
		let result = arrayMoveImmutable(arr, 1 , 2)
		console.log(result)
		// 結果輸入為: [ 'a', 'c', 'b' ]
	})
}

export default Index

使用

import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc';
import { arrayMoveImmutable } from 'array-move';

// 定義拖拽的table 容器
const DragTableContainer = SortableContainer((props) => <tbody {...props}>)

// 定義 拖拽的 行
const DragTableItem = SortableElement((props) => <tr {...props}>)

// 定義拖拽手柄
const DragHandle = SortableHandle(() => (
	<MenuOutlined title='拖拽排序' />
))

// 表格排序方法
const onSortEnd = ({oldIndex, newIndex}: {oldIndex: number; newIndex: number }) => {
        if (oldIndex !== newIndex) {
            const newData: any[] = arrayMoveImmutable(([] as any[]).concat(dataSource), oldIndex, newIndex).filter((el: any) => !!el);
            handleAllSave(newData) // 父組件傳過來的方法,用于更新表格第一列的序號
        }
    }

// 所有可拖拽排序元素的容器
// DragTableContainer 是上面通過 SortableContainer 定義的拖拽的table 容器
// useDragHandle  參數(shù),意思是: 使用行把手拖拽行排序
// disableAutoscroll 參數(shù),禁止自動滾動
// helperClass 參數(shù),可修改拖拽樣式
// onSortEnd   `SortableContainer` 提供的一個方法,這個方法可以解構兩個形參:`{ oldIndex ,  newIndex }`,一個是拖拽元素的標記,一個是將要放的地方的標記,用于表格拖拽排序

const DraggableContainer = (props: any) => <DragTableContainer useDragHandle disableAutoscroll helperClass="row-dragging" onSortEnd={onSortEnd} {...props}/>


// 定義 拖拽的 行

// DraggableBodyRow  返回的是由 SortableItem  包裹的每一行元素

const DraggableBodyRow = ({ className, style, ...restProps}: any) => {
    const index = dataSource.findIndex((x: any) => x.orderNum === restProps['data-row-key']);
    return (<SortableItem index={index} {...restProps} />)
}


// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------

// 封裝的子組件
const EditableTable = (props: any) => {
    let { title = '', subtitle = '',  columns, rowClassName = () => 'editable-row', dataSource, handleSave, handleAllSave,  rowKey, placeholder,  clickRow, loading = false, scroll } = props;
    const styles = {
        tabletitle: { fontWeight: 800, color: '#0095ff', fontSize: '16px' },
        subtitle: { color: '#000000', fontSize: '12px' },
    };

    columns = columns.map((col: any) => {
        if (!col.editable) {
            return col;
        }
        return {
            ...col,
            onCell: (record: any) => ({
                record,
                isRowDisable: col.isRowDisable,
                isNumber: col.isNumber,
                editable: col.editable,
                editdisable: col.editdisable,
                dataIndex: col.dataIndex,
                title: col.title,
                handleSave: handleSave,
                formRules: col.rules,
                placeholder: col?.placeholder,
                precision: col?.precision,
                min: col?.min,
                step: col?.step,
                max: col?.max,
                formatter: col?.formatter,
                parser: col?.parser,
            }),
        };
    });
    /**
     * 表格行屬性
     * @param record 表格每行的數(shù)據(jù)
     * @returns
     */
    const onRow = (record: any) => {
        return {
            onClick: clickRow ? () => clickRow(record) : undefined,
        }
    }

    const onSortEnd = ({oldIndex, newIndex}: {oldIndex: number; newIndex: number }) => {
        if (oldIndex !== newIndex) {
            const newData: any[] = arrayMoveImmutable(([] as any[]).concat(dataSource), oldIndex, newIndex).filter((el: any) => !!el);
            handleAllSave(newData)
        }
    }

    const DraggableContainer = (props: any) => <SortableBody useDragHandle disableAutoscroll helperClass="row-dragging" onSortEnd={onSortEnd} {...props}/>

    const DraggableBodyRow = ({ className, style, ...restProps}: any) => {
        const index = dataSource.findIndex((x: any) => x.orderNum === restProps['data-row-key']);
        return (<SortableItem index={index} {...restProps} />)
    }

    return (
        <Fragment>
            <div style={{ display: 'flex', marginBottom: '6px' }}>
                <Table
                    className="wrap"
                    style={{ width: '100%' }}
                    locale={{ emptyText: '暫無數(shù)據(jù)' }}
                    components={{
                        body: {
                            wrapper: DraggableContainer,
                            row: DraggableBodyRow,
                            // cell: EditableCell
                        }
                    }}
                    rowClassName={rowClassName}
                    bordered
                    dataSource={dataSource}
                    columns={columns}
                    pagination={false}
                    rowKey='orderNum'
                    scroll={scroll || { y: 500 }}
                    onRow={onRow}
                    loading={loading}
                />
            </div>
        </Fragment>
    );
};

export default memo(EditableTable);

到此這篇關于react 實現(xiàn)表格列表拖拽排序的示例的文章就介紹到這了,更多相關react 表格列表拖拽排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • React星星評分組件的實現(xiàn)

    React星星評分組件的實現(xiàn)

    評分插件在購物的應用中經(jīng)??梢钥吹玫?,但是用著別人的總是沒有自己寫的順手,本文就使用React實現(xiàn)星星評分組件,感興趣的可以了解一下
    2021-06-06
  • React RenderProps模式運用過程淺析

    React RenderProps模式運用過程淺析

    render props是指一種在 React 組件之間使用一個值為函數(shù)的 prop 共享代碼的技術。簡單來說,給一個組件傳入一個prop,這個props是一個函數(shù),函數(shù)的作用是用來告訴這個組件需要渲染什么內(nèi)容,那么這個prop就成為render prop
    2023-03-03
  • 通過實例學習React中事件節(jié)流防抖

    通過實例學習React中事件節(jié)流防抖

    這篇文章主要介紹了通過實例學習React中事件節(jié)流防抖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • React+EggJs實現(xiàn)斷點續(xù)傳的示例代碼

    React+EggJs實現(xiàn)斷點續(xù)傳的示例代碼

    這篇文章主要介紹了React+EggJs實現(xiàn)斷點續(xù)傳的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • React淺析Fragments使用方法

    React淺析Fragments使用方法

    這篇文章主要介紹了React Fragments使用方法,關于react Fragments,React中一個常見模式是為一個組件返回多個元素。Fragments 可以讓你聚合一個子元素列表,并且不在DOM中增加額外節(jié)點
    2022-12-12
  • React應用框架Dva數(shù)據(jù)流向原理總結分析

    React應用框架Dva數(shù)據(jù)流向原理總結分析

    這篇文章主要為大家介紹了React 應用框架Dva數(shù)據(jù)流向原理總結分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • react-redux多個組件數(shù)據(jù)共享的方法

    react-redux多個組件數(shù)據(jù)共享的方法

    這篇文章主要介紹了react-redux多個組件數(shù)據(jù)共享的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 使用Webpack打包React項目的流程步驟

    使用Webpack打包React項目的流程步驟

    隨著React應用日益復雜,開發(fā)者需要借助模塊打包工具來管理項目依賴、轉換代碼和優(yōu)化性能,Webpack是一款功能強大的模塊打包器,它可以將React項目中的JavaScript、CSS、圖片等資源打包成瀏覽器友好的文件,本文將全面介紹如何使用Webpack打包React項目
    2025-03-03
  • 30行代碼實現(xiàn)React雙向綁定hook的示例代碼

    30行代碼實現(xiàn)React雙向綁定hook的示例代碼

    本文主要介紹了30行代碼實現(xiàn)React雙向綁定hook的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • React?中的?JS?報錯及容錯方案

    React?中的?JS?報錯及容錯方案

    這篇文章主要為大家介紹了React?中的?JS?報錯及容錯方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論

安化县| 吴忠市| 图木舒克市| 濮阳县| 元阳县| 闽侯县| 弥勒县| 沅江市| 万宁市| 尉氏县| 阿克陶县| 宣武区| 余庆县| 乐昌市| 祥云县| 孟州市| 沾益县| 平定县| 乐都县| 德庆县| 鸡西市| 嘉定区| 那坡县| 伊通| 兴和县| 庄浪县| 大同县| 绍兴市| 洛隆县| 嘉善县| 江华| 红原县| 潜江市| 沾益县| 开平市| 赫章县| 滨海县| 汉寿县| 苏州市| 岳阳县| 武威市|