前幾天,我認識的人傳訊息:
「我發現自己在假期裡試圖向我的兒子解釋投資回報如何透過 Zoom 發揮作用,如果我們都能夠在像 Google Doc 這樣的東西中工作,事情就會變得很容易」
接受挑戰!
在過去的幾天裡,我很高興建立了一個投資回報模擬器,我們可以在其中根據多個參數預測投資回報。
網路上到處都是這樣的網站,但在這個網站中,我想探索如何嵌入協作功能,以及它們如何將人們聚集在一起。
在本指南中,我們將了解如何在短短 10 分鐘內為常規 React 應用程式添加即時協作,而無需編寫任何後端程式碼或處理 Web 套接字。作為獎勵,我們也將探索如何增強協作網站的使用者體驗!
專案的完整原始碼可在 GitHub 上取得
讓我們開始吧!
起點:打好基礎
在深入研究協作功能之前,我們需要堅實的基礎。我首先創建了一個單人遊戲版本,用戶可以在其中輸入他們的投資參數。然後,這些輸入將輸入計算引擎,產生並顯示投資回報預測。
我使用 Bolt.new 來快速啟動和運行。它給我的簡潔設計以及我達到可接受起點的速度給我留下了深刻的印象。儘管領先了很多,但我仍然需要微調一些計算邏輯,並根據自己的喜好調整 UI。
使應用程式具有協作性
單人遊戲版本完成後,我將注意力轉向協作。這個專案提供了一個測試 React Together 的絕佳機會,React Together 是我過去幾個月在 Multisynq 開發的開源程式庫。
React Together 提供了掛鉤和元件,可以實現協作功能,而無需設定後端或管理套接字連接的複雜性。事實證明,實施過程很簡單,儘管它揭示了一些需要改進的地方,我們將在庫的未來版本中解決這些問題。
現在,讓我們逐步完成在我們的應用程式中添加即時協作的三個步驟!啟動你的計時器嗎?
第 1 步:設定 React Together 上下文
第一步是將我們的應用程式包裝在 React Together 上下文提供者中。該元件在幕後處理所有狀態同步和會話管理。
// src/index.tsx import { StrictMode } from 'react' import { ReactTogether } from 'react-together' import { createRoot } from 'react-dom/client' import App from './App.tsx' import './index.css' createRoot(document.getElementById('root')!).render( <strictmode> <reacttogether sessionparams="{{" appid: import.meta.env apikey:> <app></app> </reacttogether> </strictmode>, )
React Together 使用 Multisynq 的基礎架構進行應用程式同步,這需要 API 金鑰。您可以從 multisynq.io/account 取得免費 API 金鑰。別擔心,這些金鑰應該是公開的,因為您可以控制哪些網域可以使用它們。
我們可以將 React Together 設定為在所有使用者進入網站後自動將他們連接到同一個會話。事實上,這將使其成為一個兩步驟指南,但我採用了 Google Docs 風格的方法,其中協作是選擇加入的。使用者保持斷開連接,直到透過點擊按鈕明確建立或加入會話。我們將在本指南的第三步介紹會話管理!
第 2 步:跨用戶同步狀態
設定好 React Together 後,下一步就是同步使用者之間的狀態。這個過程非常簡單:我們只需要將 React 的 useState 鉤子替換為 React Together 的 useStateTogether 鉤子。
useStateTogether 鉤子的工作方式與 useState 類似,但需要一個額外的 rtKey 參數。此鍵唯一標識整個應用程式的狀態,即使在 DOM 層次結構在視窗之間可能不同的響應式佈局中也能確保正確的同步。
以下是轉換的外觀:
// src/index.tsx import { StrictMode } from 'react' import { ReactTogether } from 'react-together' import { createRoot } from 'react-dom/client' import App from './App.tsx' import './index.css' createRoot(document.getElementById('root')!).render( <strictmode> <reacttogether sessionparams="{{" appid: import.meta.env apikey:> <app></app> </reacttogether> </strictmode>, )
// Before import { useState } from 'react' export default function Calculator() { const [startingAmount, setStartingAmount] = useState(20000); const [years, setYears] = useState(25); const [returnRate, setReturnRate] = useState(10); const [compoundFrequency, setCompoundFrequency] = useState("annually"); const [additionalContribution, setAdditionalContribution] = useState(500); const [contributionTiming, setContributionTiming] = useState("beginning"); const [contributionFrequency, setContributionFrequency] = useState("month"); // ... }
這種方法的優點在於應用程式可以繼續像以前一樣工作 - 唯一的區別是現在狀態更新在所有連接的使用者之間同步。
步驟3:新增會話管理
最後一步是為使用者新增一種建立、加入和離開協作會話的方式。我選擇透過計算器上方的標題部分來實現這一點,使每個人都可以輕鬆看到會話控制項。
React Together 透過提供四個基本鉤子使這個過程變得簡單:
- useIsTogether:告訴我們目前是否處於會話中
- useCreateRandomSession:建立一個新的私有會話
- useLeaveSession:與目前會話斷開連接
- useJoinUrl:提供可分享的 URL 供其他人加入
這是標頭組件的簡化版本(我剛剛刪除了類別名稱):
// After import { useStateTogether } from 'react-together' export default function Calculator() { const [startingAmount, setStartingAmount] = useStateTogether("startingAmount", 20000); const [years, setYears] = useStateTogether("years", 25); const [returnRate, setReturnRate] = useStateTogether("returnRate", 10); const [compoundFrequency, setCompoundFrequency] = useStateTogether("compoundFrequency", "annually"); const [additionalContribution, setAdditionalContribution] = useStateTogether("additionalContribution", 500); const [contributionTiming, setContributionTiming] = useStateTogether("contributionTiming", "beginning"); const [contributionFrequency, setContributionFrequency] = useStateTogether("contributionFrequency", "month"); // ... }
透過此實施,使用者現在只需單擊即可啟動協作會話。當有人使用共用 URL 加入時,他們將立即看到與其他人相同的狀態,所有變更都會在所有參與者之間即時同步。
就是這樣,很簡單,而且很有效!而且你可以在 10 分鐘內完成! !
增強協作體驗
雖然基本上同步運作良好,但感覺有些不對勁:頁面上的元素正在「自行」更改,但沒有表明是誰在進行更改。這是協作應用程式中的一個常見挑戰,Google Docs 等工具透過顯示其他使用者正在查看和編輯的位置來解決這個問題。
真正的協作不只是同步狀態,還在於創造一種存在感。使用者需要互相「看到」才能有效地協同工作。
我最初考慮實現共享遊標,讓使用者看到彼此的滑鼠指標。然而,這種方法給響應式 Web 應用程式帶來了挑戰:
- 滑鼠座標在不同視窗大小之間無法清晰映射
- 遊標位置通常缺乏上下文 - 不清楚為什麼使用者的遊標位於特定位置
- 遊標位置的含義在不同的螢幕佈局中可能會不明確
相反,我專注於我們真正希望透過使用者存在實現的目標:
- 幫助使用者感受到他人積極參與
- 顯示每個使用者目前正在查看或編輯的元素
解決方案?突出顯示使用者正在互動的元素。這種方法更簡單、更直觀,並且在所有視窗尺寸上都能可靠地工作。讓我們看看如何在兩個關鍵區域實現這一點:圖表標籤和輸入欄位。
將使用者狀態新增至圖表標籤
讓我們從使用者狀態的簡單實作開始:顯示哪些使用者正在查看每個圖表標籤。
為此,我們需要一種特殊的共享狀態,其中每個用戶都可以擁有自己的值,並且其他人都可以看到。
React Together 透過 useStateTogetherWithPerUserValues 鉤子準確地提供了我們所需要的東西(是的,這實在是太拗口了!)。此掛鉤的工作原理與 useStateTogether 類似,但它不是共用單一值,而是允許每個使用者擁有自己的值,並且對所有參與者都可見。此鉤子回傳三個元素:
- 目前使用者的本地狀態值
- 更新本地狀態的函數
- 包含每個使用者狀態值的物件
以下是我們如何實現此功能以在選項卡旁邊顯示使用者頭像:
// src/index.tsx import { StrictMode } from 'react' import { ReactTogether } from 'react-together' import { createRoot } from 'react-dom/client' import App from './App.tsx' import './index.css' createRoot(document.getElementById('root')!).render( <strictmode> <reacttogether sessionparams="{{" appid: import.meta.env apikey:> <app></app> </reacttogether> </strictmode>, )
在上面的程式碼片段中,我們用 useStateTogetherWithPerUserValues 取代了 useState,應用程式再次像以前一樣繼續工作,但現在每個人都可以看到其他人的狀態!然後我們只需要渲染我們剛剛獲得的新資訊。
此實作在每個標籤旁邊顯示使用者頭像,從而清楚顯示哪些使用者正在查看哪些圖表。我們過濾掉目前使用者的頭像以避免冗餘,因為使用者不需要看到自己的狀態指示器。
在輸入欄位中新增使用者狀態
為輸入欄位新增存在指示器遵循與前面的範例類似的模式,但有一個額外的要求:我們需要追蹤使用者何時開始和停止編輯。幸運的是,Ant Design 的組件為此目的提供了必要的回呼。
對於每個輸入字段,我想要:
- 當其他人正在編輯時顯示彩色邊框
- 右上角顯示編輯頭像
- 在整個應用程式中保持每個使用者的顏色一致
以下是我們如何使用 useStateTogetherWithPerUserValues 鉤子來實現這一點:
// src/index.tsx import { StrictMode } from 'react' import { ReactTogether } from 'react-together' import { createRoot } from 'react-dom/client' import App from './App.tsx' import './index.css' createRoot(document.getElementById('root')!).render( <strictmode> <reacttogether sessionparams="{{" appid: import.meta.env apikey:> <app></app> </reacttogether> </strictmode>, )
雖然程式碼稍長,但原理很簡單:我們只需要追蹤哪些使用者正在編輯每個輸入字段,然後渲染我們想要的視覺化效果。
同樣的方法適用於任何其他輸入類型,例如下拉式選單和滑桿! !
--
就是這樣!有了這個完全協作的投資回報模擬器,我的朋友可以更輕鬆地向他的兒子解釋 Zoom 上的投資回報如何發揮作用。任務完成! ✨
看到創建這種協作網站是多麼容易,讓我想知道當我們在線時,互聯網如何讓我們更加緊密地聯繫在一起......稍後會詳細介紹!
希望您學到新的東西,如果您有任何回饋或問題,請隨時與我們聯繫! !
編碼愉快! ?
- ?現場演示
- ? ?原始碼
- ?一起反應文檔
以上是在幾分鐘內將即時協作添加到您的 React 應用程式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版