ошибка типа react native попыталась присвоить свойству только для чтения

#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, мне пришлось удалить ()