本篇文章给大家带来的内容是关于列表渲染wx:key的作用以及条件渲染 wx:if 与 hidden之间的区别,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
本篇文章给大家带来的内容是关于微信小程序中使用async/await语法的方法(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 开发微信小程序离不开“页面渲染”,对于初学者来说很难理解小程序里的“页面渲染”是什么、怎么用? 下面是个“列表渲染”的例子: <view wx:for="{{array}}"> {{index}}: {{item.message}} </view> Page({ data: { array: [{ message: 'foo', }, { message: 'bar' }] } }) 上面的例子可以看出,默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item。当然,使用 wx:for-item 可以指定数组当前元素的变量名,使用 wx:for-index 可以指定数组当前下标的变量名,如下: <view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName"> {{idx}}: {{itemName.message}} </view> 下面是个“条件渲染”的例子: <view wx:if="{{condition}}">True</view> Page({ data: { condition: true } }) 上面的例子说明,当 condition 为真时,页面渲染上面的 view 标签。当然也可以用 wx:elif 和 wx:else 来添加一个 else 块,如下: <view wx:if="{{length > 5}}">1</view> <view wx:elif="{{length > 2}}">2</view> <view wx:else>3</view> 下面接入正题,探索文章题目的疑问 一、 列表渲染中的 wx:key 有什么作用 其实初次看 官方文档 可能会对 wx:key 有点懵,官方解释是这样的: 根据我多年看文档经验,一般我看不懂的可以忽略不重要的文字,只需关注重点,例如上图的文字加粗部分,因此,一开始我选择不写 wx:key 这个属性。然而在开发过程中写多了列表渲染(而没有加 wx:key)之后,控制台会报很多的 wx:key 的警告,对于有点代码洁癖的我看起来很不爽,但又苦于不清楚 wx:key 的真正作用,于是自创了一个解决办法,那就是在每个列表渲染后面加上 wx:key="{{index}}",类似下面这样: <view wx:for="{{array}}" wx:key="{{index}}"> {{item}} </view> 于是我惊奇地发现警告统统不见了,也没有其他负面影响,于是我就这样用了大半年。 <switch wx:for="{{objectArray}}" wx:key="unique" style="display: block;"> {{item.id}} </switch> Page({ data: { objectArray: [ {id: 5, unique: 'unique_5'}, {id: 4, unique: 'unique_4'}, {id: 3, unique: 'unique_3'}, {id: 2, unique: 'unique_2'}, {id: 1, unique: 'unique_1'}, {id: 0, unique: 'unique_0'}, ] } }) 其实,wx:key 是用来绑定当前列表中的项目特征的,也就是说,如果列表是动态更新的,那么 wx:key 的作用是保持原有项目的整个状态不变。 <block wx:for="{{[1, 2, 3]}}" wx:key="*this"> <view>{{index}}:</view> <view>{{item}}</view> </block> 巧用 wx:key 属性
二、 wx:if 和 hidden 有什么区别其实我们用条件渲染更多地在用 wx:if 而不是 hidden,因为前者可以拓展,后者缺乏一定的逻辑。然而他们到底有什么区别呢? 上图中,我们大概可以了解到,如果需要频繁切换状态,用 hidden,否则用 wx:if。 <view class="load-event" hidden="{{!isAdd}}">加载中……</view> <view class="load-event" hidden="{{!isAdded && isMore}}">没有更多了</view> 上面代码是一个上拉加载动画显示与隐藏组件,可以看到用的是 hidden,因为他是一个需要频繁切换的组件。 <block wx:if="{{node.name === 'p'}}"> <view class="{{node.attrs.class}}" data-index="{{index}}" bindtap="toText"> <text selectable="true">{{node.children[0].text}}</text> </view> </block> <block wx:if="{{node.name === 'img'}}"> <image class="{{node.attrs.class}}" src="{{node.attrs.src}}"></image> </block> <block wx:if="{{node.name === 'video'}}"> <video class="{{node.attrs.class}}" src="{{node.attrs.src}}"></video> </block> 上面代码展示的是渲染文字还是图片或者是视频,只展示其中的一个那么用 wx:if 最佳。 下面是一个自定义 input 组件: <view wx:if="{{isInput}}" class="show-input"> <view class="input-item"> <input class="item-input" bindconfirm="onSend" bindinput="inputHandle" bindblur="hideInput"></input> <view class="send-btn" catchtap="onSend">发送</view> </view> </view> 其功能是点击评论按钮能实时显示输入框,否则隐藏。这里为什么用 wx:if 呢?因为我希望它显示时是新的 input 组件,不是之前渲染好的,这样如果我刚输入完文字,再次评论不会出现上一次的文字残留。 巧用 wx:if 和 hidden
三、思考(引伸)1、 <block> 这个元素在列表和条件渲染上是很好用的,不过要注意不要在这个标签上绑定其他属性,比如 data- 或者绑定事件 bindtap。下面是一个反例: <block wx:if="{{true}}" data-id="1" bindtap="tapName"> <view>view1</view> <view>view2</view> </block> 上面的代码里,在 js 中定义绑定事件后,你会发现不会执行。原因就在 <block> 元素在渲染页面后并不会存在,他不是个组件,不会渲染在页面树节点里面,所以在他上面绑定的事件或者属性也不会有效。 2、 当 wx:for 的值为字符串时,会将字符串解析成字符串数组;另外,花括号和引号之间如果有空格,将最终被解析成为字符串,请看下面的例子: <view wx:for="array"> {{item}} </view> 等同于 <view wx:for="{{['a','r','r','a','y']}}"> {{item}} </view> <view wx:for="{{[1,2,3]}} "> {{item}} </view> 等同于 <view wx:for="{{[1,2,3] + ' '}}"> {{item}} </view> 本文参考:微信小程序开发基础教程 https://www.html.cn/study/20.html 以上就是列表渲染wx:key的作用以及条件渲染 wx:if 与 hidden之间的区别的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |