antd 下拉框不跟随滚轮滚动

下拉框 默认是相对于 body 定位,用 getPopupContainer 设置相对于父级定位

private getPopupContainer() {
    return (triggerNode: any) => triggerNode.parentNode;
  }

:getPopupContainer="getPopupContainer()"

或者

:getPopupContainer="(triggerNode: any) => triggerNode.parentNode"

### 实现 Ant Design 下拉框中的拖拽排序功能 为了实现在 Ant Design 的 `Select` 组件中支持选项的拖拽排序,可以借助第三方库如 `react-sortable-hoc` 或者使用原生 HTML5 Drag and Drop API 结合 React Hooks 来完成这一需求。下面提供一种基于自定义 Hook 和内置 DnD API 的解决方案[^1]。 #### 解决方案概述 通过监听鼠标事件来捕获用户的拖动行为,并更新状态以反映新的顺序。这涉及到修改 Select 组件内部的状态管理逻辑以及渲染机制。 #### 关键技术点 - 利用 `useState()` 钩子保存当前选项目录及其顺序。 - 自定义钩子函数用于处理拖放交互过程中的各种事件(如 dragstart,dragover,drop 等)。 - 修改默认样式以便更好地指示可拖动物品的位置变化。 #### 示例代码实现 ```jsx import React, { useState } from 'react'; import { Select } from 'antd'; const DraggableSelect = () => { const [options, setOptions] = useState([ { value: 'apple', label: 'Apple' }, { value: 'banana', label: 'Banana' }, { value: 'orange', label: 'Orange' } ]); function handleDragStart(e, index) { e.dataTransfer.setData('text/plain', null); e.currentTarget.style.opacity = '0.4'; // 可视化反馈给用户正在被拖拽的对象 this.draggedIndex = index; } function handleDrop(e, newIndex) { let updatedItems = [...options]; if (this.draggedIndex !== undefined && newIndex !== this.draggedIndex) { const itemToMove = updatedItems.splice(this.draggedIndex, 1)[0]; updatedItems.splice(newIndex, 0, itemToMove); setOptions(updatedItems); // 更新 state 中存储的数据源 } e.preventDefault(); delete this.draggedIndex; // 清除临时变量 } return ( <> <div style={{ border: "solid 1px", padding: "8px" }}> <p>Drag items to reorder:</p> <ul onDrop={(e) => handleDrop.call({}, e)} onDragOver={e => e.preventDefault()}> {options.map((option, idx) => <li key={idx} draggable="true" onDragStart={(event) => handleDragStart(event, idx)} style={{ cursor: "move", marginBottom: "4px", backgroundColor: "#f9f9f9", padding: "6px" }} > {option.label} </li>)} </ul> </div> {/* 展示最终效果 */} <h3>Select Options Order</h3> <Select defaultValue={['apple']} mode="multiple"> {options.map(option => (<Select.Option key={option.value} value={option.value}>{option.label}</Select.Option>))} </Select> </> ); }; export default DraggableSelect; ``` 此段代码展示了如何创建一个带有拖拽排序能力的选择器组件,在实际应用开发过程中可以根据具体业务场景调整细节部分,比如增加动画过渡效果使用户体验更佳等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值