如何解决如何使用react-native-swipe-list-view获取{native}中的当前平面清单项目数据
我不知道如何获取平面列表的当前项目对象
我使用了react-native-swipeout
和react-native-swipe-list-view
,在两个示例中我都卡住了。
在Google上,我找到了很大的答案。不仅指出了让我感到困惑的特定问题。
以下是我使用react-native-swipeout
插件时的删除功能
const swipeSettings = {
left: [
{
text: 'Delete',onPress: () => {
console.log('-----delete-----');
},type: 'delete',},}
我需要做的就是,当我点击onpress()
按钮时,在delete
内获得如下所示的当前项目对象数据。
{
id: 1,prodName : "abcdefg",}
仅此而已,我来自本机脚本背景,在那种框架下,我从未遇到过此类问题。因为文档非常清晰。但是在这里,对我来说,一切似乎都很复杂。 有人可以帮助我。
<FlatList
data={data}
keyExtractor={(item) => item.id}
renderItem={({item,index}) => (
<Swipeout {...swipeSettings}>
<View style={styles.listView}>
<Text style={styles.listViewText}>{item.prodName}</Text>
</View>
</Swipeout>
)}
/>
整个页面
import React,{useState} from 'react';
import {View} from 'react-native-animatable';
import {
TextInput,TouchableOpacity,FlatList,} from 'react-native-gesture-handler';
import Icon from 'react-native-vector-icons/FontAwesome';
import {StyleSheet,Pressable,Text,Button} from 'react-native';
import * as Animatable from 'react-native-animatable';
import Swipeout from 'react-native-swipeout';
import ButtonPressable from '../../components/ButtonPressable';
var sqlite_wrapper = require('./sqliteWrapper');
const DATA = [
{
prodName: 'Added data will look like this',];
const swipeSettings = {
style: {
marginBottom: 10,autoClose: false,backgroundColor: 'transparent',close: false,disabled: false,onClose: (sectionID,rowId,direction) => {
console.log('---onclose--');
},onOpen: (sectionID,direction) => {
console.log('---onopen--');
},right: [
{
backgroundColor: 'dodgerblue',color: 'white',text: 'Edit',onPress: () => {
console.log('-----edit-----');
},],left: [
{
backgroundColor: 'red',text: 'Delete',onPress: () => {
console.log('-----delete-----');
sqlite_wrapper.deleteById
},// component : (<ButtonPressable text="delete" />)
},// buttonWidth: 100,};
const AddProductList = ({route,navigation}) => {
const {navData} = route.params;
const [prodName,setProdName] = useState('');
var [data,setData] = useState(DATA);
return (
<View style={styles.container}>
<Animatable.View
animation="bounceIn"
duration={1000}
style={styles.inputFieldView}>
<TextInput
style={styles.textInput}
onChangeText={(value) => setProdName(value)}
placeholder="Add the Product"
defaultValue={prodName}
/>
<TouchableOpacity
style={styles.addView}
onPress={() => {
sqlite_wrapper
.insert({prodName: prodName},sqlite_wrapper.collection_product)
.then((result) => {
console.log('---result---');
console.log(result);
if (result.rowsAffected) {
fetchAllData();
}
});
function fetchAllData() {
sqlite_wrapper
.readAll(sqlite_wrapper.collection_product)
.then((resultData) => {
console.log('---resultData---');
console.log(resultData);
setData(resultData);
setProdName('');
});
}
// without sql this is how to update the state having a array
// const updatedArray = [...data];
// updatedArray.push({prodName: prodName});
// setData(updatedArray);
// setProdName('');
}}>
<Icon name="plus" size={16} style={styles.add} color="white" />
</TouchableOpacity>
</Animatable.View>
<Animatable.View
animation="bounceInLeft"
duration={1500}
style={{flex: 1}}>
<FlatList
data={data}
keyExtractor={(item) => item.id}
renderItem={({item,index}) => (
<Swipeout {...swipeSettings}>
<View style={styles.listView}>
<Text style={styles.listViewText}>{item.prodName}</Text>
</View>
</Swipeout>
)}
/>
</Animatable.View>
</View>
);
};
var styles = StyleSheet.create({
container: {
flex: 1,inputFieldView: {
flexDirection: 'row',alignItems: 'center',alignSelf: 'stretch',margin: 10,textInput: {
flex: 1,backgroundColor: '#b2ebf2',borderTopLeftRadius: 7,borderBottomLeftRadius: 7,fontSize: 16,addView: {
backgroundColor: '#0f4c75',justifyContent: 'center',borderTopEndRadius: 7,borderBottomEndRadius: 7,padding: 9,add: {
padding: 7,listView: {
padding: 20,backgroundColor: 'green',margin: 0,borderRadius: 0,listViewText: {
color: 'white',});
export default AddProductList;
解决方法
因此,如果我正确的话,您可以使用一个通用的滑动设置,以适应列表中的每个元素。
尝试像这样更改Flatlist的renderItem,让我知道它如何为您工作:
<FlatList
data={data}
keyExtractor={(item) => item.id}
renderItem={({ item,index }) => {
let right = [...swipeSettings.right]; <---- ADDED
let left = [...swipeSettings.left]; <---- ADDED
right[0].onPress = () => console.log('edit',item.prodName); <---- ADDED
left[0].onPress = () => console.log('delete',item.prodName); <---- ADDED
<Swipeout {...swipeSettings} {...{ right,left}} > <---- CHANGED
<View style={styles.listView}>
<Text style={styles.listViewText}>{item.prodName}</Text>
</View>
</Swipeout>
}}
/>
所以我在这里所做的是将通用的滑动设置发送到Swipeout的每个实例,但是更改了它们的“左”和“右”以覆盖其“ onPress”功能并将其调整为渲染的项目。
我知道很难像这样理解它,这也许不是最好的解释,但我希望它能以某种方式对您有所帮助。
编辑
import React,{ useState } from 'react';
import { View } from 'react-native-animatable';
import {
TextInput,TouchableOpacity,FlatList,} from 'react-native-gesture-handler';
import Icon from 'react-native-vector-icons/FontAwesome';
import { StyleSheet,Pressable,Text,Button } from 'react-native';
import * as Animatable from 'react-native-animatable';
import Swipeout from 'react-native-swipeout';
import ButtonPressable from '../../components/ButtonPressable';
var sqlite_wrapper = require('./sqliteWrapper');
const DATA = [
{
prodName: 'Added data will look like this',},];
const AddProductList = ({ route,navigation }) => {
const { navData } = route.params;
const [prodName,setProdName] = useState('');
var [data,setData] = useState(DATA);
const renderItem = ({ item,index }) => {
const swipeSettings = {
style: {
marginBottom: 10,autoClose: false,backgroundColor: 'transparent',close: false,disabled: false,onClose: (sectionID,rowId,direction) => {
console.log('---onclose--');
},onOpen: (sectionID,direction) => {
console.log('---onopen--');
},right: [
{
backgroundColor: 'dodgerblue',color: 'white',text: 'Edit',onPress: () => console.log('-----edit-----',item.prodName)
},],left: [
{
backgroundColor: 'red',text: 'Delete',onPress: () => {
console.log('-----delete-----',item.prodName);
sqlite_wrapper.deleteById
},type: 'delete',// component : (<ButtonPressable text="delete" />)
},// buttonWidth: 100,};
return (
<Swipeout {...swipeSettings}>
<View style={styles.listView}>
<Text style={styles.listViewText}>{item.prodName}</Text>
</View>
</Swipeout>
)
}
return (
<View style={styles.container}>
<Animatable.View
animation="bounceIn"
duration={1000}
style={styles.inputFieldView}>
<TextInput
style={styles.textInput}
onChangeText={(value) => setProdName(value)}
placeholder="Add the Product"
defaultValue={prodName}
/>
<TouchableOpacity
style={styles.addView}
onPress={() => {
sqlite_wrapper
.insert({ prodName: prodName },sqlite_wrapper.collection_product)
.then((result) => {
console.log('---result---');
console.log(result);
if (result.rowsAffected) {
fetchAllData();
}
});
function fetchAllData() {
sqlite_wrapper
.readAll(sqlite_wrapper.collection_product)
.then((resultData) => {
console.log('---resultData---');
console.log(resultData);
setData(resultData);
setProdName('');
});
}
// without sql this is how to update the state having a array
// const updatedArray = [...data];
// updatedArray.push({prodName: prodName});
// setData(updatedArray);
// setProdName('');
}}>
<Icon name="plus" size={16} style={styles.add} color="white" />
</TouchableOpacity>
</Animatable.View>
<Animatable.View
animation="bounceInLeft"
duration={1500}
style={{ flex: 1 }}>
<FlatList
data={data}
keyExtractor={(item) => item.id}
renderItem={renderItem}
/>
</Animatable.View>
</View>
);
};
var styles = StyleSheet.create({
container: {
flex: 1,inputFieldView: {
flexDirection: 'row',alignItems: 'center',alignSelf: 'stretch',margin: 10,textInput: {
flex: 1,backgroundColor: '#b2ebf2',borderTopLeftRadius: 7,borderBottomLeftRadius: 7,fontSize: 16,addView: {
backgroundColor: '#0f4c75',justifyContent: 'center',borderTopEndRadius: 7,borderBottomEndRadius: 7,padding: 9,add: {
padding: 7,listView: {
padding: 20,backgroundColor: 'green',margin: 0,borderRadius: 0,listViewText: {
color: 'white',});
export default AddProductList;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。