"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Engagez les utilisateurs instantanément: intégrez une démo interactive dans votre spa React

Engagez les utilisateurs instantanément: intégrez une démo interactive dans votre spa React

Publié le 2025-02-06
Parcourir:791

Si une image vaut mille mots, alors une démo interactive doit valoir ... un million?

Aimez-vous faire défiler les mots à la mode pour comprendre le but d'une application? Probablement pas. Et je ne me souciais pas d'écrire tout ce blather pour mon dernier projet passionné, Wanna. J'ai donc poursuivi une solution plus intéressante: nid mon application dans sa propre page de destination pour que les utilisateurs puissent explorer!

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

ce gif a 263 images, donc je suppose que cela vaut 263 000 mots

Mise en œuvre

Grâce à la composabilité de React, nous pouvons presque Rendez simplement notre composant d'application racine et l'appelez un jour:

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

Cependant, vous rencontrerez quelques problèmes:

  1. La navigation de l'application de démonstration naviguera dans la vraie application
  2. L'application de démonstration récupérera les données réelles, qui peuvent échouer ou ne pas la présenter bien
  3. Il n'est peut-être pas évident pour les utilisateurs ce qu'ils regardent

résolvons-les. Je veux utiliser React Router V6 et Apollo GraphQL, mais les concepts s'appliquent quelle que soit la technologie.

Navigation

Pour séparer la navigation de l'application de démon

Importer {MemoryRouter, unsetafe_LocationContext} de 'react-router' export const interactivemo = () => { retour ( // pirater pour nid MemoryRouter à l'intérieur de 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
        
            
                
            
        
    )
}
Remarque Nous utilisons un MemoryRouter pour que le navigateur reste sur la même page tandis que la démo navigue en interne.

Données

Pour fournir à l'application de démonstration de fausses données, nous maintenons un faux "backend" à l'intérieur de l'application client avec UseState et les servons via un simulation client ou serveur (selon l'implémentation). Il est peu invasif pour le reste du code d'application, et nous permet même d'utiliser la démo pour les tests manuels - très pratique lors de l'itération rapidement.

J'ai utilisé Mock-Apollo-Client; Pour le repos ou TRPC, vous pouvez utiliser quelque chose comme Nock. Ils sont destinés aux tests automatisés mais sont exactement ce dont nous avons besoin ici.

Premièrement, nous créons un simulé client dont les gestionnaires de demande interrogent et mutent des données de démonstration d'une manière qui imite le vrai backend:


import {inMemoryCache} de '@ apollo / client' import {CreateMockClient, CreateMockSubScription} de 'Mock-Apollo-Client' import {usememo, usestate} de 'react' // GraphQL documente que notre client envoie au serveur réel Importer get_friends de '../../gql/getfriends.gql' Importez add_friend de '../../gql/addfriend.gql' // Exemple simplifié Export const usedemoClient = () => { const [amis, setfriends] = usestate [{ __TyPename: «utilisateur», ID: 1, Nom: «Nick», }] // Le cache doit persister entre les clients const cache = useMemo (() => { // devrait être la même configuration de cache que vous fournissez à votre vrai client Apollo Renvoie un nouveau InMemoryCache () }, []) // Nous devons recréer le simule client chaque fois que les données changent // car il ne prend pas en charge les gestionnaires de demande de réinitialisation. const MockClient = useMemo (() => { const client = CreateMockClient ({cache}) client.setRequestHandler (get_friends, () => promesse.resolve ({ données: { Amis: Amis } })) client.setRequestHandler (add_friend, ({user}) => { setFriends ((prev) => prev.concat ([utilisateur])) return promed.resolve ({ données: { Ajouter un ami: utilisateur } }) }) Client de retour }, [amis]) Retour MockClient }
 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
        
            
                
            
        
    )
}
Ensuite, tout comme nous l'avons fait avec la navigation, nous enroulons notre démo dans un nouveau fournisseur avec notre simule client:


import {apolloprovider} de '@ apollo / client' export const interactivemo = () => { const Democlient = usedMoClient () retour ( 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
        
            
                
            
        
    )
}
Si vous avez plutôt utilisé un simulation de serveur, vous injecteriez son URL dans le vrai client de l'application de démonstration.

Visuels

Ça marche! Maintenant, comment pouvons-nous rendre évident à l'utilisateur qu'ils affichent une démo interactive?

Je veux est mobile d'abord, j'ai donc choisi de rendre la démo dans un cadre téléphonique. J'ai utilisé des dispositifs.css car il offre les appareils que je pensais être le mieux (c'est-à-dire une lunette minimale pour maximiser l'espace de démonstration). Mais pour simplifier, nous utiliserons ici une bibliothèque qui prend en charge React hors de la boîte: React-Device-FrameSet.

utilisons également Zoom pour rétrécir l'interface utilisateur de démonstration et le nid bien dans le reste de la page. Dans Wanna, j'ai dû inverser et rendre compte de ce zoom lors de l'utilisation de avec Visjs-HTML-NODES pour dessiner le graphique de l'invitation, mais pour la plupart, il "fonctionne juste".


import {deviceFrameset} à partir de 'react-device-frameset' Importez «React-Device-FrameSet / Styles / Marvel-Devices.min.css» export const interactivemo = () => { const Democlient = usedMoClient () retour (
 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 (
        
{/* ... */} {/* ... */}
) }
Déclaration de sortie Cet article est réimprimé sur: https://dev.to/nick_van_dyke/engage-users-instativement-embed-an-interactive-demo-in-your-react-spa-2cf1?1 s'il y a une contrefaçon, veuillez contacter Study_golang @ 163.com Supprimer
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3