Возможно ли использовать SignalR с React Context без лишних перерисовок всего приложения? - PullRequest
1 голос
/ 24 апреля 2019

Мне трудно понять, как заставить клиент Signalr работать вместе с React Context.Единственное, что я мог придумать, было что-то вроде этого:

import { hubConnection } from 'signalr-no-jquery';

const App: React.FC<any> = () => {
  const oidcToken = useContext(OidcContext);
  // using context for incoming data in App, will cause entire app to rerender, so where else can I put it so 
  // it's available for entire app + has access to context without excess app rerenders?
  const { updateSignalRIncomingData } = useContext(MySignalRDataContext);

  useEffect(() => {
    if (updateSignalRIncomingData && oidcToken) {
      const connection = hubConnection('https://www.someurl.com/hubname');
      connection.qs = { access_token: oidcToken }; // Important: here I rely on context
      const hubProxy = connection.createHubProxy('myhub');

      hubProxy.on('mySignalRDataChannel', (payload) => {
        if (payload) updateSignalRIncomingData(payload); // Important: here I also rely on context
      });

      connection.start({ withCredentials: false })
        .done(() => { console.log('Now connected, connection ID=' + connection.id); })
        .fail(() => { console.log('Could not connect'); });
    }
  }, [updateSignalRIncomingData]);

  return (
    <div>
      App will unfortunately rerender multiple times because signalR 
      requires us to pull in MySignalRDataContext
    </div>
  );
}

Но проблема здесь в том, что наличие этого внутри приложения означает, что мне нужно иметь useContext(MySignalRDataContext), так как от этого зависит hubConnection.И все они чертовски свободны от тонны перерисовок приложений из-за того, как работает Context.Не должно быть никакого useContext / consumer в компоненте приложения, поэтому где еще я могу поместить его, чтобы он мог получить доступ к контексту, создается только один раз для жизненного цикла всего приложения?

Примечание: из-засовместимость с сервером (сервер использует старую версию SignalR, отличную от asp.net-core). Я не могу использовать @ aspnet / signalr для npm, но должен использовать signalr-no-jquery или пакет signalr npm.

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