рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдореВрд▓: рдПрдХ рдЦреАрдВрдЪреЗрдВ рдФрд░ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реВрдЪреА рдмрдирд╛рдПрдВ

рдЖрдЬ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реВрдЪреА рдЖрдЗрдЯрдо рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдХреЛ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднреА рдереА, рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реВрдЪреА рдЖрдЗрдЯрдореЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдФрд░ рдЪреВрдВрдХрд┐ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдиреЗ рдореБрдЭреЗ рддрдВрддреНрд░рд┐рдХрд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рд╢рд┐ рдЦрд░реНрдЪ рдХреА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рднрд╡рд┐рд╖реНрдп рдХреА рдкреАрдврд╝рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╡рд╛рди рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдЦ рджрд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред



рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдордиреЗ react-native-swipe-list-view рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП react-native-swipe-list-view рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдбреНрд░реИрдЧ'рдирд╣рд▓рдбреНрд░реЙрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкреИрдХреЗрдЬ рд▓рд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╕рд╛рдВрдк рдХреЗ рд╕рд╛рде рд╣рд╛рдереА рдХреЛ рдкрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЗрдВрдЯрд░рдиреЗрдЯ рдХреА рдПрдХ рдЦреЛрдЬ рдиреЗ рддреАрди рдЕрднреНрдпрд░реНрдерд┐рдпреЛрдВ рдХреЛ рджрд┐рдпрд╛: react-native-draggable-list , react-native-sortable-list react-native-draggable-flatlist react-native-sortable-list рдФрд░ react-native-draggable-flatlist ред

рдкрд╣рд▓реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рд╕рдВрд▓рдЧреНрди рдЙрджрд╛рд╣рд░рдг рдХреЛ рднреА рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рди рдХреЗрд╡рд▓ рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕реА рдореБрджреНрджреЗ рдХреЛ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ )ред

рдореБрдЭреЗ рджреВрд╕рд░реЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдбреНрд░реИрдЧреЗрдмрд▓ рдФрд░ рд╕реНрд╡рд╛рдЗрдкреЗрдмрд▓ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд┐рдгрд╛рдо рдкреНрд░реЗрд░рд┐рдд рдирд╣реАрдВ рдерд╛ - рдШрдЯрдХ рдмреЗрд╢рд░реНрдореА рд╕реЗ рдирд┐рдорд┐рд╖ рдХрд░ рд░рд╣рд╛ рдерд╛: рд░реЗрдбреНрд░рд╛ рдХреЗ рдирд┐рдорд┐рд╖, рд╕реВрдЪреА рд╕реЗ рдкрд░реЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдЧрд┐рд░рдирд╛, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдирдХреЗ рд▓рд╛рдкрддрд╛ рд╣реЛрдиреЗ рдХрд╛ рднреАред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдЗрд╕ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЦрд┐рд░реА рдкреИрдХреЗрдЬ рдореЗрдВ рднреА рдПрдХ рдХреИрдкреНрд░рд┐рдХ рдорд╣рд┐рд▓рд╛ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдкрдХрд╛рдирд╛ рд╣реИред рдЗрд╕ "рдорд╣рд┐рд▓рд╛" рдХреЗ рджрд┐рд▓ рдХреА рдПрдХ рдЪрд╛рдмреА рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкрд░рд┐рдгрд╛рдо рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдПрдХ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реВрдЪреА рдереА, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдХреЛ рдлрд╛рд╕реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рджреВрд╕рд░реЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ: рдкрд╣рд▓реЗ рдПрдХ рдбреНрд░реИрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реВрдЪреА рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВред

рдкрд╛рдардХреЛрдВ рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдП, рддреЛ рдЪрд▓рд┐рдП рдЙрд╕ рд╕реВрдЪреА рдХреЛ рдмрдирд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдЙрджрд╛рд╣рд░рдг рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣реИред

рдПрдХ рдЦреАрдВрдЪрдиреЗ рдпреЛрдЧреНрдп рд╕реВрдЪреА рдмрдирд╛рдирд╛


рддреЛ, рдЪрд▓реЛ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:

 yarn add react-native-draggable-flatlist 

рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:

 import React, { Component } from 'react' import { View } from 'react-native' import styles from './styles' import DraggableFlatList, { RenderItemInfo, OnMoveEndInfo } from 'react-native-draggable-flatlist' import ListItem from './components/ListItem' import fakeData from './fakeData.json' 

рдпрд╣рд╛рдВ DraggableFlatList рд╕реНрдерд╛рдкрд┐рдд рдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рдШрдЯрдХ рд╣реИ рдЬреЛ рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк ListItem рд▓рд╛рдЧреВ ListItem , ListItem рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо (рдХреЛрдб рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдШрдЯрдХ рд╣реИ, рдлрд░реНрдЬреА рдбреЗрдЯрд╛ рдПрдХ рдЬрд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рдирдХрд▓реА рдбреЗрдЯрд╛ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рдкрддреНрд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА:

 {"id": 0, "name": "JavaScript", "favorite": false} 

рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдпрд╣ рдбреЗрдЯрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░реЙрдореНрдкреНрдЯ рд╕реЗ рдЖрдкрдХреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рдЖрдПрдВрдЧреЗ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдереЛрдбрд╝реЗ рд╕реЗ рд░рдХреНрдд рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВрдЧреЗред

рдЪреВрдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреБрдЫ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:

 type Language = { id: number, name: string, favorite: boolean, } interface AppProps {} interface AppState { data: Array<Language> } 

Language рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдореЗрдВ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рд╣реЛрдВрдЧреЗред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдореЗрдВ AppProps рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП AppProps рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддреБрдЪреНрдЫ рд╣реИ, рдФрд░ рдХрд╣рд╛рдиреА рдореЗрдВ рд╣рдо Language рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ AppState рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдШрдЯрдХ рдХреЛрдб рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЗрд╕рдХреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рджреВрдВрдЧрд╛:

рдРрдк рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛрдб
 class App extends Component<AppProps, AppState> { constructor(props: AppProps) { super(props) this.state = { data: fakeData, } } onMoveEnd = ({ data }: OnMoveEndInfo<Language>) => { this.setState({ data: data ? [...data] : [] }) } render() { return ( <View style={styles.root}> <DraggableFlatList data={this.state.data} renderItem={this.renderItem} keyExtractor={(item) => item.id.toString()} scrollPercent={5} onMoveEnd={this.onMoveEnd} /> </View> ) } renderItem = ({ item, move, moveEnd, isActive }: RenderItemInfo<Language>) => { return ( <ListItem name={item.name} move={move} moveEnd={moveEnd} isActive={isActive} /> ) } } 


рдЬрдм рдЖрдЗрдЯрдо рдХреЛ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ onMoveEnd рд╡рд┐рдзрд┐ onMoveEnd рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд░рд╛рдЬреНрдп рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдирдП рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕реВрдЪреА рдХреЛ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ред this.setState рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВред

renderItem рд╡рд┐рдзрд┐ рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо renderItem рд╣реИ рдФрд░ RenderItemInfo <Language> рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рдореНрди рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • item - рд╕реВрдЪреА рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╕рд░рдгреА рдХрд╛ рдЕрдЧрд▓рд╛ рддрддреНрд╡,
  • move рдФрд░ moveEnd рдРрд╕реЗ рдлрдВрдХреНрд╢рдиреНрд╕ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд▓рд┐рд╕реНрдЯ рдЖрдЗрдЯрдо рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ DraggableFlatList рдХрдВрдкреЛрдиреЗрдВрдЯ рдЗрди рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ,
  • isActive рдПрдХ рдмреВрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдЗрдЯрдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ isActive рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕реВрдЪреА рдЖрдЗрдЯрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, TouchableOpacity , рдЬреЛ рдЬрдм рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЙрд▓ move , рдФрд░ рдЬрдм рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ moveEnd ред

ListItem рдШрдЯрдХ рдХреЛрдб
 import React from 'react' import { Text, TouchableOpacity } from 'react-native' import styles from './styles' interface ListItemProps { name: string, move: () => void, moveEnd: () => void, isActive: boolean, } const ListItem = ({ name, move, moveEnd, isActive }: ListItemProps) => { return ( <TouchableOpacity style={[styles.root, isActive && styles.active]} onLongPress={move} onPressOut={moveEnd} > <Text style={styles.text}>{name}</Text> </TouchableOpacity> ) } export default ListItem 


рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рднрдВрдбрд╛рд░ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдкрд░рд┐рдгрд╛рдореА рдкрд░рд┐рдгрд╛рдо:



рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ


рдЦреИрд░, рд╣рдо рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдо рдорд╛рд░реНрд▓реЗрдЬрд╝реЛрди рдмреИрд▓реЗ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рд╕реВрдЪреА рдЖрдЗрдЯрдо рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо react-native-swipe-list-view рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 yarn add react-native-swipe-list-view 

рдЗрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ SwipeRow рдШрдЯрдХ рд╣реИ, рдЬреЛ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рджреЛ рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 <SwipeRow> <View style={hiddenRowStyle} /> <View style={visibleRowStyle} /> </SwipeRow> 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рджреГрд╢реНрдп рджреВрд╕рд░реЗ рдХреЗ рддрд╣рдд рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рд╣реИред

рдЪрд▓рд┐рдП ListItem рдШрдЯрдХ рдХрд╛ рдХреЛрдб рдмрджрд▓рддреЗ рд╣реИрдВред

ListItem рдШрдЯрдХ рдХреЛрдб
 import React from 'react' import { Text, TouchableOpacity, View, Image } from 'react-native' import { SwipeRow } from 'react-native-swipe-list-view' import { Language } from '../../App' import styles from './styles' const heart = require('./icons8-heart-24.png') const filledHeart = require('./icons8-heart-24-filled.png') interface ListItemProps { item: Language, move: () => void, moveEnd: () => void, isActive: boolean, onHeartPress: () => void, } const ListItem = ({ item, move, moveEnd, isActive, onHeartPress }: ListItemProps) => { return ( <SwipeRow rightOpenValue={-180}> <View style={styles.hidden}> <TouchableOpacity onPress={onHeartPress}> <Image source={item.favorite ? filledHeart : heart} /> </TouchableOpacity> </View> <TouchableOpacity activeOpacity={1} style={[styles.root, isActive && styles.active]} onLongPress={move} onPressOut={moveEnd} > <Text style={styles.text}>{item.name}</Text> </TouchableOpacity> </SwipeRow> ) } export default ListItem 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ SwipeRow рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде SwipeRow рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рд╛, рдЬреЛ рдЙрд╕ рджреВрд░реА рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рддрддреНрд╡ рдХреЛ рд╕реНрд╡рд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рджреВрд╕рд░реЗ, рд╣рдордиреЗ рдЕрдкрдиреЗ SwipeRow рдХреЛ SwipeRow рдЕрдВрджрд░ SwipeRow рдФрд░ рдПрдХ рд╡реНрдпреВ рдЬреЛрдбрд╝рд╛, рдЬреЛ рдЗрд╕ рдмрдЯрди рдХреЗ рдиреАрдЪреЗ рдЦреАрдВрдЪрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рджреГрд╢реНрдп рдХреЗ рдЕрдВрджрд░, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд┐рддреНрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдкрд╕рдВрджреАрджрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЬрдм рдЖрдк рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рди рдЙрд▓рдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдХреЙрд▓рдмреИрдХ рдлреЗрдВрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд░рддрд╛ рд╣реИред

рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:

рдРрдк рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛрдб
 import React, { Component } from 'react' import { View } from 'react-native' import styles from './styles' import DraggableFlatList, { RenderItemInfo, OnMoveEndInfo } from 'react-native-draggable-flatlist' import ListItem from './components/ListItem' import fakeData from './fakeData.json' export type Language = { id: number, name: string, favorite: boolean, } interface AppProps {} interface AppState { data: Array<Language> } class App extends Component<AppProps, AppState> { constructor(props: AppProps) { super(props) this.state = { data: fakeData, } } onMoveEnd = ({ data }: OnMoveEndInfo<Language>) => { this.setState({ data: data ? [...data] : [] }) } toggleFavorite = (value: Language) => { const data = this.state.data.map(item => ( item.id !== value.id ? item : { ...item, favorite: !item.favorite } )) this.setState({ data }) } render() { return ( <View style={styles.root}> <DraggableFlatList data={this.state.data} renderItem={this.renderItem} keyExtractor={(item) => item.id.toString()} scrollPercent={5} onMoveEnd={this.onMoveEnd} /> </View> ) } renderItem = ({ item, move, moveEnd, isActive }: RenderItemInfo<Language>) => { return ( <ListItem item={item} move={move} moveEnd={moveEnd} isActive={isActive} onHeartPress={() => this.toggleFavorite(item)} /> ) } } export default App 


GitHub рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реНрд░реЛрддред

рдкрд░рд┐рдгрд╛рдо рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

Source: https://habr.com/ru/post/hi460567/


All Articles