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

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдордиреЗ
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 рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реНрд░реЛрддред
рдкрд░рд┐рдгрд╛рдо рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
