0

0

立即吸引用户:在 React SPA 中嵌入交互式演示

聖光之護

聖光之護

发布时间:2025-01-10 08:13:47

|

734人浏览过

|

来源于php中文网

原创

如果一张图片胜过千言万语,那么一个交互式演示的价值……岂止百万?

您是否喜欢通过冗长的说明文字来了解应用程序的功能?可能不会。我不想为我的最新项目 Wanna 撰写过多的赘述。因此,我寻求了一种更具吸引力的解决方案:将我的应用程序嵌入到登录页面中,供用户直接体验!

立即吸引用户:在 React SPA 中嵌入交互式演示

这段 GIF 包含 263 帧,所以我猜它相当于 263,000 个字

实现

借助 React 的可组合性,我们几乎可以简单地渲染根应用程序组件并结束:

<code class="javascript">export const interactiveDemo = () => {
    return (
        <App />
    )
}</code>

但是,您可能会遇到一些问题:

  1. 演示应用程序的导航会跳转到真实应用程序。
  2. 演示应用程序会检索真实数据,这可能导致失败或无法有效地展示其功能。
  3. 用户可能不清楚他们正在查看的是什么。

让我们逐一解决这些问题。我使用了 React Router v6 和 Apollo GraphQL,但无论您使用何种技术,这些概念都是通用的。

导航

为了将演示应用程序的导航与真实应用程序隔离开来,我们将其封装在另一个导航提供程序中:

<code class="javascript">+import { MemoryRouter, UNSAFE_LocationContext } from 'react-router'

export const interactiveDemo = () => {
    return (
+       // 解决嵌套 MemoryRouter 在 BrowserRouter 内的问题。
+       // https://github.com/remix-run/react-router/issues/7375
+       <UNSAFE_LocationContext.Provider value={null}>
+           <MemoryRouter initialEntries={['/app']}><App /></MemoryRouter>
+       </UNSAFE_LocationContext.Provider>
    )
}</code>

请注意,我们使用了 MemoryRouter,以便在演示内部导航时浏览器保持在同一页面上。

数据

为了向演示应用程序提供模拟数据,我们在客户端应用程序内维护一个模拟的“后端”,并通过模拟客户端或服务器(取决于您的实现)为其提供服务。这最大限度地减少了对应用程序其余部分的影响,甚至允许我们使用演示进行手动测试——在快速迭代时非常方便。

我使用了 mock-apollo-client;对于 REST 或 tRPC,您可以使用类似 nock 的工具。这些工具通常用于自动化测试,但它们正是我们所需要的。

中解商务通
中解商务通

实时捕捉 一旦访问者打开您的网站,系统会立即显示,这时您就可以查看用户的信息,如:来自搜索引擎关键词、友情链接或直接访问;访问者的IP地址,所在地区,正在访问哪个网页;以及访问者使用的操作系统、浏览器、显示器屏幕分辨率颜色深度等。 主动出击 变被动为主动,可以主动邀请访问者进行洽谈勾通,帮助客户深入了解您的企业和产品,同时获得对方的采购意向、联系方式等信息。 互动交流 主动销售和在线客服合二为一,

下载

首先,我们创建一个模拟客户端,其请求处理程序以模仿真实后端的方式查询和修改演示数据:

<code class="javascript">import { InMemoryCache } from '@apollo/client'
import { createMockClient, createMockSubscription } from 'mock-apollo-client'
import { useMemo, useState } from 'react'
// 您的客户端发送到真实服务器的 GraphQL 文档
import getFriends from '../../gql/getFriends.gql'
import addFriend from '../../gql/addFriend.gql'

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

    // 缓存应该在客户端之间持久化
    const cache = useMemo(() => {
        // 应该与您提供给真实 Apollo 客户端的缓存配置相同
        return new InMemoryCache()
    }, [])

    // 每当数据更改时,我们都需要重新创建模拟客户端,
    // 因为它不支持重置请求处理程序。
    const mockClient = useMemo(() => {
        const client = createMockClient({ cache })

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

        return client
    }, [friends])

    return mockClient
}</code>

然后,就像我们对导航所做的那样,我们使用模拟客户端将演示封装在新的提供程序中:

<code class="javascript">+import { ApolloProvider } from '@apollo/client'

export const interactiveDemo = () => {
+   const mockClient = useDemoClient()
    return (
+       <ApolloProvider client={mockClient}>
+           <UNSAFE_LocationContext.Provider value={null}>
+               <MemoryRouter initialEntries={['/app']}><App /></MemoryRouter>
+           </UNSAFE_LocationContext.Provider>
+       </ApolloProvider>
    )
}</code>

如果您使用模拟服务器,则可以将其 URL 注入演示应用程序的真实客户端。

视觉效果

它有效!那么我们如何让用户清楚地知道他们正在查看交互式演示呢?

我更倾向于移动优先,因此我选择在一个手机框架内渲染演示。我使用了 devices.css,因为它提供了我认为外观最佳的设备(即最小边框以最大化演示空间)。但为了简单起见,这里我们将使用一个开箱即用支持 React 的库:react-device-frameset

我们还可以使用缩放来缩小演示 UI,并将其很好地嵌套在页面的其余部分中。在 Wanna 中,当使用 <canvas></canvas> 和 visjs-html-nodes 绘制被邀请者图时,我必须反转并解释这种缩放,但在大多数情况下它“正常工作”。

<code class="javascript">+import { DeviceFrameset } from 'react-device-frameset'
+import 'react-device-frameset/styles/marvel-devices.min.css'

export const interactiveDemo = () => {
    const mockClient = useDemoClient()
    return (
+       <DeviceFrameset device="iPhone X" style={{ zoom: 0.8 }}>
+           <ApolloProvider client={mockClient}>
+               <UNSAFE_LocationContext.Provider value={null}>
+                   <MemoryRouter initialEntries={['/app']}><App /></MemoryRouter>
+               </UNSAFE_LocationContext.Provider>
+           </ApolloProvider>
+       </DeviceFrameset>
    )
}</code>

最后,添加动画效果会有所帮助,这样它就不会显得像静态图像。例如,Wanna 会在活动的输入字段中不断地幽灵输入建议。

集成

现在我们有了 interactiveDemo 组件,我们将其渲染到登录页面中,就完成了!

<code class="javascript">export const Landing = () => {
    return (
        <div>
            {/* ... */}
+           <interactiveDemo />
            {/* ... */}
        </div>
    )
}</code>

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

23

2026.01.21

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

550

2023.10.23

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

66

2025.12.13

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

216

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

412

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

143

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号