Drag and drop sort control for react-native
yarn add react-native-drag-sort
or
npm i react-native-drag-sort --save
export { DragSortableView, AutoDragSortableView }
- Android版演示地址
- 必须要写属性 keyExtractor={(item,index)=> item.id} id为你数据的唯一识别,没有可用index代替item.id。
- Android Debug模式比较卡的话。请打包再安装测试,release是不会卡的。或者iOS下测试动画是很流畅。
React16.3后使用Fiber, React渲染变成了异步渲染,具体请Google React Fiber.
- React < 16.3 请引用 [email protected]
- React > 16.3 请引用react-native-drag-sort@latest
如果你不需要自动滑动功能可以使用或者对Android效果不满意可以暂时使用DragSortableView(稳定、可靠、较长时间没人提issus Bug了),如果你想要使用自动滑动请使用AutoDragSortableView。
自动滑动功能完成。iOS实现平滑的自动滑动功能。Android实现固定时间滑动1个Item。由于Android调用scrollTo后刷新比较缓慢,造成抖动,所以使用固定时间滑动1个Item,这个折中的方法。也可以通过参数: autoThrottle(单位时间滑动距离)、autoThrottleDuration(定时滑动一个距离的时间)。
- 建议使用Demo设置: Android自动滑动时每400ms滑动一个Item高度, iOS自动滑动时每10ms滑动2。
- 如果想实现Android和iOS一样的效果可以配置autoThrottle={2}、autoThrottleDuration={10}
- 后期有时间会优化: 触发滑动条件优化、Android滑动时抖动优化。
根据网友需求添加一个新的场景。
- 添加属性(isDragFreely): 是否限制拖动空间。
- 添加属性移动时回调函数(onDragging)
- 添加演示Demo: DragDeletePage
1.x版本结束,该优化的都优化,而且出现的问题都已经解决。接下来将编写2.x版本,预计添加自动兼容ScrollView滑动、滑动删除功能等。
- 修复一个小问题。
- 添加一个熟悉keyExtractor:(item,index) => key 实现性能优化,类似FlatList的keyExtractor,当删除Item时不会再闪烁(重绘)。
- 添加delayLongPress属性:按下到触发的时间,自定义长按多久出发
新增顶部固定功能,可以设置开始连续几个为不可拖动功能,类似今日头条一样,该功能和今日头条拖拽一样,可以去对比一下。
新增单行拖拽演示,其实这个功能一致,这个拖拽插件本来就是自适应行,有时间会整体优化下ScrollView问题,使控件自带ScrollView功能。
优化拖拽不移动时自动恢复,现在这个插件应该没有任何问题。新加一个实战演示例子,后面有时间会对这个例子进行加动画,删除时item向下到待选的item动画,和待选到item。还有滑动时自动向下滑动动画。
<DragSortableView
dataSource={this.state.data}
parentWidth={parentWidth}
childrenWidth= {childrenWidth}
childrenHeight={childrenHeight}
marginChildrenTop={marginChildrenTop}
onDataChange = {(data)=>{
// delete or add data to refresh
if (data.length != this.state.data.length) {
this.setState({
data: data
})
}
}}
keyExtractor={(item,index)=> item.id}
onClickItem={(data,item,index)=>{}}
renderItem={(item,index)=>{
return this.renderItem(item,index)
}}/>
isRequired if there is a * in the name field
name | Proptypes | Description |
---|---|---|
dataSource * | array | |
parentWidth | number | parent width |
childrenHeight * | number | Each item height |
childrenWidth * | number | Each item width |
marginChildrenTop | number | So the item's outermost view adds margin, you can only use this method. |
marginChildrenBottom | number | |
marginChildrenLeft | number | |
marginChildrenRight | number | |
sortable | bool | Do not allow dragging |
onClickItem | func | click |
onDragStart | func | |
onDragEnd | func | |
onDataChange | func | This method is called every time the data changes. |
renderItem * | func | render item view |
fixedItems | array | no remove |
keyExtractor | func | (item,index) => key |
delayLongPress | number | |
isDragFreely | bool | Whether to limit the drag space |
onDragging | func | |
maxScale | number | |
minOpacity | number | |
scaleDuration | number | |
slideDuration | number | |
autoThrottle | number | |
autoThrottleDuration | number |