前言所见即所得的设计理念在WEB IDE领域里一直是备受瞩目的功能亮点, 也能极大的提高 web coder的编程体验和编程效率. 笔者接下来就将对H5可视化编辑器实时预览真机扫码预览功能做一次方案剖析, 为大家在设计类似产品的时候提供一些思路.
我们还是基于笔者开发的 H5-Dooring可视化编辑器作为案例来分析上述功能实现.
你将收获

  • 实时预览的应用场景和实际案例
  • 画布元素和属性编辑器的实时联动方案
  • 实时预览的一般思路
  • 真机扫码预览的实现思路
  • 基于nodejs中间层实现高可用的实时预览方案

正文
一般情况下实时预览的功能会交给前端来实现, 比如我们经常看到的微信开发者工具的预览, 支付宝小程序的预览, vscode的预览插件, 比较经典的DW也是集成了强大的实时预览功能, 接下来我们看一个H5-Dooring的在线编程的实时预览模块:

H5页面可视化搭建平台中, 我们也希望能实时的看到我们配置页面的效果, 比如改变了某个属性,能在画布中实时生效, 还能在手机上查看真机效果, 提供这一实时预览功能无疑是可视化配置平台的刚需. 如下案例:

PC端模拟手机预览效果:

真机预览入口和效果:

http://io.nainor.com/h5_plus/preview?tid=123456 (二维码自动识别)

所以我们设计实时预览的关键就在于如何高保真的去还原用户在画布中的配置, 让误差和体验做到极致.
接下来笔者将具体介绍如何实现以上几种预览方式,以及如何设计一款高可用的预览方案.


1. 画布元素和属性编辑器的实时联动方案

画布元素和属性编辑器的实时联动方案主要指的是属性编辑器的修改如何实时同步到画布元素中, 抽象为下图概念:

要想实现右边的属性编辑器修改了内容, 画布上能实时更新改动, 我们呢需要实现一种模式, 让左右两边相关联, 也就是“联动”的概念. 我们都知道, 每个可视化组件都对应一个唯一的schema(在H5-Dooring的文章中已经介绍过,感兴趣的朋友可以学习了解), schema的结构类似如下:

{"config": {"color": "#fff","name": "徐小夕"},"editData": [{"type": "Text","key": "name"},{"type": "Color","key": "color"}]
}

一旦设计了这样的数据结构, 我们就可以实现动态渲染编辑器的表单(通过editData), 并且将修改的值同步给组件(通过editData -> config的映射关系).

其次我们需要定义好共享数据源, 我们可以用vuex(比如你是vue技术栈),或者dva(如果你是react技术栈), 大致设计思路如下:

本质上就是在属性编辑器里触发action, 修改对应组件的config, 然后差量更新画布内容. pointData是画布上组件的数据集, 用来展示H5页面以及动态渲染属性编辑器的编辑项. 后面我们介绍的预览功能也依赖于pointData提供的数据.


2. 实时预览的一般思路

在笔者之前的文章中详细的介绍了如何实现Web IDE的实时预览方案, 也就是nodejs + iframe的方式, 但是对于我们H5-dooring可视化编辑器来说, 可能需要另一种方式, 也就是用户在需要预览的时候可以手动去模拟真机预览或者真机预览, 这里我们通常会在编辑器界面里提供预览按钮, 当用户点击时可以跳到预览视图,如下:

基于我们之前提到的json schema作为预览的数据源, 我们很容易想到在预览页面通过数据源来重新渲染出一个H5页面, 思路如下:

预览页面如果是新开页面, 比如H5-Dooring的实现方式, 那么这个数据源需要在预览之前存储到localStorage中, 由于localStorage的特性我们可以在同域下跨页面共享数据,所以很方便实现我们的需求. 至于render engine部分, 我们只需要使用react-grid-layout提供的数据供给方案即可.代码如下:

<GridLayoutclassName={styles.layout}cols={24}rowHeight={2}width={vw > 800 ? 375 : vw}margin={[0, 0]}
>{pointData.map((value: PointDataItem) => (<div className={styles.dragItem} key={value.id} data-grid={value.point}><DynamicEngine {...(value.item as any)} /></div>))}
</GridLayout>

至于DynamicEngine的实现, 可以看笔者的H5-Dooring源码来了解具体实现过程. 但是单纯采用localstorage的方案会存在一些问题, 在接下来的章节中笔者会详细说明.

3. 真机扫码预览的实现思路

真机扫码预览的实现方案, 笔者简单总结如下图所示:

以上流程中之所以要走nodejs服务是因为手机端需要和PC端配置建立关联才能实现真机预览,这个关联可以是通过url参数, 也可以是url参数+请求的模式, 这里由于配置数据比较大,所以采用后者来实现, url参数用来定位资源路径, 然后在H5母版工程中根据参数请求具体的数据来呈现页面.这也是目前流行的真机预览方案. 我们可以采用qrcode来动态生成二维码, 二维码的形式如下:

const url = `${window.location.protocol}//${window.location.host}/h5_plus/preview?tid=${tid}`

其他至于如何用nodejs返回指定参数的文件, 这个比较简单, 这里就不一一实现了, 但是一定要理解以上的真机预览实现流程.


4. 基于nodejs中间层实现高可用的实时预览方案

在笔者之前写的通过localStroage实现预览数据共享的方案中存在一些缺陷,比如说A用户想把自己通过H5-Dooring配置的H5页面分享给B用户看, 由于存在于两台不同的电脑, B用户是无法获取预览数据的, 进而无法查看他人配置的H5页. 还有一种情况是用户开启了浏览器的无痕模式, 这样在预览页面可能也无法预览, 所以针对这两种场景, 我们有必要做出一些优化来让我们的实时预览具有更高的可用性.

那么如何实现在用户无法正常利用localStroage的情况下仍然能访问我们的配置页面呢? 答案是通过api请求.我们再次利用nodejs来实现存储用户配置的数据, 在预览的时候判断如果localStroage可以获取到数据, 那么直接使用localStroage的数据, 如果获取不到, 直接访问api请求.逻辑大致如下:

以上实现虽然简单, 但是通过如上优化可以提供预览的可用性和体验, 大家在设计产品功能的时候可以参考借鉴.

5. 总结
以上教程笔者已经集成到H5-Dooring中,对于一些更复杂的交互功能,通过合理的设计也是可以实现的,大家可以自行探索研究。
github地址:H5在线编辑器H5-Dooring

最后
如果想学习更多H5游戏, webpacknodegulpcss3javascriptnodeJScanvas数据可视化等前端知识和实战

小白要如何去学习前端?​www.zhihu.com

作者:徐小夕
链接:https://juejin.im/post/6876751431374929934
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

用户收货地址h5页面_如何实现H5可视化编辑器的实时预览和真机扫码预览功能...相关推荐

  1. 用户收货地址h5页面_如何实现H5可视化编辑器的实时预览和真机扫码预览功能?...

    前言 所见即所得的设计理念在WEB IDE领域里一直是备受瞩目的功能亮点, 也能极大的提高 web coder的编程体验和编程效率. 笔者接下来就将对H5可视化编辑器的实时预览和真机扫码预览功能做一次 ...

  2. h5案例欣赏及分析_如何实现H5可视化编辑器的实时预览和真机扫码预览功能

    往期精彩 基于NodeJS从零构建线上自动化打包工作流(H5-Dooring特别版) 在线IDE开发入门之从零实现一个在线代码编辑器 基于React+Koa实现一个h5页面可视化编辑器-Dooring ...

  3. 如何实现H5可视化编辑器的实时预览和真机扫码预览功能

    往期精彩 基于NodeJS从零构建线上自动化打包工作流(H5-Dooring特别版) 在线IDE开发入门之从零实现一个在线代码编辑器 基于React+Koa实现一个h5页面可视化编辑器-Dooring ...

  4. 微信小程序获取用户收货地址与指纹验证接口(安卓和iphone)

    @toc 1.获取用户收货地址接口wx.chooseAddress()   wx.chooseAddress(Object object)获取用户收货地址,此接口调用的是微信的收货地址.微信收货地址不 ...

  5. 微信小程序获取用户收货地址 完整代码

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 获取用户收货地址需要用户点击授权,所以有两种情况,确认授权.取消授权. 情况一,用户第一次访问用户地址授权,并 ...

  6. 商品属性对应表,商品相册表,用户表,用户收货地址表,地区表,购物车表,送货方式表,订单表,订单明细表的数据库设计

    商品的属性 通用属性: 名称 价格 图片 存放goods表 扩展属性,也叫规格参数,不同类型的商品其规格参数是不一样的,服装有尺码,颜色,材料等,手机有分辨率,内存,存储,摄像头,书籍有作者,出版社 ...

  7. 微信小程序获取用户收货地址列表wx.chooseAddress

    微信官方的说明,直接调用即可,但是由于该微信弹框如果拒绝,之后再不会弹出提示,而恰好wx.openSetting(),可以调起授权设置界面,显示用户已经调用过的微信授权,所以我们需要饶一下小弯路,但是 ...

  8. uniapp开发微信小程序如何调取自带的地址管理 获取用户收货地址

    handleChoiceAddress(){let that = this// 1 获取权限状态wx.getSetting({success:(result)=>{//2 获取权限状态 当属性名 ...

  9. 小程序用户收货地址修改

    页面使用的是weui的组件.主要实现的思路: 1.从地址管理页跳转过来,在onload里面将传过来的参数address获取后,渲染到前台页面:同时将address数据缓存到本地: 2.修改地址后提交, ...

最新文章

  1. linux的文本处理(一)
  2. php mysql两个表合并_php操作mysql两个数据库中表的数据同步
  3. 计算机一级考模拟试题,计算机一级MSOffice考前模拟试题「附答案」
  4. matlab二阶导数表示,【单选题】在MATLAB符号计算中,y的二阶导数表示为( )。...
  5. python webshell_python脚本实现查找webshell的方法
  6. 固态硬盘市场或将提前爆发
  7. JS每日一题:Vue中的diff算法?
  8. c++面试常考的知识点汇总
  9. google protobuf_protobuf 指南
  10. 如何使用webrtc 一
  11. linux 窗口不能移动的替换命令
  12. JavaScript基础(二)-类
  13. 整理 被appstore 拒绝审核通过的原因
  14. Linux下的IO监控与分析
  15. MAC编译OpenJDK8:clang: error: include path for libstdc++ headers not found(独家解决办法)
  16. java计数器生成流水号_CODESOFT打印流水号
  17. 数据结构之什么是数组?
  18. Facebook登陆问题和在Android 11 上的问题
  19. 微信手写板 android,微信小程序:手写板功能实现(canvas)
  20. dell 计算机硬盘保护,dell台式机硬盘保护 怎样取消

热门文章

  1. 系统吞吐量评估方法 冯凌圣
  2. Linux学习笔记:Linux常用命令操作
  3. 安卓学习笔记22:常用控件 - 可展开列表视图
  4. 安卓案例:帧式布局演示(切换颜色)
  5. 查询:使用多表连接查询数据
  6. 无心剑英译朱自清《匆匆》
  7. linux目录硬链接,linux查看硬链接对应的所有文件
  8. python安装方法3.8.2_Python(开发环境工具)v3.8.2 x32 官方win版
  9. 2017.10.26 星际贸易 思考记录
  10. 数据图表与分析图_史上最全最实用的数据可视化分析图表制作工具汇总