vant picker+popup 自定义三级联动

vant picker+popup 自定义三级联动


picker选择器的数据由columns属性控制,columns中有几个元素就代表该选择器有多少级,通过change方法来给对应列赋值。

columns = [{
        values: column1, // 对应列的值
        defaultIndex: 0, // 默认选中项索引
        className: 'class1'	// 对应列的类名 
    },
    {
        values: [],
        defaultIndex: 0,
        className: 'class2'
    },
    {
        values: [],
        defaultIndex: 0,
        className: 'class3'
    }
];

demo

<template>
<div class="form">
    <van-row type="flex" justify="center" align="center" style="padding-top:10px">
        <van-col span="5" class="text">自定义三级联动</van-col>
        <van-col span="19">
            <van-field v-model="student" placeholder="请选择" @click="stuShow = true" :readonly="true" />
        </van-col>
    </van-row>
    <!-- 底部弹出 -->
    <van-popup v-model="stuShow" position="bottom" :style="{ height: '40%' }">
        <van-picker :columns="stuLoad" @confirm="stuConfirm" @change="stuChange" @cancel="stuShow = false" show-toolbar />
    </van-popup>
</div>
</template>

<script>
export default {
    name: "Form",
    data() {
        return {
            student: '',
            stuShow: false,
            stuLoad: [],
            stuColumn1: [],
            stuColumn2: [],
            stuColumn3: []
        };
    },
    created() {
        this.makeData(); // 页面加载时给选择框赋初始值
    },
    methods: {
        makeData() { // 模拟数据,生产环境用axios获取数据
            let column1 = [{
                'kid': 0,
                'text': '请选择'
            }, {
                'kid': 1,
                'text': '一年级'
            }, {
                'kid': 2,
                'text': '二年级'
            }];
            let column2 = {
                '1': [{
                    'kid': 1,
                    'text': '一组'
                }, {
                    'kid': 2,
                    'text': '二组'
                }, {
                    'kid': 3,
                    'text': '三组'
                }],
                '2': [{
                    'kid': 4,
                    'text': '四组'
                }, {
                    'kid': 5,
                    'text': '五组'
                }]
            }
            let column3 = {
                '1': [{
                    'kid': 1,
                    'text': '小明'
                }, {
                    'kid': 2,
                    'text': '小红'
                }, {
                    'kid': 3,
                    'text': '小刚'
                }],
                '2': [{
                    'kid': 4,
                    'text': 'Amy'
                }, {
                    'kid': 5,
                    'text': 'Sam'
                }],
                '3': [{
                    'kid': 4,
                    'text': 'Sion'
                }, {
                    'kid': 5,
                    'text': 'Juno'
                }],
                '4': [{
                    'kid': 6,
                    'text': 'Lucy'
                }, {
                    'kid': 7,
                    'text': 'Tom'
                }],
                '5': [{
                    'kid': 6,
                    'text': 'Iwan'
                }]
            }
            let columns = [];
            columns = [{
                    values: column1,
                    defaultIndex: 0 //默认选中项索引
                },
                {
                    values: [],
                    defaultIndex: 0
                },
                {
                    values: [],
                    defaultIndex: 0
                }
            ];
            this.stuColumn2 = column2;
            this.stuColumn3 = column3;
            this.stuLoad = columns;
        },
        stuConfirm(value, index) { // 下方弹出层点击确认时触发
            // value为各列选中值
            // index为各列选中的索引
            if (index.indexOf(0) > -1) {
                alert('请选择');
            } else {
                let content = value[0]['text'] + ' / ' + value[1]['text'] + ' / ' + value[2]['text'];
                this.student = content;
                this.stuShow = false;
            }
        },
        stuChange(picker, value, index) { // 选择器改变时触发
            // Picker 实例
            // value为当前选中值
            // index为当前列对应的索引,第一列index为0,第二列index为1,依次列推
            if (index == 0) { // 改变第一列的值
                let i = value[0]['kid'];
                let item = this.stuColumn2[i] ? this.stuColumn2[i] : [];
                if (item && item[0]['text'] != '请选择') {
                    item.unshift({
                        'kid': 0,
                        'text': '请选择'
                    })
                }
                picker.setColumnValues(1, item); // 给对应的列赋值,第一个参数为列的index值,第二个参数为列的values
            } else if (index == 1) {
                let i = value[1]['kid'];
                let item = this.stuColumn3[i] ? this.stuColumn3[i] : [];
                if (item.length != 0 && item[0]['text'] != '请选择') {
                    item.unshift({
                        'kid': 0,
                        'text': '请选择'
                    })
                }
                picker.setColumnValues(2, item);
            }
        }
    }
};
</script>

<style scoped>
.text {
    text-align: right;
}
</style>
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vant weapp 是一款基于微信小程序的组件库,提供了丰富的组件和样式以方便开发者快速实现小程序功能。其中,picker popup 组件是一个常用的选择器弹出框组件,可以用于用户选择数据的情景。 使用 picker popup 可以实现许多案例,以下是一个使用 picker popup 的案例示例: 假设有一个小程序页面需要用户选择省份和城市的功能。在点击一个按钮后,会弹出一个选择器弹出框,用户可以选择对应的省份和城市。 1. 页面准备: 在小程序的页面中引入 vant weapp 的 picker popup,设置好按钮和弹出框的触发事件。 2. 数据提前准备: 在页面的 data 中创建两个数组,分别保存省份和城市的数据。省份数据保存所有的省份信息,城市数据保存对应省份下的城市信息。可以使用接口或者静态数据来获取并保存这些数据。 3. picker popup 初始化: 在按钮的触发事件中,先进行数据的初始化。通过设置 picker popup 的数据字段和设置选择器的列数,可以实现省份和城市的级联选择器效果。 4. 数据联动和渲染: 当用户选择不同的省份时,触发 onChange 事件,更新城市数据。根据选择的省份,动态过滤出对应的城市数据,再更新 picker popup 的数据字段。 5. 数据选择与提交: 当用户完成选择后,点击确定按钮提交选择的省份和城市信息,并关闭 picker popup。 通过以上步骤,就可以在 vant weapp 的 picker popup 中实现省份和城市选择的功能。这样的案例适用于需要用户选择数据的场景,可以提高用户体验和操作便利性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值