Мне трудно понять, как заставить клиент 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.