”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 立即吸引用户:在您的React Spa中嵌入交互式演示

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

发布于2025-02-06
浏览:114

如果图片值得一千个单词,那么一个交互式演示必须值得...一百万? 您喜欢通过流行语滚动以了解应用程序的目的吗?可能不是。而且我不在乎为我的最新激情项目Wanna写所有这些泡沫。因此,我追求了一个更有趣的解决方案:将我的应用程序嵌入其自己的着陆页中供用户探索! [2

这个GIF具有263帧,所以我想它值263,000个单词

执行

感谢React的合成性,我们可以

只需渲染我们的root App组件并将其称为一天:Engage Users Instantly: Embed an Interactive Demo in your React SPA

导出const InteractiveMo =()=> { 返回 ( ) }
但是,您会遇到一些问题:

演示应用程序的导航将导航真实的应用

演示应用程序将检索真实数据,该数据可能会失败或不显示它
对于用户所看的

的内容可能并不明显
export const InteractiveDemo = () => {
    return (
        
    )
}
让我们解决这些问题。 Wanna使用React路由器V6和Apollo GraphQl,但是这些概念都适用于技术。

导航

    要将演示应用程序的导航与真实应用程序分开,我们将其包装在另一个导航提供商中:
  1. }> ) }
  2. 注意我们使用了一个内存曲线,因此演示内部导航时,浏览器保留在同一页面上。
  3. 数据

为了向演示应用提供假数据,我们使用usestate在客户端应用程序中维护一个假的“后端”,并通过模拟客户端或服务器(取决于实现)。它对其余的APP代码的侵入性最少,甚至让我们使用演示进行手动测试 - 快速迭代时非常方便。

我使用了Mock-apollo-client;对于休息或TRPC,您可以使用诸如Nock之类的东西。它们是用于自动测试的,但正是我们在这里需要的。

首先,我们创建了一个模拟客户端,其请求处理查询并突变演示数据,以模仿真正的后端:


= usestate [{ __Typename:“用户”, ID:1, 名称:'nick', ]] //缓存应持续到客户端 const cache = usememo(()=> { //应与您提供给真正的Apollo客户端的缓存配置相同 返回新的inmemorycache() },[]) //我们需要在数据更改时重新创建模拟客户端 //因为它不支持重置请求处理程序。 const oighclient = usememo(()=> { const client = createMockclient({cache}) client.setrequesthandler(get_friends,()=> promise.resolve({{ 数据: { 朋友:朋友 } }))) client.setRequesthandler(add_friend,({user})=> { setFriends(((prev)=> prev.concat([[user]))) 返回Promise.sroove({ 数据: { 添加朋友:用户 } })) })) 返回客户端 }, [朋友们]) 返回模拟者 }
 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
        
            
                
            
        
    )
}
然后,就像我们对导航所做的一样,我们与模拟客户端一起将演示包装在新的提供商中:

}> ) }

如果您使用模拟服务器,则将其URL注入Demo App的真实客户端。

视觉效果

有用!现在,我们如何使用户显而易见他们正在查看交互式演示?

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
}

最后,有一个动画有帮助,因此显然不是静态图像。例如,想在活动输入字段中不断提出的幽灵类型建议。

一体化
export const InteractiveDemo = () => {
    return (
        
    )
}
现在我们拥有InteractiveMo组件,我们将其渲染到我们的着陆页中,我们完成了!

导出const landing =()=> { 返回 (
{/ * ... */} {/ * ... */}
) }

版本声明 本文转载于:https://dev.to/nick_van_dyke/engage-users-instantly-embed-an-interactive-demo-in-your-react-spa-2cf1?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何用CSS Hack精准锁定IE11浏览器?
    如何用CSS Hack精准锁定IE11浏览器?
    如何针对IE 11专门使用CSS hacks 一种方法涉及使用@media all and and and(-ms-s-high-high-contrast:none)规则。该规则针对所有具有高对比度模式的浏览器。由于这是一个特定于Microsoft的功能,因此它将仅匹配IE 10和IE 11。在...
    编程 发布于2025-04-07
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 ; $ date->修改('1个月'); //前进1个月 echo $ date->...
    编程 发布于2025-04-07
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-04-07
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-07
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-07
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-04-07
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-07
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-04-07
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-04-07
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-07
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-04-07
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html posite:sticky; sticky; .Sticky-1 {[ top:1em; z-index:1; 1; { display:gr...
    编程 发布于2025-04-07
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-04-07
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-07
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3