This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Вопрос Передача данных с сервера на клиент (react)

Dima412

Новый участник
15 Авг 2023
7
0
1
Приветствую, как передать данные с сервера на клиент ? Например количество денег у игрока, как мне передать значение на клиент и вставить в react ? Использую: react, nodejs
 
Последнее редактирование:

akudinov28

Старожил
24 Фев 2021
404
201
106
Не работал с реактом, но полагаю, что схема взаимодействия не сильно отличается от vue.

Во время инициализации экземпляра запихиваем его в глобальную переменную window:
JavaScript:
// vue/src/main.js
import Vue from 'vue'

window.app = new Vue().mount('#app')

Дальше в идеале нам нужно какое-нибудь хранилище состояний (в моем случае pinia). Создаем хранилище и добавляем :

JavaScript:
// vue/src/stores/server.j
import { defineStore } from 'pinia'

export const useServerStore = defineStore('server', {
  state: () => {
    return { online: 0 }
  },
  actions: {
    changeOnline(online) {
      this.online = online;
    },
  },
})

В корневом компоненте App.vue привязываем хранилище:

JavaScript:
// vue/src/App.vue
import { useServerStore } from '@/stores/server'

export default {
    name: 'App',
    setup(){
        const server = useServerStore();
        return {server}
    }
}

После этого можно с клиента вызывать хранилище, привязанное к корневому компоненту:

JavaScript:
// client_packages/index.js

let browser = mp.browsers.new("package://index.html");
browser.execute(`window.app.$root.server.changeOnline(35);`);

Писал с телефона и по памяти, могут быть ошибки и опечатки. Код очень примерный и предназначен не для копирования, а для общего понимания схемы взаимодействия.
 
Реакции: XDeveluxe и youngBeaver

youngBeaver

Покинул форум.
BackEnd developer
24 Янв 2023
1,173
463
171
я не шарю за реакт, но разве есть проблема в создании переменной и передачи в нее информации через execute?

JavaScript:
// cef
let online = 0;

//client
browser.execute(`online = ${onlineFromServer}`);
 

kirillzver

Гуру
BackEnd developer
2 Ноя 2020
190
117
104
Присылай полноценный листинг кода, который ты задействуешь для того, чтобы выполнить поставленную задачу, и мы тебе подскажем в каком момент нужно что-то подправить/добавить.
 

kirillzver

Гуру
BackEnd developer
2 Ноя 2020
190
117
104
Максимально примитивный пример.

На клиенте добавляешь эвент:
JavaScript:
mp.events.add("hud.update.online", online => {
    browser.call("hud.update.online", online);
});
Соответственно с сервера будешь его вызывать посредством player.call и передачей туда необходимых аргументов.

В CEF импортишь следующие, если его нет:
JavaScript:
import React, { useState, useEffect } from 'react';

В начало function App() {...}, вместо своего var HUD = {...} вставляешь:
JavaScript:
const [online, setOnline] = useState(0);

useEffect(() => {
    // подписываемся на событие при монтировании компонента
    mp.events.add("hud.update.online", online => setOnline(online)); // стрелочная функция для наглядности

    // отписываемся при размонтировании
    return () => {
        mp.events.remove("hud.update.online");
    }
}, []);

Опять таки, нерационально подписываться таким образом на обновление онлайна.
В идеале для этого использовать менеджер состояний, например redux или mobx, откуда подтягивать значение в компонент.
 
Реакции: youngBeaver