Estoy desarrollando una aplicación de mensajería usando react-native
y socket.io
. cuando envío el mensaje, el mensaje se entrega correctamente, pero el texto en el campo de texto no se borra y aparece el mensaje de error Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in %s.%s, the componentWillUnmount method
.
import React from 'react'; import { View, StyleSheet, Text, FlatList, TextInput } from 'react-native'; import { Button } from 'react-native-paper'; import { io } from 'socket.io-client'; import colors from '../config/colors'; class Messages extends React.Component { constructor(props) { super(props); this.state = { chats: [], message: '', }; } componentDidMount() { const socket = io('http://localhost:1000'); socket.on('chat', (chats) => { this.setState({ chats: [...this.state.chats, chats] }); }); } render() { return ( <View style={styles.container}> <FlatList data={this.state.chats} renderItem={({ item }) => <Text>{item.message}</Text>} keyExtractor={(item) => item.id.toString()} /> <View style={styles.inputContainer}> <TextInput style={styles.input} onChangeText={(text) => { this.setState({ message: text }); }} /> <Button onPress={() => { const socket = io('http://localhost:1000'); socket.emit('chat', { message: this.state.message, }); this.setState({ message: '' }); }} > Send </Button> </View> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: colors.black, }, input: { backgroundColor: colors.text, //color: colors.text, height: 40, flex: 1, borderRadius: 20, }, inputContainer: { flexDirection: 'row', justifyContent: 'space-between', }, }); export default Messages;
Pruebe la palabra clave async
con componentDidMount
async componentDidMount() { //existing code }
y al definir los estados, se recomienda usar null
en lugar de ""
this.state = { chats: [], message: null, };
por lo tanto, de manera similar, configúrelo como nulo después de que se haya enviado el mensaje
this.setState({ message: null })
incluso use funciones en lugar de multilínea en el disparador de botón
sendMessage = async() => { const socket = io('http://localhost:1000'); socket.emit('chat', { message: this.state.message, }); this.setState({ message: null }); } <Button onPress={this.sendMessage}> Send </Button>
El enlace de datos en React se puede lograr mediante el uso de una entrada controlada. Se logra una entrada controlada vinculando el valor a una variable de estado y un evento onChange para cambiar el estado a medida que cambia el valor de entrada. debe agregar un value={this.state.message}
a su componente de texto para lograr los resultados deseados.
<TextInput value={this.state.message} style={styles.input} onChangeText={(text) => { this.setState({ message: text }); }} />