#react-native
#react-native
Вопрос:
Привет, я новичок в react native, я пытаюсь отправить сокет с помощью socketio в react native, но получаю ошибку: ошибка типа попыталась присвоить свойству readonly в ConnectScreen.js в нем не указано, какая строка, любая ide, что я делаю не так, пожалуйста?
в expo для Web говорится следующее: невозможно добавить средство обновления свойств, объект не расширяем в expo на мобильных устройствах. ConnectScreen.js (создано SceneView)
import React from 'react';
import {View, Text, StyleSheet, Button, TextInput, TouchableHighlight} from 'react-native';
import socketIO from 'socket.io-client';
import io from 'socket.io-client';
export default class ConnectScreen extends React.Component{
constructor(props){
super(props)
this.state = {
ip: "localhost", //ip rpi 192.168.1.172
connecting: false,
}
return(
<View style={styles.container}>
<Text style={styles.txt}>Connect to IP:</Text>
<TextInput
style={{ height: 60, borderColor: 'gray', borderWidth: 1 }}
/>
<TouchableHighlight style={styles.button} activeOpacity={0.6} underlayColor="#DDDDDD" onPress={this.connectWifi()}>
<Text style={styles.txt}> CONNECT </Text>
</TouchableHighlight>
</View>
);
}
connectWifi(){
let socketIO = io("http://" this.state.ip ":8888", {transports:['websocket']});
this.setState({connecting:true});
console.log("connecting to http://" this.state.ip ":8888 ...");
socketIO.on('connection_successful', () =>{
this.props.navigation.navigate('Main', {socketIO, ip:this.state.ip});
this.setState({connecting:false});
});
//checking if connection with server was succesfull
setTimeout(() =>{
if(this.state.connecting){
this.setState({connecting:false});
socketIO.disconnect();
console.log("connection failed");
}
},3500);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
width: "50%",
alignSelf:'center',
},
button:{
alignSelf:'center',
backgroundColor: "#89cff0",
width: "100%",
},
txt:{
alignSelf:'center',
fontSize: 50,
}
});
Ответ №1:
Переместите return
инструкцию в конструкторе в метод render .
Компоненты класса React должны иметь метод render() . При изменении состояния React вызывает ваш метод render().
Комментарии:
1. спасибо, я переписал это так, но теперь я получил новую ошибку, инвариантное нарушение: превышена максимальная глубина обновления, это может произойти, когда компонент повторно вызывает setState внутри componentWillUpdate или componentDidUpdate, я вижу, что я использую несколько setState, но это из руководства по реализации socketio :/ обновлено ConnectScreen.js : pastebin.com/3x95AMza
2. исправлено, возникла проблема с этим.connectWifi, мне пришлось удалить ()