欢迎光临,了解微信小程序开发,就上易用通!

说说小程序遇到的问题

发布:2018-01-25 15:42浏览: 来源:网络 作者:tianshu

有消息称第一批微信小程序在12月中下旬发布,在那之前,需要将已完成的小程序向腾讯提交审核。58到家看准了这次推广的机会,制定了小程序开发计划。笔者是主要开发者之一。
闲话少说,进入正题。
小程序号称使用前端技术开发接近native体验的webapp,微信提供了许多js和native交互的bridge API,同时将html/css进行改造,分别对应wxml和wxss。初见之时,看上去就是换个名字而已嘛,都是熟悉的技术,项目分分钟开发完成哈哈。然后就兴致勃勃的开始折腾,然后就...
小程序官方文档相当“简洁”,以示例代码的形式很形象地说明了各模块的开发模式。但是示例代码以及文字描述并未将其中的细节完全暴露出来,上手开发后才发现很多坑。
wxss
wxss乍看上去就是css,名字相似,语法相似。但写起代码来真是痛苦的很,下面一一列出目前笔者遇到的问题。
1> 不支持级联选择器
css选择器可以支持自上而下一层层的级联选择,比如:
  1. .parent .child{
  2.     color: #000;
  3. }
前端开发者对此非常熟悉。但是wxss并不支持上述语法,如果使用class作为匹配选择器,只能写一层,如下:
  1. .parent{}
  2. .child{
  3.     color: #000;
  4. }
这种模式令开发者在为class命名上必须不能重复,限制了自由度。
2> 选择器支持非常有限
目前官方给出的wxss支持选择器只有以下几种:
说说小程序遇到的问题(图1)
其中的element是wxml支持的标签元素,并非所有html标签。
3> 不支持引用本地图片资源
比如我们需要使用本地的sprites图片:
  1. .dj__icon {
  2.     background-image; url("./assets/icons.sprites.png");
  3. }
如果在wxss中编写以上代码并不会报错,但是也不会有任何理想的效果。官方给出的答复是:
说说小程序遇到的问题(图2)
所以如果我们需要使用自定义的图标UI的话,目前只能先将sprites图片上传到自己的服务器或者base64编译后再写入wxss中。
wxml
wxml的语法与vue.js有点相似,支持数据绑定以及部分模板逻辑。笔者目前在wxml开发中总结以下几点注意事项:
1> 使用wxml模板语法时只能使用部分js逻辑判断 
或者也可以理解为只能使用以下几种逻辑:
  • 引用变量;
  • 二元操作符;
  • 三元操作符。
由于wxml使用双花括号{{}}作为数据绑定标识,所以被{{}}包裹的逻辑语句不能出现花括号{},否则会报语法错误。比如:
  1. <view>{{ Object.assign({},data,{isTrue: false})}}</view>
2> event handler的参数event不支持访问DOM
小程序中不支持任何访问DOM的语法,因为它并不是在浏览器环境下运行,所以document、window等浏览器暴露的API均不能访问。事件响应函数接受的event参数的完整结构如下:
  1. {
  2.     "type":"tap",
  3.     "timeStamp":895,
  4.     "target": {
  5.       "id": "tapTest",
  6.       "dataset":  {
  7.         "hi":"WeChat"
  8.       }
  9.     },
  10.     "currentTarget":  {
  11.       "id": "tapTest",
  12.       "dataset": {
  13.         "hi":"WeChat"
  14.       }
  15.     },
  16.     "detail": {
  17.       "x":53,
  18.       "y":14
  19.     },
  20.     "touches":[{
  21.       "identifier":0,
  22.       "pageX":53,
  23.       "pageY":14,
  24.       "clientX":53,
  25.       "clientY":14
  26.     }],
  27.     "changedTouches":[{
  28.       "identifier":0,
  29.       "pageX":53,
  30.       "pageY":14,
  31.       "clientX":53,
  32.       "clientY":14
  33.     }]
  34. }
所以如果想使用常规浏览器环境下,通过event.target获取DOM是不可行的。只能通过操作数据来修改UI。
3> 使用剩余参数语法向模板传递对象格式的data
wxml支持模板引用以便开发通用组件,比如项目中存在item.wxml:
  1. <!-- item.wxml -->
  2. <template name="item">
  3.   <text>{{text}}</text>
  4. </template>
复制代码
在 index.wxml 中引用了 item.wxml,就可以使用item模板:
  1. <import src="item.wxml"/>
  2. <template is="item" data="{{text: 'forbar'}}"/>
其中的data是向item.wxml传递的参数。如果要循环一个列表数据,列表中每个元素都是key-value格式且对应一个item的话,需要使用以下格式:
  1. <import src="item.wxml"/>
  2. <template is="item" wx:for="{{list}}" wx:for-item="item" data="{{..item}}"/>
上述代码将列表的每个元素整体传递给item.wxml,使用data="{{..item}}"语法。当然,你也可以在data中添加其他数据,比如data="{{..item, text:'forbar'}}"。
3> 可将事件响应函数名称通过data传递给组件模板
组件对引用它的模板来说就是一个黑盒,外部不应该干涉组件的内部逻辑。如果想要组件响应某些操作并反馈外部定义的响应函数,可以将外部已定义的响应函数名称传给组件。
我们将上文的代码改造一下演示这个问题。比如item.wxml暴露了tap响应API:
  1. <!-- item.wxml -->
  2. <template name="item">
  3.   <text bindtap="{{tapHandler}}">{{text}}</text>
  4. </template>
index.wxml中引入item组件并传递了tapHandler:
  1. <import src="item.wxml"/>
  2. <template is="item" data="{{text: 'forbar', tapHandler: 'indexTapHandler'}}"/>
其中indexTapHandler是index.wxml对应的js中声明的响应函数:
  1. Page({
  2.     indexTapHandler(e){
  3.         alert('trigger index tap event');
  4.     }
  5. });
这样就完成了组件事件响应的定制。
3> 可变数组数据渲染务必使用wx:key
渲染列表数据时,如果列表中的数据是动态的(比如点击之后修改列表中某个元素的值),那么在渲染UI时务必将渲染的模板加上wx:key。请看以下代码:
  1. <import src="item.wxml"/>
  2. <template is="item" wx:for="{{list}}" wx:for-item="item" wx:for-index="idx" wx:key="item-{{idx}}" data="{{..item}}"/>
上述代码使用列表的index作为wx:key的值,保证每个元素对应template的唯一性。
wx:key的取值还可以是保留字*this,官方给出的定义如下:
保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字。




免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。