微页面设计开发指南

一、目标实现

左侧:为可用的组件列表,可拖动任一组件到中间的预览区域

中间:为页面预览效果页面,选中任一组件,可在右侧进行参数配置

右侧:为组件的参数配置(选中中间的组件时出现),页面配置(选中页面管理tab按钮时出现),组件管理(选中组件管理tab时出现),更改配置,中间的预览区域立即更新视图

对于电商类的小程序,这种微页面有大量的需求,频繁的改动页面样式、结构和内容,以及发布内嵌的H5页面,后台做到灵活可配置。可免去频繁发布小程序的烦恼。

二、开发设计规范

后台部分

管理后台文件目录结构

1. 可将以上的页面进行模块拆分:

  1. components目录放一些常用的组件,leftComponentsPage.vue和rightConfigPage.vue分别为左侧和右侧的集成组件

  2. configComponents目录是右侧显示的对应组件和页面的配置相关的组件,每个组件对应一个配置,封装成对应的组件

  3. viewComponents目录放置组件对应的样式结构代码,每个组件封装成一个样式组件,名称和配置组件一一对应

  4. details.vue为整合页面,分别调用左侧的leftComponentsPage.vue组件和右侧的rightConfigPage.vue组件,以及中间预览遍历组件按需加载样式组件

2. 数据流方向

3. 组件数据格式

以图片组件为例:

{"image":{"showMethod":"YHYG", // 显示的排列方式,一行一个"borderWidth":0, "pageMargin":0,"maxImageNum":10,"cornerType":"ZJ","imageType":"normal","showNum":6,"indicator":"style1","items":[{"title":"","imageUrl":"","imageWidth":345,"imageHeight":241,"action":"webview","maAppid":"","maPagePath":"","extLink":"","actionArea":"hotArea","hotAreas":{"width":100,"height":100,"xAxis":128,"yAxis":63}}]}
}

image下面为组件的属性,由云端接口直接返回,items下面的每一项对应单个图片属性,右侧配置区域可对每个属性进行配置,每上传一张图片,往items里增加一项

4. 视图组件结构和对应样式

<template>
<!-- 组件1:图片组件 -->
<div class="component-wrapper image-component" :style="wrapperStyle">
<div class="image-list"><div :style="imgItemStyle" class="image-item" v-for="(img, imgIndex) in imgObject.items" :key="imgIndex"><img class="image" :src="img.imageUrl ? img.imageUrl : defaultImg">
<div :class="['hotarea', debugMode ? 'debug' : '' ]" :style="img.hotAreaStyle"
@click="redirectPageTo(img.action, img.extLink, img.maAppid, img.maPagePath)" v-if="img.action !== 'nothing'">
</div></div>
</div>
</div>
</template>

类名为component-wrapper的图层为最外层,宽度为屏幕宽度100%(后台预览页面宽度定为375px),为这个图层设置左右padding值为组件传过来的pageMargin的大小

computed: {wrapperStyle() {return {padding-left: this.comData.image.pageMargin + 'px',padding-right: this.comData.image.pageMargin + 'px'}}
}

通过传入组件数据items数组数据,动态计算相关图层样式动态绑定到对应的元素上热区hot-area图层样式对象hotAreaStyle根据组件是否开启点击交互,是默认全区域还是选定区域计算而来

computed: {imgObject() {this.comData.image.items.map((item) => {if (item.action !== 'nothing') {item.hotAreaStyle = {width: (item.actionArea === 'hotArea' ? item.hotAreas.width : item.imageWidth) + 'px',height: (item.actionArea === 'hotArea' ? item.hotAreas.height : item.imageHeight) + 'px',left: item.actionArea === 'hotArea' ? item.hotAreas.xAxis + 'px' : 0 ,top: item.actionArea === 'hotArea' ? item.hotAreas.yAxis + 'px' : 0}}})return this.comData.image}
}

小程序端

1. 小程序端页面组件开发

小程序端的页面样式和结构可以部分复用viewComponents中的代码,只需将结构标签div改为view,将img改为image,v-if改为wx:if,v-for改为wx:for对应组件放在根目录下的custom-components下的microPage目录里

主页面放在subpackage下面的microPage下

<view class="page-com" wx:for="{{ comData }}" wx:for-item="item" wx:key="index" wx:if="{{ pageStatus === 'ON' && pageDelete === 'NORMAL' }}"><!-- 图片组件渲染 --><image-view comData="{{ item.components }}" wx:if="{{ item.comType === 'image' }}" /><!-- 按钮组件渲染 --><button-view comData="{{ item.components }}" wx:if="{{ item.comType === 'btn' }}" /><!-- 悬浮组件渲染 --><absolute-view comData="{{ item.components }}" showCom="{{ showCom }}" wx:if="{{ item.comType === 'absolute' }}" />
</view>

循环遍历传过来的页面组件数据,渲染不同的组件拿image图片组件举例,它的结构代码

<!-- 组件1:图片组件 -->
<view class="component-wrapper image-component" style="{{ wrapperStyle }}"><view class="image-list"><view class="image-item" wx:for="{{ imgObject.items }}" wx:for-index="imgIndex" wx:for-item="img"wx:key="imgIndex"><image class="image" src="{{ img.imageUrl }}" style="width: {{ img.imageWidth }}px;" wx:if="{{ img.imageUrl }}" mode="widthFix"></image><view class="hotarea" style="{{ img.hotAreaStyle }}" wx:if="{{ img.action !== 'nothing' }}"bindtap="redirectPageTo" data-com="{{ img }}"></view></view></view>
</view>

由于小程序里面不支持动态样式绑定,我们将样式拼接成字符串,加入到组件列表里,另外后台传过来的像素单位是px,需要做转化rpx

attached() {this.data.comData.image.items.map((item) => {if (this.data.comData.image.action !== 'nothing') {let width = item.actionArea === 'hotArea' ? item.hotAreas.width : item.imageWidthlet height = item.actionArea === 'hotArea' ? item.hotAreas.height : item.imageHeightlet left = item.actionArea === 'hotArea' ? item.hotAreas.xAxis : 0let top = item.actionArea === 'hotArea' ? item.hotAreas.yAxis : 0item.hotAreaStyle = 'width: ' + app.pxToRpx(width) + 'rpx;height: ' +app.pxToRpx(height) + 'rpx;left: ' + app.pxToRpx(left) + 'rpx;top: ' + app.pxToRpx(top) + 'rpx;'}})this.setData({wrapperStyle: 'padding: 0 ' + app.pxToRpx(this.data.comData.image.pageMargin) + 'px',imgObject: this.data.comData.image})
}

像素单位转化方法封装在app下

pxToRpx(value) {return value * (750 / this.globalData.system.windowWidth);
}

三、开发步骤

后台部分

1. 增加组件图标

首先在leftComponentsPage.vue为该组件指定显示的图标

comList(val) {val.map((item) = >{switch (item.type) {case 'image':item.icon = 'pic';break;case 'absolute':item.icon = 'absolutebtn';break;case 'btn':item.icon = 'operation';break;default:item.icon = 'pic'break;}}) this.buildComList = val
}

2. 给组件增加配置文件

在configComponents目录下新增 组件名.vue 对应的配置文件,然后在components下的rightConfigPage.vue中引入该组件

<!-- 组件配置 -->
<div v-else-if="activeBtn === 'com'">
<!-- 1、图片组件 -->
<image-config v-if="previewComList[selectedComIndex].type === 'image'"
v-on="$listeners":configData="previewComList[selectedComIndex]"></image-config>
<!-- 2、悬浮按钮组件 -->
<absolute-config v-if="previewComList[selectedComIndex].type === 'absolute'"v-on="$listeners" :configData="previewComList[selectedComIndex]"></absolute-config>
<!-- 3、按钮组件 -->
<btn-config v-if="previewComList[selectedComIndex].type === 'btn'"
v-on="$listeners":configData="previewComList[selectedComIndex]"></btn-config>
</div>

配置文件通过props接收传过来的configData数据,赋值给本地的data里面的configs,配置文件里的input通过v-mode监听改变configs,然后通过监听configs数据调用$emit调用父组件传过来的方法,达到数据从父组件 -> 孙子组件 -> 父组件的响应式

3. 给预览页面增加组件

在viewComponents下新建组件名.vue文件,然后在detail.vue中引入

<div :style="{position: 'relative'}" v-for="(com, comIndex) in previewComList" :key="comIndex"><div :class="['com-area', selectedComIndex === comIndex ? 'border-selected' : '']" @click="selectCom(com, comIndex)"><!-- 组件1:图片组件 --><image-view :comData="com.configObj" :debugMode="debug" v-if="com.type ==='image'"></image-view><!-- 组件2:悬浮按钮组件 --><absolute-view :comData="com.configObj" :debugMode="debug" v-if="com.type ==='absolute'"></absolute-view><!-- 组件删除按钮 --><div v-if="selectedComIndex === comIndex" class="delete-com-btn" @click="deleteCom(com, comIndex)"><i class="el-icon-delete"></i></div>
</div>

小程序端

1. 增加组件对应的视图组件

在根目录custom-components下面的landingPage下新建以组件名命名的目录,里面包含js,json,wxml,wxss文件,在subpackage/landingPage/index.json中引入该组件

"usingComponents": {"image-view": "../../custom-components/landingPage/image/index","button-view": "../../custom-components/landingPage/button/index","absolute-view": "../../custom-components/landingPage/absolute/index"
}

在subpackage/landingPage/index.wxml文件中增加组件代码

<!-- 图片组件渲染 -->
<image-view comData="{{ item.components }}" wx:if="{{ item.comType === 'image' }}" />

最终实现

四. 注意事项

  1. 小程序端需要做单位转化,将传过来的px统一转成rpx用

  2. 小程序中组件中的wxml文件中每个热区的hotarea元素需要增加一个监控的class,命名以hotarea-xxx(xxx为后台定义热区的时候的命名)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商城商品购买数量增减的完美JS效果

商城商品购买数量增减的完美JS效果 近期在开发一个地方O2O租书项目&#xff0c;使用ASP.NET MVC技术&#xff0c;其中在图书详情页&#xff0c;用户可以输入借阅的数量&#xff0c;这里使用了js来控制数量的增减和校验。 数量一定是数字 点击增减按钮的时候要能自动加1或减1 …

这款插件让你在VSCode上也能答题背单词

在VSCode上也可以在线答题了&#xff0c;插件市场上线了一款答题的插件&#xff0c;免去了去其它网站或者软件的烦恼&#xff0c;代码写累了&#xff0c;随手打开答题功能&#xff0c;换换脑子&#xff0c;或者熟悉两个单词&#xff0c;程序员的别样休闲时光&#xff0c;哈哈&a…

使用Java 8在地图上流式传输

在本文中&#xff0c;我将向您展示如何在标准Java映射上有效地实现Speedment Open Source流&#xff0c;并将Stream接口扩展为MapStream&#xff01; 即使在复杂的情况下&#xff0c;此添加将使保持流的具体性和可读性变得更加容易。 希望这将允许您继续流式传输而不会过早收集…

如何使用python给PDF文件加水印

Python作为编程界最火的语言&#xff0c;能做的事几乎你能想到的它都能干&#xff0c;就连抢茅台都可以&#xff0c;还有什么不行&#xff1f;&#xff01;Python作为脚本编程语言&#xff0c;可以做很多事情。使用Python&#xff0c;你可以轻松地给pdf加上水印。 你可以使用名…

搭建一个redis高可用系统

一、单个实例 当系统中只有一台redis运行时&#xff0c;一旦该redis挂了&#xff0c;会导致整个系统无法运行。 单个实例二、备份 由于单台redis出现单点故障&#xff0c;就会导致整个系统不可用&#xff0c;所以想到的办法自然就是备份&#xff08;一般工业界认为比较安全的备…

SSH连接远程服务器,本地known_hosts文件记录了什么

今天工作时&#xff0c;使用ssh命令远程连接公司的本地服务器时&#xff0c;突然出现以下错误bash-3.2$ ssh argus192.168.200.8 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdroppin…

“全人类的知识宝藏”维基百科迎来了20岁的生日!

维基百科从一个伟大的想法开始&#xff0c;与无数的像你像我一样的阅读者&#xff0c;创作者&#xff0c;捐赠者和粉丝经历了互联网的20年&#xff0c;今天让我们一起为这个属于所有互联网人的成果庆祝一次生日。值此20周年特地为它做了一个主页&#xff1a;https://wikimediaf…

转:智能音箱市场深度报告:怎么大家都在抢这个两亿小蛋糕?

原文链接&#xff1a;http://www.sohu.com/a/199335366_115978 智能音箱是今年最热的智能硬件项目之一。目前&#xff0c;智能音箱已经有了比较成熟的技术方案和模式思路&#xff0c;但消费市场似乎依然秉持着比较谨慎的态度。智能音箱市场上的主流产品都有什么思路&#xff1f…

Tailwindcss尤大神都fork了,是未来的趋势?

最近Tailwindcss频繁出现在我的视野里&#xff0c;从单词拼写中看&#xff0c;多多少少与css有点关系。近几年是JS框架大行其道&#xff0c;CSS方面少有新的框架出现。昨天突然看到尤大神在Github上的动态&#xff0c;fork了该项目&#xff0c;看来马上要火的节奏啊&#xff01…

JUnit 5 –架构

现在我们知道如何设置JUnit 5并使用它编写一些测试 &#xff0c;下面让我们看一下。 在本文中&#xff0c;我们将讨论JUnit 5架构以及采用这种方式的原因。 总览 这篇文章是有关JUnit 5的系列文章的一部分&#xff1a; 设定 基本 建筑 条件 注射 … JUnit 4 忽略Hamcre…

前端程序员书桌上不可缺少的CSS书籍

作为前端&#xff0c;CSS不仅要会&#xff0c;而且要精通&#xff0c;随着各种浏览器规范参差不齐和网页交互多元化的趋势越来越复杂&#xff0c;前端程序员必须要将CSS基础知识打牢。由于现在的框架越来越多&#xff0c;导致很大一部分程序员的工作只是拿着现成的组件布局&…

nodejs 进阶:图片缩小

demo 效果&#xff1a; 代码&#xff1a; /*** Created by ZXW on 2017/10/30.*/ var fs require(fs); var gm require(gm);gm(./不饿.jpg).resize(50, 50,"!").write(./不饿1.jpg, function (err) {if (!err) console.log(done);});2017-10-30 22:10:46转载于:ht…

可能是最先出来的关于介绍使用Vue3的一本书

Vue3 release版本已发布有几个月了&#xff0c;不少公司都已经开始使用vue3开发项目了&#xff0c;市场上的主流的框架如&#xff1a;Vant&#xff0c;Element UI&#xff0c;Taro也都发布了支持Vue3的版本。Vue3很多的开发优势自不必再说&#xff0c;学习上手vue3已经成为每个…

CSGL

glShadeModel void glShadeModel(GLenum mode) GL_FLAT/【GL_SMOOTH】 着色技术选择 glClearDepth GL.glClearDepth(depth); glClearDepth&#xff1a;设置深度缓存的清除值 参数 depth 指定清除深度缓存时使用的深度值。 说明 本函数指定用glClear清除深度缓存时所使用的深度值…

强大的Canvas开源库Fabric.js简介与开发指南

什么是Fabric.js&#xff1f;Fabric.js 是一个强大且简单的Javascript HTML5 Canvas库。官网地址&#xff1a;http://fabricjs.com/为什么要使用Fabric.js&#xff1f;Canvas提供一个好的画布能力, 但是Api不够友好。绘制简单图形其实还可以, 不过做一些复杂的图形绘制, 编写一…

模拟qq斗地主-准备发牌抢地主都是农民下一轮准备

为什么要搞这样一个项目&#xff1f;&#xff1f; 1&#xff0c;满足自己的java网络多线程编程的欲望&#xff01;因为之前一直都是搞web开发&#xff0c;服务器和客户端数据交流人家web服务器早就给你搞好了&#xff0c;比如tomcat,jetty...等等&#xff0c;其实之前脑子里就有…

rube3xxx_Rube GoldbergSpring整合

rube3xxxSpring Integration为集成系统所涉及的一些复杂性提供了非常好的抽象-Spring Integration从Integration的角度完美地满足了Facade的定义-简化了对复杂基础系统的访问。 为了说明这一点&#xff0c;请考虑一个简单的系统&#xff0c;该系统仅接收一条消息&#xff0c;然…

纯CSS实现React Logo图形,内含详细解析

以上是将要实现的效果&#xff0c;Javascript框架React的Logo图形&#xff0c;首先我们来拆解下&#xff0c;它包括三个交叉的椭圆和中间一个圆点&#xff0c;所以我们Html元素可以用以下代码实现&#xff1a;<div class"main"><div class"ellipse ell…

二次优化大招(由泰勒公式推出最值条件)

经过前两篇的铺垫&#xff0c;这一篇迎来了高潮。先说一句&#xff1a;特征值大法好&#xff01; 在开始正文之前&#xff0c;先看以下简单的推导 有了这些&#xff0c;理解下面的泰勒公式推出最值条件就容易了 转载于:https://www.cnblogs.com/Mr-ZeroW/p/7764916.html

前端自动化测试浅析

前言&#xff1a;测试简介前端常见的问题&#xff1a;修改某个模块功能时&#xff0c;其它模块也受影响&#xff0c;很难快速定位bug多人开发代码越来越难以维护不方便迭代&#xff0c;代码无法重构代码质量差增加自动化测试后&#xff1a;我们为核心功能编写测试后可以保障项目…