2 回复
在 uni-app 中,虽然默认的下拉框组件(picker)不支持直接自定义选项的视图,但你可以通过一些变通的方法实现自定义选项的功能。通常,我们可以结合 picker-view
和 picker-view-column
组件来实现高度自定义的下拉选择功能。
以下是一个使用 picker-view
和 picker-view-column
实现自定义选项的示例代码:
<template>
<view class="container">
<view class="custom-picker">
<view class="picker-item" @click="showPicker = true">{{selectedValue}}</view>
<picker-view v-if="showPicker" :value="pickerValue" @change="onPickerChange" style="width: 100%; height: 300px;">
<picker-view-column>
<view v-for="(item, index) in options" :key="index" class="picker-item" :style="{backgroundColor: selectedIndex === index ? '#f8f8f8' : '#fff'}">
<!-- 自定义选项内容 -->
<image v-if="item.type === 'image'" :src="item.src" style="width: 100%; height: 100px;"></image>
<text v-else>{{item.text}}</text>
</view>
</picker-view-column>
</picker-view>
</view>
<view class="mask" v-if="showPicker" @click="showPicker = false"></view>
</view>
</template>
<script>
export default {
data() {
return {
showPicker: false,
pickerValue: [0],
selectedIndex: 0,
selectedValue: '',
options: [
{ text: 'Option 1' },
{ text: 'Option 2' },
{ type: 'image', src: '/static/image1.png' },
{ text: 'Option 4' }
]
};
},
mounted() {
this.selectedValue = this.options[this.pickerValue[0]].text || ''; // 初始化显示值
},
methods: {
onPickerChange(e) {
const index = e.detail.value[0];
this.pickerValue = [index];
this.selectedIndex = index;
this.selectedValue = this.options[index].text || ''; // 更新显示值,如果是图片则不显示文本
this.showPicker = false; // 关闭选择器
}
}
};
</script>
<style>
.container {
position: relative;
}
.custom-picker {
position: relative;
z-index: 1;
}
.mask {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
z-index: 0;
}
.picker-item {
padding: 10px;
border: 1px solid #ddd;
}
</style>
在这个示例中,我们通过 picker-view
和 picker-view-column
组件创建了一个自定义选项的下拉选择组件。每个选项可以是文本或图片,通过 v-if
和 v-else
进行条件渲染。当用户点击选择框时,会显示 picker-view
,并在选项改变时更新显示的值并关闭选择器。