文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么在Html5中实现一个react拖拽排序组件

2023-06-09 21:43

关注

今天就跟大家聊聊有关怎么在Html5中实现一个react拖拽排序组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

第一步是先了解H5拖放的相关属性,MDN上有详细的说明,链接为https://developer.mozilla.org/en-US/docs/Web/Events/dragstart

有一点需要注意的是,react.js会给所有的属性事件名称前加上"on",后面则为驼峰式写法。例如原生的click事件,在react.js里应使用onClick事件。

我的组件使用的拖放属性如下:

其中draggable,onDragStart是被“拖拽”方需要设置的属性,onDragOver,onDragEnter,onDragLeave和onDrop是被“拖入”方需要设置的属性。不过对于我的拖拽排序组件,每一个元素都是拖拽和拖入方

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

 value: [                {                    content: 'div1',                    code: '01',                    sort: 0,                },                {                    content: 'div2',                    code: '02',                    sort: 1                },                {                    content: 'div3',                    code: '03',                    sort: 2                },                {                    content: 'div5',                    code: '05',                    sort: 5                },                {                    content: 'div4',                    code: '04',                    sort: 4                }]

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

// 生成拖拽组件    createDraggleComponent(data, sortKey, style, uId) {        return data.sort(this.compare(sortKey)).map((item) => {            return (                <div                    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}</div>            )        })    }    render() {        const { value, sortKey, style } = this.props;        return (            <Row>                <div style={{ display: 'flex', flexDirection: 'row' }}>                    {this.createDraggleComponent(value, sortKey, style)}                </div>            </Row>        )    }

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

// 拖动事件    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中实现一个react拖拽排序组件有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯