前两天使用了uni-app开发移动端,写了一个列表,需要有滑动显示按钮的功能,查阅uni-app官网 选择了扩展组件里面的uni-swipe-action组件来实现,组件具体的使用方法在这里不过多赘述,官网有最简单的例子。
下面来说我遇到的问题:由于列表的按钮是需要根据每一条数据的status来动态加载按钮的,所以我就选择了使用插槽的方式来渲染按钮
<uni-swipe-action>
<uni-swipe-action-item v-for="(item,index) in list" :key="item.ID">
<view class="content-box hardware-list-item row-between" @click="detail(item)">
<view class="hardware-list-item-left flex-1">
<view class="row-start">
<view class="hardware-name">{{ item.Name }}</view>-
<view class="hardware-type font-size-24">{{ item.Type}}</view>
</view>
<view class="hardware-product-name font-size-24">
{{ item.OrgProductListName }}
</view>
</view>
<view>
<view :class="`status-tag status-tag-${statusColor[item.Status]}`">
{{ statusObj[item.Status] }}</view>
</view>
</view>
<template v-slot:right>
<view v-if="item.Status!==3" class="slot-button hardware-list-btn row-center btn-primary" @click="handleEdit(item)">编辑</view>
<view v-if="item.Status===1" class="slot-button hardware-list-btn row-center btn-warning" @click="handleChangeStatus(item,1)">维修</view>
<view v-if="item.Status===1" class="slot-button hardware-list-btn row-center btn-error" @click="handleScrap(item)">报废</view>
<view v-if="item.Status===2" class="slot-button hardware-list-btn row-center btn-success" @click="handleChangeStatus(item,2)">完成</view>
</template>
</uni-swipe-action-item>
</uni-swipe-action>
在开发过程中没有任何问题,点击按钮能正确执行事件,但是,后来用真机来测试后,发现在安卓手机上没有问题,ios上就出现bug了,点击“维修”执行的是编辑的事件,点击编辑执行的是跳转详情页面(也就是说按钮操作错位了)。
于是我上网查看有没有人遇到过类似问题,查来查去没有看到有关文章,只有一篇报bug的【报Bug】uni-swipe-action 滑动操作 使用插槽多操作时IOS上操作错位 - DCloud问答
其他的都是换另一种实现方式,于是我就再去看官网,官网的例子还有一种实现方式是使用right-options来加载按钮,于是我就试一试这种方式,没想到解决问题了,在ios端测试了,点击按钮的时候,执行正确的事件,但由于我这里的按钮是需要动态加载的,所以按钮的options不能写死在data里面,我只能在请求到数据后,给列表的每一项动态添加btnOption
<uni-swipe-action>
<uni-swipe-action-item v-for="(item,index) in list" :key="item.ID" :right-options="item.btnOption" @click="bindClick($event,item)">
<view class="content-box hardware-list-item row-between" @click="detail(item)">
<view class="hardware-list-item-left flex-1">
<view class="row-start">
<view class="hardware-name">{{ item.Name }}</view>-
<view class="hardware-type font-size-24">{{ item.Type}}</view>
</view>
<view class="hardware-product-name font-size-24">
{{ item.OrgProductListName }}
</view>
</view>
<view>
<view :class="`status-tag status-tag-${statusColor[item.Status]}`">
{{ statusObj[item.Status] }}
</view>
</view>
</view>
</uni-swipe-action-item>
</uni-swipe-action>
<script>
import { searchHardwareAssetsList} from '@/api/hardware/hardware'
export default {
name: 'HardwareList',
data() {
return {
loading:false,
keyword:'', // 关键字查询
list:[], // 硬件列表
totalPage:1, // 总页数
totalCount:0, // 总条数
page:1, // 页数
pageSize: 15, // 分页条数
editBtn:{ text: '编辑', style: { backgroundColor: '#007aff' }},
maintainBtn:{ text: '维修', style: { backgroundColor: '#efa151' }},
scrapBtn:{ text: '报废', style: { backgroundColor: '#e64340' }},
finishBtn:{ text: '完成', style: { backgroundColor: '#42b983' }}
}
},
onLoad(){
this.getList()
},
methods:{
/**
* 获取列表数据
* */
getList(){
const data = {
Page: this.page, PageSize:this.pageSize, Keyword: this.keyword }
searchHardwareAssetsList(data).then(res=>{
const { ResultPage, Results } = res
this.totalPage = ResultPage.TotalPage
this.totalCount = ResultPage.TotalCount
Results.forEach(item=>{
if(item.Status===1){
item.btnOption = [this.editBtn,this.maintainBtn,this.scrapBtn]
}
if(item.Status===2){
item.btnOption = [this.editBtn,this.finishBtn]
}
})
this.list = this.list.concat(Results)
uni.hideNavigationBarLoading()
if(this.list.length >= this.totalCount){
this.status = "noMore"
}
}).catch(()=>{
this.status = "noMore"
})
},
/**
* 按钮事件
* @param e
* @param item
*/
bindClick(e,item){
switch(e.content.text){
case '编辑':
this.handleEdit(item)
break
case '维修':
this.handleChangeStatus(item,1)
break
case '报废':
this.handleScrap(item)
break
case '完成':
this.handleChangeStatus(item,2)
break
}
}
}
}
</script>
最后再进行测试,在ios端没有问题。