Функциональный компонент React делает снимок состояния во время регистрации обработчика в websocket - PullRequest
0 голосов
/ 21 сентября 2019
Функциональный компонент

реагирует на снимок состояния во время подписки.

Например,Код PFB.

Если я нажимаю кнопку setSocketHandler, а затем нажимаю кнопку setWelcomeString.Теперь, если я получаю сообщение через сокет, когда я регистрирую строку приветствия, она пуста.

Но если я нажму кнопку setWelcomeString, а затем нажму кнопку setSocketHandler.Теперь, если я получаю сообщение на сокете, Welcome регистрируется на консоли.

Я видел такое же поведение в проекте, поэтому просто создал это простое приложение, чтобы доказать.

Если я использую компонент класса, который комментируетсяниже .. все работает отлично.

Поэтому мой вопрос заключается в том, почему функциональный компонент реагирует на состояние во время reg, а не на фактическое состояние в момент получения сообщения.

Этоочень странноКак заставить его работать в функциональном компоненте правильно.

import React, {useEffect, useState} from 'react';
import logo from './logo.svg';
import './App.css';
const io = require('socket.io-client');
const socket = io.connect('http://localhost:3000/');


const App : React.FunctionComponent = () => {

    const [welcomeString, setWelcomeString] = useState("");

    const buttonCliecked = () => {
        console.log("clocked button");
        setWelcomeString("Welcome")
    }


    const onsockethandlerclicked = () => {
        console.log("socket handler clicked");
        socket.on('out', () => {
            console.log("Recived message")
            console.log(welcomeString);
        });
    }

    return (
        <div>
            <header className="component-header">User Registration</header>
            <label>{welcomeString}</label>
            <button onClick={buttonCliecked}>setWelcomeString</button>
            <button onClick={onsockethandlerclicked}>setSocketHandler</button>
        </div>
    );
}

/*class App extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            welcomeString:""
        }
    }


    buttonCliecked = () => {
        console.log("clocked button");
        this.setState({ welcomeString:"Welcome"})
    }


    onsockethandlerclicked = () => {
        console.log("socket handler clicked");
        socket.on('out', () => {
            console.log("Recived message")
            console.log(this.state.welcomeString);
        });
    }

    render() {
        return (
            <div>
                <header className="component-header">User Registration</header>
                <label>{this.state.welcomeString}</label>
                <button onClick={this.buttonCliecked}>setwelcomestring</button>
                <button onClick={this.onsockethandlerclicked}>setSocketHandler</button>
            </div>
        );
    }
}*/


export default App;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...