解释清晰!!!!终于看懂key的用处了。多谢多谢
【转】微信小程序入门教程--列表渲染多层嵌套循环及wx:key的使用前言入门教程之列表渲染多层嵌套循环,目前官方的文档里,主要是一维数组列表渲染的案例,还是比较简单单一,给刚入门的童鞋还是无从入手的感觉。 [代码]<view wx:for="{{items}}"> {{index}}: {{item.message}}</view>[代码]还有一个九九乘法表把数据直接写到wxml里的,并不是动态二维数组的列表渲染。 [代码]<view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="i"> <view wx:for="{{[1, 2, 3, 4, 5, 6, 7, 8, 9]}}" wx:for-item="j"> <view wx:if="{{i <= j}}"> {{i}} * {{j}} = {{i * j}} </view> </view></view>[代码]那么今天,我们主要来讲讲动态多维数组和对象混合的列表渲染。 [图片] '' 讲解何为多维数组和对象混合,给个很简单的例子 [代码] twoList:[{ id:1, name:'应季鲜果', count:1, twodata:[{ 'id':11, 'name':'鸡脆骨' },{ 'id':12, 'name':'鸡爪' }] },{ id:2, name:'精致糕点', count:6, twodata:[{ 'id':13, 'name':'羔羊排骨一条' },{ 'id':14, 'name':'微辣' }] }][代码]上述例子就是一个数组,这都是我们日常开发过程中,经常会碰到的JSON格式, 该数组的元素是有对象,对象又分为属性,属于数组对象混合,可能对于刚接触小程序的童鞋,碰到这种数组对象混合的就会发难了。 一层循环[代码] oneList:[{ id:1, name:'应季鲜果', count:1 },{ id:2, name:'精致糕点', count:6 },{ id:3, name:'全球美食烘培原料', count:12 },{ id:4, name:'无辣不欢生猛海鲜', count:5 }][代码]以上数组对象混合JSON,是测试只有一层循环的,我们看看在[代码]wxml[代码]里怎么循环,我们先看一下要循环渲染到页面上的效果图。 [图片] '' [代码]<view wx:for="{{oneList}}" wx:key="id"> {{index+1}}、{{item.name}}</view>[代码]我们可以看到,这里直接用两个花括号来给[代码]view[代码] 循环列表,注意强调一下,请记得一下要用 两个花括号数据起来,如果不包起来,[代码]view[代码]也会循环出来,但并不是自己要循环的数据,而且是给了一个假象给你以为是有循环了,这里开发工具有点坑人的感觉,这个还需要多细心点,这里记住一点,只要是有数据的,就需要花括号。 另外默认数组的当前项的下标变量名默认为index,数组当前项的变量名默认为item,同时我这里也顺道演示了如何使用数组变量名和下标。 二层循环[图片] '' JSON代码 [代码] twoList:[{ id:1, name:'应季鲜果', count:1, twodata:[{ 'id':11, 'name':'鸡脆骨' },{ 'id':12, 'name':'鸡爪' }] },{ id:2, name:'精致糕点', count:6, twodata:[{ 'id':13, 'name':'羔羊排骨一条' },{ 'id':14, 'name':'微辣' }] },{ id:3, name:'全球美食烘培原料', count:12, twodata:[{ 'id':15, 'name':'秋刀鱼' },{ 'id':16, 'name':'锡箔纸金针菇' }] }][代码]wxml代码 [代码] <view class="pad10" wx:for="{{twoList}}" wx:key="id"> <view> {{index+1}}、{{item.name}} </view> <view wx:for="{{item.twodata}}" wx:for-item="twodata" wx:key="id"> ----{{twodata.name}}---{{item.name}} </view> </view>[代码]以上截图和代码是二层嵌套内容。 我们在wxml代码里,很明显的看到有两个[代码]wx:for[代码]的控制属性,在二层循环的JSON代码里,我们看每个单数组里还有一级数据[代码]twodata[代码],这里是需要再循环渲染到页面上的,在第一层数据里,直接再循环[代码]item.twodata[代码]即可,请记得一定要带上花括号。 在第二层的循环里,建议把当前项的变量名改为其他,即在wxml代码里看到的[代码]wx:for-item="twodata"[代码],因为默认的当前项的变量名为[代码]item[代码],如果不改换其他的话,你是拿不到第一层循环的数据的,因为被第二层的变量名覆盖了。 所以我们在wxml代码里,在第二层循环时,可以看到还可以循环第一层的值,即[代码]----{{twodata.name}}---{{item.name}}[代码]。 三层以上的多层循环三层以上的多层的数组循环,在原理上同二层循环是一样的,能理解了二层数组循环,对于三层以及三层以上都能得心应用的。 需要注意的地方,那就是老生常谈的问题了,数据需要用花括号括起来,从第二层起,把默认的当前项的变量名改为其他,例如[代码]wx:for-item="twodata"[代码],还有细心再细心。 wx:key唯一标识符为什么会有[代码]wx:key[代码]的出现呢,官方给的解释是,如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 [代码]input[代码] 中的输入内容,[代码]switch[代码] 的选中状态),需要使用 wx:key 来指定列表中项目的唯一的标识符。 当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。 在开发过程中,[代码]wx:key[代码]的作用对于项目作用是非常大的,如果从文字上无法理解的童鞋,可以到github clone demo到微信开发工具里,亲自体验下。 [图片] '' 我们看到这个GIF动画图,这里有一个[代码]switch[代码]的开启状态,[代码]switch[代码]的状态是在标题为[代码]羔羊排骨一条[代码]的,在对这个数组增加数据时,这个[代码]switch[代码]的状态并不跟随着[代码]羔羊排骨一条[代码],并不保持自己的状态。 那我们再看另一个例子,使用了wx:key唯一标识符。 [图片] '' 这个GIF动画图,也是点击开启了[代码]switch[代码]的状态,唯一有不同的地方,就是在新增数据时,是保持着自己的状态的。 相信通过这两个小例子,对wx:key唯一标识符应该也有所了解啦,想要提升技术,就要多折腾,自己在小程序里,写个[代码]wx:for[代码] 和 [代码]wx:key[代码] 体会下。 还有一个需要注意的地方,我们先看看以下代码 [代码]<view class="pad10" wx:for="{{twoList}}" wx:key="id"> </view>[代码][代码]wx:key="id"[代码],我们看到[代码]wx:key[代码]里的值并不需要花括号的,是的,这里是比较特别的地方,不需要花括号,同时也不需要参数名,需要是虽然数据里的一个字段名。 原作者:蓝狐锅锅(简书作者) 来自:http://www.jianshu.com/p/87cdf985b2b9
2020-04-02https://developers.weixin.qq.com/s/7nM2nimB7mgl
slider在form中的BUG,拖到0时,form对应的value为空?slider在form中的BUG,拖到0时,form对应的value为空 这个BUG什么时候解决?
2020-04-02https://developers.weixin.qq.com/s/7ATrJhmu7ngk 这是对应的小程序片段
拖动slider为0时,在form中submit后value=""?<form bindsubmit="formSubmit" bindreset="formReset"> <slider name="slider" show-value min="-1" max="10" value="1" ></slider> <view class="btn-area"> <button formType="submit">Submit</button> <button formType="reset">Reset</button> </view> </form> formSubmit: function (e) { console.log('form发生了submit事件,携带数据为:', e.detail.value) }, formReset: function () { console.log('form发生了reset事件') }, slider 拖动到1时,正常,form发生了submit事件,携带数据为: {slider: 1} slider 拖动到0时,就出现slider为空!!!! index.js? [sm]:8 form发生了submit事件,携带数据为: {slider: ""}
2020-04-01我也遇到同样的问题,slider在form中使用,拖到0处没返回值, 腾讯工作人员去哪了
【BUG】slider不赋值放到Form提交无法获取Value在我实现一个问卷调查的场景中,想让用户主动拖动这个slider评分条,页面编写时,不给slider中的value属性赋初值,min为0,max为10,默认Slider显示为0,点击提交获取不到Value 值,此时提示用户没有进行评分。拖动到任意位置(1-10),再拖回至0,点击提交在表单信息中还是获取不到Slider Value值,这里是不是应该提交的时候Value应该为0。 如果给slider设定一个初始值-1,min为0,max为10,点击提交可以获取value:-1,拖动到任意位置(1-10),再拖回至0,点击提交在表单信息中还是获取不到Slider Value值,这里是不是应该提交的时候Value应该为0。 但是如果把min设置为1,上述问题就不存在了。 还做了一些测试样例 测试样例 value:0,min:0,max:10,点击提交获取不到值,拖动后回到0获取不到值 value:无,min:0,max:10,点击提交获取不到值,拖动后回到0获取不到值 value:-1,min:0,max:10,点击提交获取-1,拖动后回到0获取不到值 value:0,min:1,max:10,点击提交获取不到值,拖动后回到1获取到1 value:无,min:1,max:10,点击提交获取不到值,拖动后回到1获取到1 value:-1,min:1,max:10,点击提交获到-1,拖动后回到1获取到1 关键点在min为0,value为0也存在问题 WXML代码: [代码]<[代码][代码]form[代码] [代码]bindsubmit[代码][代码]=[代码][代码]"formSubmit"[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]slider[代码] [代码]name[代码][代码]=[代码][代码]"score"[代码] [代码]min[代码][代码]=[代码][代码]"0"[代码] [代码]max[代码][代码]=[代码][代码]"10"[代码] [代码]bindchange[代码][代码]=[代码][代码]"slideChange"[代码] [代码]step[代码][代码]=[代码][代码]"1"[代码] [代码]show-value[代码][代码]=[代码][代码]'true'[代码] [代码]/>[代码][代码]<[代码][代码]button[代码] [代码]formType[代码][代码]=[代码][代码]"submit"[代码] [代码]type[代码][代码]=[代码][代码]"primary"[代码][代码]>提交[代码]button[代码][代码]>[代码][代码][代码][代码]Change Data:{{changeData}}[代码][代码][代码][代码]<[代码][代码]view[代码][代码]>[代码][代码][代码][代码][代码]view[代码][代码]>[代码][代码][代码][代码][代码][代码]Submit Data:{{submitData}}[代码][代码][代码][代码][代码][代码] [代码][代码][代码]form[代码][代码]>[代码][代码][代码][代码]JS代码 [代码]// pages/test/test.js[代码][代码]Page({[代码][代码] [代码][代码]/**[代码][代码] [代码][代码]* 页面的初始数据[代码][代码] [代码][代码]*/[代码][代码] [代码][代码]data: {[代码][代码] [代码] [代码] [代码][代码]},[代码][代码] [代码][代码]slideChange: [代码][代码]function[代码] [代码](e) {[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]changeData :e.detail.value[代码][代码] [代码][代码]})[代码][代码] [代码][代码]},[代码][代码] [代码][代码]formSubmit:[代码][代码]function[代码][代码](e){[代码][代码] [代码][代码]this[代码][代码].setData({[代码][代码] [代码][代码]submitData: e.detail.value.score[代码][代码] [代码][代码]})[代码][代码] [代码][代码]}[代码][代码]})·[代码]
2020-03-31急需。。。。急不可耐。。。。。
wx.setTabBarItem(OBJECT)- 需求的场景描述(希望解决的问题) 不同的用户,看到的tabBar也不同。 - 希望提供的能力 wx.setTabBarItem(OBJECT) 能够设置pagePath属性。
2019-12-01太赞同了,现在我只能在wxml中用flag来控制页面显示,而管理员页面和用户页面的使用逻辑也是完全不同的,所以控制起来非常累。
wx.setTabBarItem(Object object) 什么时候能加个设置页面路径的啊?所有的都能设置,就路径不能,请问改变图标和标题的作用呢???
2019-12-01多谢回复
能否在开发者工具的调试栏目中,让开发者看到globalData的值?开发中,只能通过console.log查看globalData的值,非常不方便,建议在调试窗口,可看globalData数据!
2019-11-192.93版本又不报错了,真是神版本
控制台报11 listeners of event AppRoute错误,啥情?控制台报 VM745:1 [Event] 11 listeners of event AppRoute have been added, possibly causing memory leak. [图片] 一进小程序就有这个警告,不知道为什么, 也看了其他人相关的提问,有说更新开发者工具版本的,但是更新之后也还是有警告 我也没用视频组件以及广告插件 官方大大快来帮我解决下,谢谢啦
2019-11-13刚刚,我重新上传一个新的云函数,同样的代码,npm install mysql2,居然神奇的成功了。 我认为,是因为前一个云函数,我曾经删去过一次目录的因素。 还是很谢谢你给我带来的好运。 也祝你事业兴旺!
云函数访问MYSQL数据库出错?// 云函数入口文件 const cloud = require('wx-server-sdk') const mysql=require('mysql2/promise') cloud.init() // 云函数入口函数 exports.main = async (event, context) => { const connection=await mysql.createConnection({ host:'mysql57.rdsmj85epr606zi.rds.bj.baidubce.com', user:'sam', database:'samMYSQL', password:'xxxxxxxx', }) const [rows, fields] = await connection.execute('SELECT version();') return rows } 错误如下: WAService.js:1 Uncaught (in promise) Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail requestID 8a0ca2a7-f0f0-11e9-af3a-525400192d0e, cloud function service error code -504002, error message Cannot read property 'execute' of undefined; at cloud.callFunction api; at new u (WAService.js:1) at d (WAService.js:1) at f (WAService.js:1) at Function.success (WAService.js:1) at WAService.js:1 at C (WAService.js:1) at i.<anonymous> (WAService.js:1) at i.emit (WAService.js:1) at Rs (WAService.js:1) at WAService.js:1
2019-10-18朋友,我也遇到同样问题,去访问百度云数据库,一样的错误,请问你解决了吗,可以指点我一下吗?
云函数mysql2无法请求第三方服务器数据,和官方一样,为什么不行?云函数安装了mysql2,也按照官方的写法,host填写我自己的服务器ip,user为数据库用户名,database为数据库名,password为数据库密码,但一直请求数据失败,而且每请求一次,报错的信息里面'root'@'172.81.212.74'中的ip并不是我填写的ip,也试过把host填写为域名,但还是请求失败 Uncaught (in promise) Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail requestID 7767dbfe-bd69-11e9-90fc-525400235f2a, cloud function service error code -504002, error message Access denied for user 'root'@'172.81.212.74' (using password: YES); at cloud.callFunction api [图片]
2019-10-17