uni-app uni-swipe-action组件 使用插槽渲染按钮,IOS上点击按钮,操作错位

前两天使用了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端没有问题。

 

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值