diff --git a/1224/react-native-drag-sort.md b/1224/react-native-drag-sort.md
index 21e2593adcfcf7ecd36e446cd52c1e3ee72e1926..e65a55c87aa9e681bf25019cc4909f5dd5c35725 100644
--- a/1224/react-native-drag-sort.md
+++ b/1224/react-native-drag-sort.md
@@ -5,21 +5,28 @@
-
+
-
-
+
+
+
+
+
> [!tip] [Github 地址](https://github.com/mochixuan/react-native-drag-sort)
## 安装与使用
进入到工程目录并输入以下命令:
-
+#### **yarn**
+
+```bash
+yarn add react-native-drag-sort@2.4.4
+```
#### **npm**
@@ -27,21 +34,23 @@
npm i react-native-drag-sort@2.4.4
```
-#### **yarn**
+### Tip
-```bash
-yarn add react-native-drag-sort@2.4.4
-```
+> Use priority: DragSortableView > AutoDragSortableView > AnySizeDragSortableView
-
+- 1、If the width and height are fixed and there is no need to slide, use DragSortableView.
+- 2、If the width and height are fixed and you need to slide, use AutoDragSortableView.
+- 3、If the width and height are arbitrary and need to slide, please use AnySizeDragSortableView.
下面的代码展示了这个库的基本使用场景:
+##### DragSortableView组件使用
+
```js
import React, { useState } from "react";
-import { View, Text, StyleSheet, SafeAreaView } from "react-native";
-import { DragSortableView } from "react-native-drag-sort";
-
+import { View, Text, StyleSheet, SafeAreaView } from 'react-native';
+import { DragSortableView } from 'react-native-drag-sort';
+//此案例id1、id2不支持拖拽
const Dragsort = () => {
const [data, setData] = useState([
{
@@ -81,7 +90,7 @@ const Dragsort = () => {
return (
- DragSortableView
+ DragSortableView
{
onClickItem={(data, item, index) => {
console.log("点击了第", index, "个元素");
}}
- onDragStart={() => console.log("Drag started")}
- onDragEnd={() => console.log("Drag end")}
+ onDragStart={() => console.log('Drag started')}
+ onDragEnd={() => console.log('Drag end')}
onDataChange={() => {
console.log("数据发生变化");
}}
@@ -109,12 +118,16 @@ const Dragsort = () => {
minOpacity={0.7}
renderItem={(item, index) => {
return (
-
+
{item.title}
);
}}
sortable={true}
+
/>
);
@@ -128,44 +141,405 @@ const styles = StyleSheet.create({
alignContent: "center",
borderRadius: 5,
margin: 20,
- backgroundColor: "#4e71f2",
+ backgroundColor: '#4e71f2',
height: 50,
width: 100,
},
text: {
fontSize: 18,
- color: "#fff",
- textAlign: "center",
+ color: '#fff',
+ textAlign: 'center'
},
header: {
height: 48,
- justifyContent: "center",
- alignItems: "center",
- borderBottomColor: "#2ecc71",
+ justifyContent: 'center',
+ alignItems: 'center',
+ borderBottomColor: '#2ecc71',
borderBottomWidth: 2,
},
header_title: {
- color: "#333",
+ color: '#333',
fontSize: 24,
- fontWeight: "bold",
+ fontWeight: 'bold',
+ }
+})
+export default Dragsort;
+```
+
+##### AutoDragSortableView组件使用
+
+```js
+//此案例Item1、Item2不支持拖拽
+import React, { useState } from "react";
+import { View, Text } from 'react-native';
+import { AutoDragSortableView } from "react-native-drag-sort";
+
+const AutoDragSortDemo = () => {
+ const [data, setData] = useState([
+ { id: '1', text: 'Item 1' },
+ { id: '2', text: 'Item 2' },
+ { id: '3', text: 'Item 3' },
+ { id: '4', text: 'Item 4' },
+ { id: '5', text: 'Item 5' },
+ { id: '6', text: 'Item 6' },
+ { id: '7', text: 'Item 7' },
+ { id: '8', text: 'Item 8' },
+ { id: '9', text: 'Item 9' },
+ { id: '10', text: 'Item 10' },
+ { id: '11', text: 'Item 11' },
+ { id: '12', text: 'Item 12' },
+ { id: '13', text: 'Item 13' },
+ { id: '14', text: 'Item 14' },
+ { id: '15', text: 'Item 15' },
+ { id: '16', text: 'Item 16' },
+ { id: '17', text: 'Item 17' },
+ { id: '18', text: 'Item 18' },
+ { id: '19', text: 'Item 19' },
+ { id: '20', text: 'Item 20' },
+ { id: '21', text: 'Item 21' },
+ { id: '22', text: 'Item 22' },
+ { id: '23', text: 'Item 23' },
+ { id: '24', text: 'Item 24' },
+ { id: '25', text: 'Item 25' },
+ { id: '26', text: 'Item 26' },
+ { id: '27', text: 'Item 27' },
+ { id: '28', text: 'Item 28' },
+ ]);
+ const renderHeaderView=(
+
+ 标题
+
+ )
+ const renderBottomView=(
+
+ 底部
+
+ )
+
+ return (
+ {
+ console.log("数据发生变化");
+ }}
+ keyExtractor={(item, index) => item.id}
+ onClickItem={(data, item, index) => {
+ console.log("点击了第", index, "个元素");
+ }}
+ renderItem={(item, index) => {
+ return (
+
+ {item.text}
+
+ );
+ }}
+ scaleDuration={500} //拖拽项缩放效果的持续时间
+ slideDuration={200} //拖拽项滑动效果的持续时间
+ autoThrottle={100} //自动滑动到目的地的间隔时间
+ autoThrottleDuration={500} //自动滑动到目的地的持续时间
+ sortable={true}
+ isDragFreely={false}
+ fixedItems={[0, 1]}
+ delayLongPress={100}
+ onDragStart={() => console.log('Drag started')}
+ onDragEnd={() => console.log('Drag end')}
+ renderHeaderView={renderHeaderView}
+ headerViewHeight={50}
+ scrollIndicatorInsets={{ top: 0, left: 0, bottom: 0, right: 0 }}
+ renderBottomView={renderBottomView}
+ bottomViewHeight={50}
+ onScrollListener={(event) => {
+ console.log("滚动事件", event);
+ }}
+ onScrollRef={(ref) => {
+ console.log("滚动容器", ref);
+ }}
+ />
+ );
+};
+
+export default AutoDragSortDemo;
+```
+
+##### AnySizeDragSortableView组件使用
+
+```js
+import React,{createRef} from 'react';
+import {
+ Text,
+ TouchableOpacity,
+ StyleSheet,
+ View,
+ Image,
+ Dimensions,
+ SafeAreaView
+} from 'react-native';
+import { AnySizeDragSortableView } from 'react-native-drag-sort'
+
+const {width} = Dimensions.get('window')
+const headerViewHeight = 160
+const bottomViewHeight = 40
+
+const getW = (index, isWidth) => isWidth ? index % 3 === 0 ? (width - 40) : (width - 60) / 2 : 80;
+
+export default class AnySizeDragSortDemo extends React.Component {
+ constructor(props) {
+ super(props);
+ const items = []
+ for (let i = 0; i < 26; i++) {
+ items.push({
+ text: String.fromCharCode(65 + i),
+ width: getW(i, true),
+ height: getW(i, false)
+ })
+ }
+ this.state = {
+ items,
+ movedKey: null
+ };
+
+ this.sortableViewRef = createRef()
+ }
+
+ onDeleteItem = (item, index) => {
+ const items = [...this.state.items]
+ items.splice(index, 1)
+ this.setState({ items })
+ }
+
+ _renderItem = (item, index, isMoved) => {
+ const {movedKey} = this.state
+ return (
+ {
+ this.setState({movedKey: item.text})
+ this.sortableViewRef.current.startTouch(item, index)
+ }}
+ onPressOut = {() => this.sortableViewRef.current.onPressOut()}
+ >
+
+ {
+
+ this.onDeleteItem(item, index)}>
+
+
+
+ }
+
+ {
+ isMoved ? (
+
+
+
+ ) : null
+ }
+
+ {item.text}
+
+
+
+
+ )
+ }
+
+ render() {
+ const { items } = this.state;
+ const renderHeaderView = (
+
+
+
+ mochixuan
+ Android, React-Native, Flutter, React, Web。Learn new knowledge and share new knowledge.
+
+
+ )
+ const renderBottomView = (
+
+ yarn add react-native-drag-sort
+
+ )
+ return (
+ <>
+
+ AnySize
+
+ item.text}
+ renderItem={this._renderItem}
+ onDataChange={(data, callback)=> {
+ this.setState({items: data},()=>{
+ callback()
+ console.log('移动了')
+ })
+ }}
+ renderHeaderView = {renderHeaderView}
+ headerViewHeight={headerViewHeight}
+ renderBottomView = {renderBottomView}
+ bottomViewHeight={bottomViewHeight}
+ movedWrapStyle={styles.item_moved}
+ onDragEnd={()=> console.log('Drag end')}
+ scrollIndicatorInsets={{ top: 1, left: 1, bottom: 1, right: 1 }}
+ autoThrottle={100}
+ autoThrottleDuration={500}
+ areaOverlapRatio={0.5}
+ childMarginTop={10}
+ childMarginBottom={10}
+ childMarginLeft={10}
+ childMarginRight={10}
+ />
+ >
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ item_wrap: {
+ position: 'relative',
+ paddingLeft: 20,
+ paddingTop: 20
+ },
+ item: {
+ justifyContent: 'space-around',
+ alignItems: 'center',
+ backgroundColor: '#f39c12',
+ borderRadius: 4,
+ },
+ item_clear_wrap: {
+ position: 'absolute',
+ left: 10,
+ top: 10,
+ width: 20,
+ height: 20,
+ zIndex: 999
+ },
+ item_clear: {
+ width: 20,
+ height: 20
},
+ item_moved: {
+ opacity: 0.95,
+ borderRadius: 4,
+ },
+ item_icon_swipe: {
+ width: 50,
+ height: 50,
+ backgroundColor: '#fff',
+ borderRadius: 50 * 0.5,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ item_icon: {
+ width: 30,
+ height: 30,
+ resizeMode: 'contain',
+ },
+ item_text_swipe: {
+ backgroundColor: '#fff',
+ width: 56,
+ height: 30,
+ borderRadius: 15,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ item_text: {
+ color: '#444',
+ fontSize: 20,
+ fontWeight: 'bold',
+ },
+ header: {
+ height: 48,
+ justifyContent: 'center',
+ alignItems: 'center',
+ borderBottomColor: '#2ecc71',
+ borderBottomWidth: 2,
+},
+header_title: {
+ color: '#333',
+ fontSize: 24,
+ fontWeight: 'bold'
+},
+ aheader: {
+ height: headerViewHeight,
+ flexDirection: 'row',
+ borderBottomColor: '#2ecc71',
+ borderBottomWidth: 2,
+ zIndex: 100,
+ backgroundColor: '#fff'
+},
+aheader_img: {
+ width: headerViewHeight * 0.6,
+ height: headerViewHeight * 0.6,
+ resizeMode: 'cover',
+ borderRadius: headerViewHeight * 0.3,
+ marginLeft: 16,
+ marginTop: 10,
+},
+aheader_context: {
+ marginLeft: 8,
+ height: headerViewHeight * 0.4,
+ marginTop: 10
+},
+aheader_title: {
+ color: '#333',
+ fontSize: 20,
+ marginBottom: 10,
+ fontWeight: 'bold'
+},
+aheader_desc: {
+ color: '#444',
+ fontSize: 16,
+ width: width - headerViewHeight * 0.6 - 32
+},
+abottom: {
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: bottomViewHeight,
+ backgroundColor: '#fff',
+ zIndex: 100,
+ borderTopColor: '#2ecc71',
+ borderTopWidth: 2,
+},
+abottom_desc: {
+ color: '#333',
+ fontSize: 20,
+ fontWeight: 'bold'
+}
});
-export default Dragsort;
```
+
+
## 约束与限制
### 兼容性
-本文档内容基于以下版本验证通过:
+在下述版本验证通过:
-1. RNOH:0.72.13; SDK:HarmonyOS NEXT Developer Preview1; IDE:DevEco Studio 4.1.3.500; ROM:2.0.0.58;
+1. RNOH:0.72.13; SDK:HarmonyOS NEXT Developer Preview1(2.0.0.59); IDE:DevEco Studio 4.1.3.500; ROM:2.0.0.58;
### 权限要求
## API(AutoDragSortableView、DragSortableView)
-**isRequired if there is a \* in the name field**
+**isRequired if there is a * in the name field**
> [!tip] "Platform"列表示该属性在原三方库上支持的平台。
@@ -173,29 +547,29 @@ export default Dragsort;
>
> 详情见 [react-native-drag-sort 源库地址](https://github.com/mochixuan/react-native-drag-sort)
-| Name | Description | Type | Required | Platform | HarmonyOS Support |
-| :----------------------: | :---------------------------------------------------------------------: | :------: | :------: | :---------: | :---------------: |
-| **dataSource** \* | | array | Yes | iOS/Android | Yes |
-| **parentWidth** | parent width | number | No | iOS/Android | Yes |
-| **childrenHeight** \* | Each item height | number | Yes | iOS/Android | Yes |
-| **childrenWidth** \* | Each item width | number | Yes | iOS/Android | Yes |
+| Name | Description | Type | Required | Platform | HarmonyOS Support |
+| :----------------------: | :----------------------------------------------------------: | :------: | :------: | :---------: | :---------------: |
+| **dataSource** * | | array | Yes | iOS/Android | Yes |
+| **parentWidth** | parent width | number | No | iOS/Android | Yes |
+| **childrenHeight** * | Each item height | number | Yes | iOS/Android | Yes |
+| **childrenWidth** * | Each item width | number | Yes | iOS/Android | Yes |
| **marginChildrenTop** | So the item's outermost view adds margin, you can only use this method. | number | No | iOS/Android | Yes |
-| **marginChildrenBottom** | | number | No | iOS/Android | Yes |
-| **marginChildrenLeft** | | number | No | iOS/Android | Yes |
-| **marginChildrenRight** | | number | No | iOS/Android | Yes |
-| **sortable** | Do not allow dragging | bool | No | iOS/Android | Yes |
-| **onClickItem** | click | function | No | iOS/Android | Yes |
-| **onDragStart** | | function | No | iOS/Android | Yes |
-| **onDragEnd** | | function | No | iOS/Android | Yes |
-| **onDataChange** | This method is called every time the data changes. | function | No | iOS/Android | Yes |
-| **renderItem** \* | render item view | function | Yes | iOS/Android | Yes |
-| **fixedItems** | no remove | array | No | iOS/Android | Yes |
-| **keyExtractor** | (item,index) => key | function | No | iOS/Android | Yes |
-| **delayLongPress** | | number | No | iOS/Android | Yes |
-| **isDragFreely** | Whether to limit the drag space | bool | No | iOS/Android | Yes |
-| **onDragging** | | function | No | iOS/Android | Yes |
-| **maxScale** | | number | No | iOS/Android | Yes |
-| **minOpacity** | | number | No | iOS/Android | Yes |
+| **marginChildrenBottom** | | number | No | iOS/Android | Yes |
+| **marginChildrenLeft** | | number | No | iOS/Android | Yes |
+| **marginChildrenRight** | | number | No | iOS/Android | Yes |
+| **sortable** | Do not allow dragging | bool | No | iOS/Android | Yes |
+| **onClickItem** | click | function | No | iOS/Android | Yes |
+| **onDragStart** | | function | No | iOS/Android | Yes |
+| **onDragEnd** | | function | No | iOS/Android | Yes |
+| **onDataChange** | This method is called every time the data changes. | function | No | iOS/Android | Yes |
+| **renderItem** * | render item view | function | Yes | iOS/Android | Yes |
+| **fixedItems** | no remove | array | No | iOS/Android | Yes |
+| **keyExtractor** | (item,index) => key | function | No | iOS/Android | Yes |
+| **delayLongPress** | | number | No | iOS/Android | Yes |
+| **isDragFreely** | Whether to limit the drag space | bool | No | iOS/Android | Yes |
+| **onDragging** | | function | No | iOS/Android | Yes |
+| **maxScale** | | number | No | iOS/Android | Yes |
+| **minOpacity** | | number | No | iOS/Android | Yes |
#### The following attributes belong only to AutoDragSortableView
@@ -217,7 +591,7 @@ export default Dragsort;
| Name | Description | Type | Required | Platform | HarmonyOS Support |
| :-----------------------: | :-----------------------------------------------: | :------------------------------------------------------: | :------: | :---------: | :---------------: |
-| **renderItem** \* | render item view | function | Yes | iOS/Android | Yes |
+| **renderItem** * | render item view | function | Yes | iOS/Android | Yes |
| **onDataChange** | This method is called every time the data changes | function | No | iOS/Android | Yes |
| **renderHeaderView** | | element | No | iOS/Android | Yes |
| **headerViewHeight** | | number | No | iOS/Android | Yes |
@@ -235,7 +609,7 @@ export default Dragsort;
| **childMarginRight** | | number | No | iOS/Android | Yes |
| **autoThrottleDuration** | | number | No | iOS/Android | Yes |
| **onDragEnd** | | function | No | iOS/Android | Yes |
-| **dataSource** \* | | array | Yes | iOS/Android | Yes |
+| **dataSource** * | | array | Yes | iOS/Android | Yes |
| **keyExtractor** | (item,index) => key | function.isRequired | No | iOS/Android | Yes |
## 遗留问题
@@ -244,4 +618,4 @@ export default Dragsort;
## 开源协议
-本项目基于 [The Apache License (Apache)](https://github.com/mochixuan/react-native-drag-sort/blob/master/LICENSE) ,请自由地享受和参与开源。
+本项目基于 [The Apache License (Apache)](https://github.com/mochixuan/react-native-drag-sort/blob/master/LICENSE) ,请自由地享受和参与开源。
\ No newline at end of file