「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ユーザーを即座にエンゲージします:ReactSpaにインタラクティブなデモを埋め込みました

ユーザーを即座にエンゲージします:ReactSpaにインタラクティブなデモを埋め込みました

2025-02-06に投稿しました
ブラウズ:917

写真が千の言葉の価値がある場合、インタラクティブなデモは価値がなければなりません... アプリの目的を理解するために、流行語をスクロールするのが好きですか?おそらくそうではありません。そして、私は私の最新の情熱プロジェクトのために、すべての勇敢さを書くことを気にしませんでした。だから私はより興味深いソリューションを追求しました:私のアプリを独自のランディングページにネストして、ユーザーが探索するために!

Engage Users Instantly: Embed an Interactive Demo in your React SPAこのgifには263フレームがあるので、263,000語の価値があると思います

実装

Reactの複合性のおかげで、

ほぼ

ルートアプリコンポーネントをレンダリングして1日と呼ぶことができます:
Export const interactivedemo =()=> { 戻る ( )) }

export const InteractiveDemo = () => {
    return (
        
    )
}

デモアプリのナビゲーションは、実際のアプリ
    をナビゲートします
  1. デモアプリは実際のデータを取得します。
  2. ユーザーが何を見ているのかは明らかではないかもしれません
  3. それらを解決しましょう。 React Router V6とApollo GraphQLを使用したいのですが、テクノロジーに関係なく概念は適用されます。
ナビゲーション

デモアプリのナビゲーションを実際のアプリから分離するには、別のナビゲーションプロバイダーにラップします。

Import {MemoryRouter、unsafe_locationContext} const const interactivedemo =()=> { 戻る ( // browserrouter内のメモリルーターをネストするハック。 // https://github.com/remix-run/react-router/issues/7375 )) }


注MemoryRouterを使用して、デモが内部的にナビゲートする間、ブラウザが同じページに残るように使用します。

 import { MemoryRouter, UNSAFE_LocationContext } from 'react-router'

export const InteractiveDemo = () => {
    return (
        // Hack to nest MemoryRouter inside BrowserRouter.
        // https://github.com/remix-run/react-router/issues/7375
        
            
                
            
        
    )
}

デモアプリに偽のデータを提供するために、Client Appを使用してクライアントアプリ内に偽の「バックエンド」を維持し、モッククライアントまたはサーバーを介して(実装に応じて)提供します。これは、残りのアプリコードに最小限に浸潤しているため、手動テストにデモを使用することもできます。

私はmock-apollo-clientを使用しました。 RESTまたはTRPCの場合、Nockのようなものを使用する場合があります。それらは自動テスト用のものですが、まさにここで必要なものです。

最初に、リクエストハンドラーが実際のバックエンドを模倣する方法でデモデータをクエリして変異させるモッククライアントを作成します:

'@apollo/client'から{inmemorycache}をimport Import {mock-apollo-client」から{createmockclient、createmocksubscription} {usememo、usestate}から「react」からインポート //クライアントが実際のサーバーに送信するGraphQLドキュメント '..///gql/getfriends.gql'からget_friendsをインポートする '../../gql/addfriend.gql'からadd_friendをインポートする //簡素化された例 const constemoclient =()=> {export const [friends、setfriends] = uesestate [{ __typename: 'user'、 ID:1、 名前:「ニック」、 }] //キャッシュはクライアント間で持続する必要があります const cache = usememo(()=> { //実際のApolloクライアントに提供する同じキャッシュ構成である必要があります 新しいinmemorycache()を返します }、[]) //データが変更されるたびにモッククライアントを再作成する必要があります //リセットリクエストハンドラーをサポートしていないためです。 const mockclient = usememo(()=> { const client = createmockclient({cache}) client.setRequestHandler(get_friends、()=> promise.resolve({{ データ: { 友達:友達 } })) client.setRequestHandler(add_friend、({user})=> { setfriends((prev)=> prev.concat([user])) promise.resolveを返す({ データ: { AddFriend:ユーザー } }) }) クライアントを返します }、 [友達]) mockclientを返します }

その後、ナビゲーションを使用したように、モッククライアントでデモを新しいプロバイダーに包みます:

import { InMemoryCache } from '@apollo/client'
import { createMockClient, createMockSubscription } from 'mock-apollo-client'
import { useMemo, useState } from 'react'
// GraphQL documents that our client sends to the real server
import GET_FRIENDS from '../../gql/getFriends.gql'
import ADD_FRIEND from '../../gql/addFriend.gql'

// Simplified example
export const useDemoClient = () => {
    const [friends, setFriends] = useState[{
        __typename: 'User',
        id: 1,
        name: 'Nick',
    }]

    // Cache should persist across clients
    const cache = useMemo(() => { 
        // Should be the same cache configuration you provide to your real Apollo client
        return new InMemoryCache() 
    }, [])

    // We need to recreate the mock client whenever the data changes
    // because it doesn't support resetting request handlers.
    const mockClient = useMemo(() => {
        const client = createMockClient({ cache })

        client.setRequestHandler(GET_FRIENDS, () => Promise.resolve({
            data: {
                friends: friends
            }
        }))
        client.setRequestHandler(ADD_FRIEND, ({ user }) => {
            setFriends((prev) => prev.concat([user]))
            return Promise.resolve({
                data: {
                    addFriend: user
                }
            })
        })

        return client
    }, [friends])

    return mockClient
}

代わりにモックサーバーを使用した場合、そのURLをデモアプリの実際のクライアントに挿入します。

ビジュアル
 import { ApolloProvider } from '@apollo/client'

export const InteractiveDemo = () => {
    const demoClient = useDemoClient()
    return (
         
            
                
                    
                
            
        
    )
}
それは動作します!ここで、どのようにしてユーザーがインタラクティブなデモを表示していることを明らかにしますか?

Wanna Wannaはモバイルファーストなので、電話フレーム内でデモをレンダリングすることにしました。 Devices.cssを使用しました。これは、Devicesssが最もよく見えると思ったデバイスを提供しているためです(つまり、デモスペースを最大化するために最小限のベゼル)。しかし、簡単にするために、ここでは、すぐに反応するbox:React-device-framesetをサポートするライブラリを使用します。

また、ズームを使用してデモを縮小し、ページの残りの部分内にうまくネストします。 bisjs-html-nodesを使用してを使用して招待者グラフを描くときに、このズームを反転して説明する必要がありましたが、ほとんどの場合、「ただ機能」しました。

'react-device-frameset'から{deviceFrameset}をimport Import 'React-Device-Frameset/Styles/Marvel-Devices.min.css' const const interactivedemo =()=> { const democlient = usedemoclient() 戻る (

最後に、アニメーションを使用するのに役立ち、明らかに静的な画像ではありません。たとえば、アクティビティ入力フィールドで継続的にゴーストタイプの提案をしたい。


統合

操作コンポーネントがあるので、ランディングページ内にレンダリングし、完了です!

エクスポートconst landing =()=> { 戻る (
{/ * ... */} {/ * ... */}
)) }


リリースステートメント この記事は、https://dev.to/nick_van_dyke/engage-users-instyly-maded-an-interactive-demo-in-your-reactive-spa-2cf1?1に転載されています。 @163.com delete
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3