使用h5实现react拖拽排序组件的方法(附代码)


当前第2页 返回上一页

第二步,既然“她"是react.js的组件, 按照习惯,简单的将输入属性定为为value,同时,暴露onChange事件监听value的变化,并将其暴露给父组件,同时,暴露一个属性sortKey告诉组件使用哪个key作为排序字段。
既然涉及到排序,同时允许指定组件每个元素的内部子组件,我将输入数据格式定义为一个数组对象,其中content可以为reactNode:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

value: [

               {

                   content: 'p1',

                   code: '01',

                   sort: 0,

               },

               {

                   content: 'p2',

                   code: '02',

                   sort: 1

               },

               {

                   content: 'p3',

                   code: '03',

                   sort: 2

               },

               {

                   content: 'p5',

                   code: '05',

                   sort: 5

               },

               {

                   content: 'p4',

                   code: '04',

                   sort: 4

               }]

根据value我去生成可排序组件的每个node,关键代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

// 生成拖拽组件

createDraggleComponent(data, sortKey, style, uId) {

    return data.sort(this.compare(sortKey)).map((item) => {

        return (

            <p

                className={styles.content}

                key={item.code}

                draggable={true}

                onDragEnter={this.dragenter.bind(this)}

                onDragLeave={this.dragleave.bind(this)}

                onDragStart={this.domdrugstart.bind(this, item[sortKey], item.code, uId, item)}

                onDrop={this.drop.bind(this, item[sortKey], data, sortKey, uId)}

                onDragOver={this.allowDrop.bind(this)}

                style={{ ...style }}>{item.content}</p>

        )

    })

}

render() {

    const { value, sortKey, style } = this.props;

    return (

        <Row>

            <p style={{ display: 'flex', flexDirection: 'row' }}>

                {this.createDraggleComponent(value, sortKey, style)}

            </p>

        </Row>

    )

}

其中的属性方法具体实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

// 拖动事件

domdrugstart(sort, code, ee) {

    ee.dataTransfer.setData("code", code);

    ee.dataTransfer.setData("sort", sort);

}

// 拖动后鼠标进入另一个可接受区域

dragenter(ee) {

    ee.target.style.border = '2px dashed #008dff';

    ee.target.style.boxShadow = '0 0 8px rgba(30, 144, 255, 0.8)';

}

// a拖到b,离开b的时候触发

dragleave(ee) {

    ee.target.style.border = '1px solid grey';

    ee.target.style.boxShadow = '';

}

// 对象排序

compare(key) {

    return (obj1, obj2) => {

        if (obj1[key] < obj2[key]) {

            return -1;

        } else if (obj1[key] > obj2[key]) {

            return 1;

        }

        return 0

    }

}

// 当一个元素或是选中的文字被拖拽释放到一个有效的释放目标位置时

drop(dropedSort, data, sortKey, ee) {

    ee.preventDefault();

    const code = ee.dataTransfer.getData("code");

    const sort = ee.dataTransfer.getData("sort");

    if (sort < dropedSort) {

        data.map(item => {

            if (item.code === code) {

                item[sortKey] = dropedSort;

            } else if (item[sortKey] > sort && item[sortKey] < dropedSort + 1) {

                item[sortKey]--;

            }

            return item;

        });

    } else {

        data.map(item => {

            if (item.code === code) {

                item[sortKey] = dropedSort;

            } else if (item[sortKey] > dropedSort - 1 && item[sortKey] < sort) {

                item[sortKey]++;

            }

            return item;

        });

    }

    this.props.onChange(data)

}

allowDrop(ee) {

    ee.preventDefault();

}

值得注意的点其实只有一个,我控制顺序的时候,并没有使用.target.before(document.getElementById({id}))去实际操控节点,而是在每次触发onDrop时间的时候,处理数据的sort,并通过onChange事件暴露给父组件,将数据输出,通过改变value值触发虚拟dom重新去渲染,以此控制顺序。

根据公司的要求,在此基础上,我还实现了拖拽复制的功能。

相关推荐:

HTML5新增属性:classList属性的使用方法

HTML5如何解决margin-top的塌陷问题(附代码)

HTML5中标签和常用规则有哪些?html5标签以及规则的介绍

以上就是使用h5实现react拖拽排序组件的方法(附代码)的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

如何获取微信小程序登录的session?(详细)

怎样用h5的webgl实现3d虚拟机房的漫游动画

html5画布如何设置字体颜色?(代码示例)

javascript多线程如何实现

javascript中的闭包中的闭包

分享几款炫酷的html5实现的图片特效

javascript中方法和函数是什么

javascript怎么隐藏herf

html5 canvas中绘制字体与图片以及图形模糊问题解决

javascript有哪些基本数据类型

更多相关阅读请进入《react.js》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...