小程序中如何使用循环索引生成动态的class?

2,584 阅读2分钟

本文结合项目开发过程中的具体需求场景,介绍了微信小程序中如何使用循环索引动态生成class或者id。通过阅读本文可以学习到:1.微信小程序开发过程中需要动态绑定class的场景 2.微信小程序video组件的相关使用方法 3.wx.createVideoContext以及wx.createSelectorQuery的使用 4.wxs的作用和使用方法。欢迎阅读本文,一起学习~

需求场景

笔者在开发微信小程序时,遇到如下图所示的需求:

如上图所示,我们需要把video组件默认的播放控件(播放/暂停按钮等)隐藏,然后使用UI提供的播放按钮icon(下文称其为:自定义播放按钮),通过点击这个自定义播放按钮来播放视频。

video组件是通过循环遍历消息列表动态生成的,所以会存在多个video组件,那么如何判断当前点击的是哪一个video组件呢?不难想到我们可以给video组件加上动态的class和(或)id用来标定当前的video组件,然后通过wx.createVideoContext和(或)wx.createSelectorQuery 来获取当前的video组件。

动态绑定class的一般场景

一般的常见动态绑定class的场景如下:

<view wx:for="{{blockList}}" class="{{item.hasRead ? 'read-class': 'unread-class'}}" >
    {{item.content}}
</view>

如上代码所示,这种场景就是根据元素的状态(例如是否选中等)来显示不同的样式。

根据循环索引生成动态class

如果要根据循环的索引index来生成不同的样式该如何做呢?笔者尝试如下的方式:

<video  class="message-video {{ `video-${index}` }}" 
  wx:if="{{item.messageType === 5}}">
</video>

可是编译器提示报错:

就在笔者一筹莫展之时,看到了文末参考资料【3】,文中提到可以使用WXS中定义的模块来解决此类问题,关于WXS的内容读者可以阅读参考资料【1】、【2】,笔者不在此赘述。使用WXS,笔者就可以解决使用循环索引生成动态class的问题啦,上代码:

<wxs module="classGenerate">
function getVideoClass(index) {
  console.log('调用啦吗')
  return "video-"+index
}
module.exports.getVideoClass = getVideoClass;
</wxs>

这段代码可以放到wxml文件的最上面,然后就可以这样使用了:

<video   
  controls="{{false}}" 
  class="message-video {{ classGenerate.getVideoClass(index)}}"
  wx:if="{{item.messageType === 5}}" 
></video>

使用调试工具中的wxml Panel 检查video元素可以看到其已经被加上动态生成的样式了:

解决需求

有了动态生成的class之后,就可以实现本文最初提到的需求场景了。这里为了简单起见,我们把video组件的自身控件都隐藏,然后为其绑定一个点击事件,当点击video组件的时候播放视频。wxml代码如下:

<video 
  id="{{classGenerate.getVideoClass(index)}}" 
  data-class="{{classGenerate.getVideoClass(index)}}" 
  bindtap="playVideo"  
  controls="{{false}}"  
  class="message-video {{ classGenerate.getVideoClass(index)}}" 
  wx:if="{{item.messageType === 5}}" 
></video>

playVideo方法如果使用wx.createSelectorQuery则代码如下:

playVideo(e:any) {
  const videoFlag = e.currentTarget.dataset.class;
  const query = wx.createSelectorQuery()
  query.select(`.${videoFlag}`).context((res) => {
    const videoContext:any = res
    console.log(videoContext)
    videoContext.play()
  }).exec()
},

playVideo方法如果使用wx.createVideoContext则代码如下:

playVideo(e:any) {
  const videoFlag = e.currentTarget.dataset.class;
  const videoContext:any = wx.createVideoContext(videoFlag, this)
  console.log(videoContext)
  videoContext.play()
},

两种方法都可以,打印出来的videoContext如下图所示:

总结

本文首先介绍了微信小程序中动态绑定class的场景,即根据元素的状态(例如是否选中等)来显示不同的样式。然后本文介绍了如何使用循环索引动态生成class或者id,即需要借助WXS模块导出的函数来生成动态样式。

最后本文介绍了如何结合动态class(或者id)和createSelectorQuery(或者createVideoContext)来实现点击自定义播放按钮来播放视频。本文正在参加「金石计划」,欢迎一起参与!

参考资料

【1】小程序框架 /视图层 /WXS

【2】WXS 语法参考

【3】微信小程序内怎样动态绑定类名

【4】微信小程序动态绑定class样式类

【5】微信小程序动态绑定style样式