首頁 web前端 js教程 在幾分鐘內將即時協作添加到您的 React 應用程式

在幾分鐘內將即時協作添加到您的 React 應用程式

Jan 03, 2025 pm 08:56 PM

前幾天,我認識的人傳訊息:

「我發現自己在假期裡試圖向我的兒子解釋投資回報如何透過 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['VITE_APP_ID'],
      apiKey: import.meta.env['VITE_API_KEY'],
    }}>
      <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['VITE_APP_ID'],
      apiKey: import.meta.env['VITE_API_KEY'],
    }}>
      <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:新增會話管理

最後一步是為使用者新增一種建立、加入和離開協作會話的方式。我選擇透過計算器上方的標題部分來實現這一點,使每個人都可以輕鬆看到會話控制項。

Add Real-Time Collaboration to Your React App in Minutes

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 應用程式帶來了挑戰:

  • 滑鼠座標在不同視窗大小之間無法清晰映射
  • 遊標位置通常缺乏上下文 - 不清楚為什麼使用者的遊標位於特定位置
  • 遊標位置的含義在不同的螢幕佈局中可能會不明確

相反,我專注於我們真正希望透過使用者存在實現的目標:

  1. 幫助使用者感受到他人積極參與
  2. 顯示每個使用者目前正在查看或編輯的元素

解決方案?突出顯示使用者正在互動的元素。這種方法更簡單、更直觀,並且在所有視窗尺寸上都能可靠地工作。讓我們看看如何在兩個關鍵區域實現這一點:圖表標籤和輸入欄位。

將使用者狀態新增至圖表標籤

讓我們從使用者狀態的簡單實作開始:顯示哪些使用者正在查看每個圖表標籤。

Add Real-Time Collaboration to Your React App in Minutes

為此,我們需要一種特殊的共享狀態,其中每個用戶都可以擁有自己的值,並且其他人都可以看到。

React Together 透過 useStateTogetherWithPerUserValues 鉤子準確地提供了我們所需要的東西(是的,這實在是太拗口了!)。此掛鉤的工作原理與 useStateTogether 類似,但它不是共用單一值,而是允許每個使用者擁有自己的值,並且對所有參與者都可見。此鉤子回傳三個元素:

  1. 目前使用者的本地狀態值
  2. 更新本地狀態的函數
  3. 包含每個使用者狀態值的物件

以下是我們如何實現此功能以在選項卡旁邊顯示使用者頭像:

// 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['VITE_APP_ID'],
      apiKey: import.meta.env['VITE_API_KEY'],
    }}>
      <App />
    </ReactTogether>
  </StrictMode>,
)
登入後複製
登入後複製
登入後複製
登入後複製

在上面的程式碼片段中,我們用 useStateTogetherWithPerUserValues 取代了 useState,應用程式再次像以前一樣繼續工作,但現在每個人都可以看到其他人的狀態!然後我們只需要渲染我們剛剛獲得的新資訊。

此實作在每個標籤旁邊顯示使用者頭像,從而清楚顯示哪些使用者正在查看哪些圖表。我們過濾掉目前使用者的頭像以避免冗餘,因為使用者不需要看到自己的狀態指示器。

在輸入欄位中新增使用者狀態

為輸入欄位新增存在指示器遵循與前面的範例類似的模式,但有一個額外的要求:我們需要追蹤使用者何時開始和停止編輯。幸運的是,Ant Design 的組件為此目的提供了必要的回呼。

對於每個輸入字段,我想要:

  1. 當其他人正在編輯時顯示彩色邊框
  2. 右上角顯示編輯頭像
  3. 在整個應用程式中保持每個使用者的顏色一致

以下是我們如何使用 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['VITE_APP_ID'],
      apiKey: import.meta.env['VITE_API_KEY'],
    }}>
      <App />
    </ReactTogether>
  </StrictMode>,
)
登入後複製
登入後複製
登入後複製
登入後複製

雖然程式碼稍長,但原理很簡單:我們只需要追蹤哪些使用者正在編輯每個輸入字段,然後渲染我們想要的視覺化效果。

同樣的方法適用於任何其他輸入類型,例如下拉式選單和滑桿! !

--

就是這樣!有了這個完全協作的投資回報模擬器,我的朋友可以更輕鬆地向他的兒子解釋 Zoom 上的投資回報如何發揮作用。任務完成! ✨

看到創建這種協作網站是多麼容易,讓我想知道當我們在線時,互聯網如何讓我們更加緊密地聯繫在一起......稍後會詳細介紹!

希望您學到新的東西,如果您有任何回饋或問題,請隨時與我們聯繫! !

編碼愉快! ?

  • ?現場演示
  • ? ‍?原始碼
  • ?一起反應文檔

以上是在幾分鐘內將即時協作添加到您的 React 應用程式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

前端開發中如何實現類似 VSCode 的面板拖拽調整功能? 前端開發中如何實現類似 VSCode 的面板拖拽調整功能? Apr 04, 2025 pm 02:06 PM

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...

See all articles