por favor, ayúdenme a implementar pull para actualizar mi aplicación, soy un poco nuevo para reaccionar de forma nativa, gracias. No sé cómo manejar onRefresh y refrescante.
class HomeScreen extends Component {
state = { refreshing: false }
_renderItem = ({ item }) => <ImageGrid item={item} />
_handleRefresh = () => {
};
render() {
const { data } = this.props;
if (data.loading) {
return (
<Root>
<Loading size="large" />
</Root>
)
}
return (
<Root>
<HomeHeader />
<FlatList
contentContainerStyle={{ alignSelf: 'stretch' }}
data={data.getPosts}
keyExtractor={item => item._id}
renderItem={this._renderItem}
numColumns={3}
refreshing={this.state.refreshing}
onRefresh={this._handleRefresh}
/>
</Root>
);
}
}
export default graphql(GET_POSTS_QUERY)(HomeScreen);
kris
Establecer variables
this.state = {
isFetching: false,
}
Crear función Actualizar
onRefresh() {
this.setState({isFetching: true,},() => {this.getApiData();});
}
Y en el último conjunto onRefresh y refrescante en FlatList.
<FlatList
data={ this.state.FlatListItems }
onRefresh={() => this.onRefresh()}
refreshing={this.state.isFetching}
/>
Después de obtener datos en la función getApiData, asegúrese de establecer falso isFetching.
this.setState({ isFetching: false })
-
Hola, @Krish, lo hago, pero el último elemento en Datos no puede desaparecer y cuando jalo para actualizar, la “carga” se atasca y no puedo obtener nuevos datos.
– DevAS
8 de noviembre de 2019 a las 13:10
-
@DevAS Vacíe la matriz (cuando establece el estado en blanco, la lista plana de la matriz debe recargarse) antes de llamar a la función de recarga y verifique si su FlatList aún muestra el último elemento o no.
– kris
8 de noviembre de 2019 a las 14:01
-
No entiendo lo que quieres decir: / ¿dijiste vaciar la matriz cuando llamas a onRefresh?
– DevAS
8 de noviembre de 2019 a las 14:33
-
@DevAS Me refiero a Vaciar la matriz (en mi ejemplo “FlatListItems”), debe actualizar Flatlist y no debe mostrar el último elemento. Por favor, comparte el código para que pueda revisarlo.
– kris
11 de noviembre de 2019 a las 6:05
Jígaro
También puedes usar refreshControl
en Flatlist
, ScrollView
y cualquier otro componente de la lista.
<FlatList
contentContainerStyle={{ alignSelf: 'stretch' }}
data={data.getPosts}
keyExtractor={(item) => item._id}
renderItem={this._renderItem}
numColumns={3}
refreshControl={
<RefreshControl
refreshing={this.state.refreshing}
onRefresh={this._handleRefresh}
/>
}
/>
-
si configura
prop onRefresh
FlatList estableceráRefreshControl
automáticamente, aunque sea por defecto.– Bruce Lee
18 de diciembre de 2017 a las 6:25
// Ejemplo de código que representa la extracción para actualizar en flatlist. Modificar en consecuencia.
import React, { Component } from 'react'
import { Text, View,StyleSheet,FlatList,Dimensions,Image,TouchableHighlight } from 'react-native'
export default class Home extends Component {
constructor(props)
{
super(props);
this.state = {
data : [],
gender : "",
isFetching: false,
}
}
componentWillMount()
{
this.searchRandomUser()
}
onRefresh() {
this.setState({ isFetching: true }, function() { this.searchRandomUser() });
}
searchRandomUser = async () =>
{
const RandomAPI = await fetch('https://randomuser.me/api/?results=20')
const APIValue = await RandomAPI.json();
const APIResults = APIValue.results
console.log(APIResults[0].email);
this.setState({
data:APIResults,
isFetching: false
})
}
render() {
return (
<View style = {styles.container}>
<TouchableHighlight
onPressOut = {this.searchRandomUser}
style = {{width:deviceWidth - 32, height:45,backgroundColor: 'green',justifyContent:"center",alignContent:"center"}}>
<Text style = {{fontSize:22,color: 'white',fontWeight: 'bold',textAlign:"center"}}>Reload Data</Text>
</TouchableHighlight>
<FlatList
data={this.state.data}
onRefresh={() => this.onRefresh()}
refreshing={this.state.isFetching}
keyExtractor = { (item, index) => index.toString() }
renderItem={({item}) =>
<View style = {styles.ContainerView}>
<View>
<Image
source={{uri : item.picture.large}}
style = {{height:100,width:100,borderRadius: 50,marginLeft: 4}}
resizeMode="contain"
/>
</View>
<View style = {{flexDirection: 'column',marginLeft:16,marginRight: 16,flexWrap:'wrap',alignSelf:"center",width: deviceWidth-160}}>
<Text>Email Id : {item.email}</Text>
<Text>Full Name : {this.state.gender} {item.name.first} {item.name.last}</Text>
<Text>Date of birth : {item.dob.age}</Text>
<Text>Phone number : {item.phone}</Text>
</View>
</View>
}
/>
</View>
)
}
}
const deviceWidth = Dimensions.get('window').width
const deviceHeight = Dimensions.get('window').height
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
marginTop:22
},
ContainerView:
{
// backgroundColor:'grey',
marginBottom:20,
paddingVertical:10,
backgroundColor: '#F5F5F5',
borderBottomWidth:0.5,
borderBottomColor:'grey',
width: deviceWidth-40,
marginLeft:20,
marginRight:20,
marginTop:20,
flexDirection:'row'
}
});
-
Ejemplo del código anterior, gracias@Rishav Kumar, enlace => snack.expo.io/tzvapUOLa
– Hardik Desai
11 de julio de 2020 a las 8:32
poPaTheGuru
Si alguien está interesado en hacerlo con React Hooks, aquí está:
Primero crea isRefreshing
Expresar:
const [isRefreshing, setIsRefreshing] = useState(false)
Entonces crea tu onRefresh
función que llama a la API para actualizar los datos:
const onRefresh = () => {
//set isRefreshing to true
setIsRefreshing(true)
callApiMethod()
// and set isRefreshing to false at the end of your callApiMethod()
}
Y después de eso, su FlatList
componente que se ve así:
return (
<FlatList
style={styles.flatList}
onRefresh={onRefresh}
refreshing={isRefreshing}
data={data}
renderItem={renderItem}
keyExtractor={item => item.id.toString()}
/>
)
deepanshu katyal
const [refreshing, setRefreshing] = useState(false)
<FlatList
style={{ padding: 15 }}
refreshControl={
<RefreshControl
refreshing={refreshing}
onRefresh={_onRefresh}
tintColor="#F8852D"/>
}
showsVerticalScrollIndicator={false}
data={listData}
renderItem={renderItem}
item={(item, index) => index.toStirng()}
onEndReachedThreshold={0.8}
onEndReached={() => onEndReached()}
ListFooterComponent={() => renderFooter()}
/>
Función _onRefresh
const _onRefresh = () => {
console.log('_onRefresh')
setRefreshing(true);
getPosts();
};
-
refreshing
yonRefresh
ya son accesorios de FlatList. ¿Todavía necesitas envolverlo en unRefreshControl
¿etiqueta?– dakini
21 de julio de 2021 a las 14:45
-
@deepanshu corrige la ortografía de index.toStirng() a index.toString()
– Ayush Kumar
6 oct 2021 a las 17:55
Teivaz
El concepto “Extraer para actualizar” implica que la lista se puede actualizar manualmente, por lo que se puede cambiar fuera de la vista actual (por ejemplo, obtenerla del servidor). Así que la devolución de llamada onRefresh
tiene que activar el proceso de recarga de datos (por ejemplo, enviar una solicitud al servidor) y configurar el refreshing
variable al valor de verdad. Esto notificará al usuario que el proceso se inició mostrando el indicador de carga. Una vez que tenga los datos listos, debe configurar refreshing
a falso para que la vista oculte el indicador de carga.
-
refreshing
yonRefresh
ya son accesorios de FlatList. ¿Todavía necesitas envolverlo en unRefreshControl
¿etiqueta?– dakini
21 de julio de 2021 a las 14:45
-
@deepanshu corrige la ortografía de index.toStirng() a index.toString()
– Ayush Kumar
6 oct 2021 a las 17:55
petros
esto es lo mejor que puedo hacer. mi imagen de código
cuando lo bajo, no recupera los datos del servidor. Estoy ejecutando el servidor graphql que se conectó con Apollo a la aplicación, y no sé cómo obtener datos del servidor en la función _getData().
-
Sería útil si pegara el fragmento de código aquí.
– Hardik Vagani
17 de diciembre de 2020 a las 11:10