Reactjs react native this.setState导致代码停止运行

Reactjs react native this.setState导致代码停止运行,reactjs,react-native,websocket,Reactjs,React Native,Websocket,我有一个websocket连接设置,react native成功连接到。我的代码如下: export default class Settings extends React.PureComponent { constructor() { super() this.state = { questionText: '' } } connect() { console.log('con

我有一个websocket连接设置,react native成功连接到。我的代码如下:

export default class Settings extends React.PureComponent {
    constructor() {
        super()
        this.state = {
            questionText: ''
        }
    }

    connect() {

        console.log('connected');
        var socket = new WebSocket('ws://127.0.0.1:8000/users/');
        socket.onopen = function open() {
            console.log('WebSockets connection created.');

        }

        socket.onmessage = function message(event) {
            var data = JSON.parse(event.data);

            var username = encodeURI(data['username']);
            var question = encodeURI(data['question']);
            console.log('username: ' + username);
            console.log('question: ' + question);
            this.setState({ questionText: question });
            console.log('state: ' + this.state.questionText);

        }
    }


    render() {
        return (
            <View style={styles.container}>
                <Text>{this.state.questionText}</Text>
                <Button
                    title = "Connect"
                    onPress = {this.connect} />
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        backgroundColor: '#EFEFF4',
        alignItems: 'center',
        justifyContent: 'center', 
        flex: 1,
    },
});
导出默认类设置扩展React.PureComponent{
构造函数(){
超级()
此.state={
问题文本:“”
}
}
连接(){
console.log('connected');
var socket=newwebsocket('ws://127.0.0.1:8000/users/');
socket.onopen=函数打开(){
log('WebSockets连接已创建');
}
socket.onmessage=函数消息(事件){
var data=JSON.parse(event.data);
var username=encodeURI(数据['username']);
var-question=encodeURI(数据['question']);
console.log('用户名:'+用户名);
console.log('问题:'+问题);
this.setState({questionText:question});
console.log('state:'+this.state.questionText);
}
}
render(){
返回(
{this.state.questionText}
);
}
}
const styles=StyleSheet.create({
容器:{
背景颜色:“#EFEFF4”,
对齐项目:“居中”,
为内容辩护:“中心”,
弹性:1,
},
});
当从后端发送消息并按预期将用户名和问题打印到控制台时,将调用on message函数。然而,状态没有改变,我在
this.setState({questionText:question})之后放置的任何代码也没有运行


该行似乎导致了一些问题,但是控制台上没有打印错误。我相信一旦状态发生变化,我所呈现的文本组件也会发生变化。

尝试将函数转换为箭头函数
this.setState
在您设置的上下文中可能未定义。将函数更改为箭头函数可使
具有词汇范围

...
    connect = () => {

        console.log('connected');
        var socket = new WebSocket('ws://127.0.0.1:8000/users/');
        socket.onopen = function open() {
            console.log('WebSockets connection created.');

        }

        socket.onmessage = (event) => {
            var data = JSON.parse(event.data);

            var username = encodeURI(data['username']);
            var question = encodeURI(data['question']);
            console.log('username: ' + username);
            console.log('question: ' + question);
            this.setState({ questionText: question });
            console.log('state: ' + this.state.questionText);

        }
    }
...
如果不想使用箭头函数,还可以使用
.bind
确保
正确

export default class Settings extends React.PureComponent {
    constructor() {
        super()
        this.state = {
            questionText: ''
        }
        this.connect.bind(this);
    }

    connect() {

        console.log('connected');
        var socket = new WebSocket('ws://127.0.0.1:8000/users/');
        socket.onopen = function open() {
            console.log('WebSockets connection created.');

        }

        socket.onmessage = function message(event) {
            var data = JSON.parse(event.data);

            var username = encodeURI(data['username']);
            var question = encodeURI(data['question']);
            console.log('username: ' + username);
            console.log('question: ' + question);
            this.setState({ questionText: question });
            console.log('state: ' + this.state.questionText);

        }.bind(this)
    }
...