"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 즉시 사용자 참여 : React Spa에 대화식 데모를 포함시킵니다.

즉시 사용자 참여 : React Spa에 대화식 데모를 포함시킵니다.

2025-02-06에 게시되었습니다
검색:814

그림이 천 단어의 가치가 있다면 대화식 데모는 가치가 있어야합니다 ... 백만?

앱의 목적을 이해하기 위해 유행어를 스크롤하는 것을 즐기십니까? 아마. 그리고 나는 나의 최신 열정 프로젝트 인 Wanna를 위해 그 모든 멍청이를 쓰지 않았다. 그래서 나는 더 흥미로운 솔루션을 추구했습니다. 사용자가 탐색 할 수 있도록 자체 방문 페이지 내부의 앱을 둥지!

Engage Users Instantly: Embed an Interactive Demo in your React SPA

이 GIF는 263 프레임을 가지고 있으므로 263,000 단어의 가치가 있다고 생각합니다

구현

React의 composability 덕분에 우리는 거의 단순히 루트 앱 구성 요소를 렌더링하고 하루를 호출 할 수 있습니다 :

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

그러나 몇 가지 문제가 발생할 것입니다 :

  1. 데모 앱의 내비게이션은 실제 앱을 탐색합니다
  2. 데모 앱은 실제 데이터를 검색하여 실패하거나 잘 표시되지 않을 수 있습니다
  3. 사용자가보고있는 내용이 분명하지 않을 수 있습니다

그것들을 해결합시다. React Router v6 및 Apollo GraphQL을 사용하고 싶지만 개념은 기술에 관계없이 적용됩니다.

항해

실제 앱에서 데모 앱의 탐색을 분리하려면 다른 내비게이션 제공 업체 안에 래핑합니다.

 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
        
            
                
            
        
    )
}
}> )) }

참고 메모리 로터를 사용하여 브라우저가 같은 페이지에 유지되는 동안 데모는 내부적으로 탐색합니다.

데이터

데모 앱에 가짜 데이터를 제공하기 위해, 우리는 클라이언트 앱 내부의 가짜 "백엔드"를 사용하여 Mock 클라이언트 또는 서버를 통해 (구현에 따라) 제공합니다. 그것은 앱 코드의 나머지 부분에 최소 침습적이며 수동 테스트에 데모를 사용할 수 있습니다. 빠르게 반복 할 때 매우 편리합니다.

나는 Mock-Apollo-Client를 사용했습니다. REST 또는 TRPC의 경우 Nock과 같은 것을 사용할 수 있습니다. 그들은 자동화 된 테스트를 의미하지만 여기서 우리가 필요로하는 것입니다.


먼저, 우리는 실제 백엔드를 모방하는 방식으로 요청 처리기 쿼리 및 데모 데이터를 돌연변이하는 모의 클라이언트를 만듭니다.

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
}
'@apollo/client'에서 {inmemoryCache} 가져 오기 {inmemoryCache} 'mock-apollo-client'에서 {createmockclient, createmocksubscription} import 'react'에서 {usememo, usestate} 가져 오기 // 클라이언트가 실제 서버로 보내는 GraphQL 문서 '../../gql/getfriends.gql'에서 get_friends import get_friends '../../gql/addfriend.gql'에서 add_friend import add_friend // 단순화 된 예 const usedemoclient = () => {내보내기 const [친구, setfriends] = usestate [{ __typename : '사용자', ID : 1, 이름 : 'Nick', }] // 캐시는 클라이언트에서 지속되어야합니다 const cache = usememo (() => { // 실제 아폴로 클라이언트와 제공하는 동일한 캐시 구성이어야합니다. 새로운 InmemoryCache () 반환 }, []) // 데이터가 변경 될 때마다 모의 클라이언트를 재현해야합니다. // 요청 핸들러 재설정을 지원하지 않기 때문입니다. const mockclient = usememo (() => { const client = createmockclient ({cache}) client.setRequestHandler (get_friends, () => Promise.Resolve ({{ 데이터 : { 친구 : 친구 } })) client.setRequestHandler (add_friend, ({user}) => { setfriends ((prev) => prev.concat ([user])) Return Promise.resolve ({{ 데이터 : { 추가 친구 : 사용자 } }) }) 반환 클라이언트 }, [친구]) 모의 클라이언트를 반환하십시오 }


그런 다음 내비게이션과 마찬가지로, 우리는 모의 클라이언트와 함께 새로운 제공 업체에 데모를 랩핑합니다 :

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
}
'@apollo/client'에서 {apolloprovider} 가져 오기 ConstractivedEmo = () => {내보내기 const democlient = usedemoclient () 반품 ( }> )) }

대신 Mock Server를 사용한 경우 Demo App의 실제 클라이언트에 URL을 주입합니다.

비주얼

작동합니다! 이제 사용자에게 대화식 데모를보고 있음을 어떻게 분명하게 만들까요?

Wanna는 모바일 우선입니다. 그래서 나는 전화 프레임 내부에서 데모를 렌더링하기로 결정했습니다. 나는 가장 잘 보이는 장치를 제공하기 때문에 devices.css를 사용했습니다 (즉, 데모 공간을 극대화하기 위해 최소한의 베젤). 그러나 간단하게하기 위해 여기에서 우리는 반응을 지원하는 라이브러리를 사용합니다 : react-device-frameset.

Zoom을 사용하여 데모 UI를 축소하고 나머지 페이지 내부에 멋지게 둥지를 맡자. Wanna는 Visjs-HTML-Nodes와 함께 를 사용할 때이 줌을 반전시키고 설명해야했지만 초대 그래프를 그리거나 대부분 "그냥 작동"합니다.
 import { DeviceFrameset } from 'react-device-frameset'
 import 'react-device-frameset/styles/marvel-devices.min.css'

export const InteractiveDemo = () => {
    const demoClient = useDemoClient()
    return (
        



Lastly, it helps to have an animation so it's clearly not a static image. For example, Wanna continually ghost-types suggestions in the activity input field.

Integration

Now that we have our InteractiveDemo component, we render it inside our landing page and we're done!

export const Landing = () => {
    return (
        
{/* ... */} {/* ... */}
) }
const 랜딩 내보내기 = () => { 반품 (
{/ * ... */} {/ * ... */}
)) }

릴리스 선언문 이 기사는 https://dev.to/nick_van_dyke/engage-users-instally-enstally-embed-an- interactive-in-in-your-react-spa-2cf1에서 재 인쇄되었습니다. @163.com 삭제
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3