uni-app之数据驱动的picker选择器( uni-data-picker)之可以选择到任意级别

背景说明

uni-app 官方的插件市场有数据驱动选择器,可以用作多级分类的场景。本人引入插件后,发现,在h5和微信小程序都只能选择到叶子级。而在给出的官方组件示例中确并非如此。

 

以选择年级,而不选择班级。然后,想试试官方的手机版,发现并没有示例(截至日期2021年8月3日)为止。

当然,这里操作起选择器的时候,或多或少,有些繁琐。因为下方的选择框关闭一次。

然后,我把官网的示例项目下载下来。运行一下,发现做不到只选择年级,不选择班级(似乎,只能到叶子节点了)。

两边的东西居然有区别。不知道官网以后会不会改进方案。

网页的组件示例下载的组件示例
点击一次后选择当前组件,并关闭用于选择的弹出框如果包含子级,则切换到子级选择页面;如果不包含子级选择,则关闭

不过,本人的需求中,有可能选择的不是叶子。比如,选择部门的时候。所以,怎样才能任意层级的数据都是可选的呢?

问题和提出解决方案

查看说明,发现了uni-data-picker包含以下事件。

事件名称类型说明
@changeEventHandle选择完成时触发 {detail: {value}}
@nodeclickEventHandle节点被点击时触发
@popupclosedEventHandle弹出层被关闭时触发

 思前想后,有了两种解决方案。

方案一:当点击某一项(触发@nodeclick)时,则选中某一项。

方案二:当点击某一项(触发@nodeclick)时,暂存当前选中的项值;当关闭弹出层(@popupclosed)时,则选中某一项。

考虑如果涉及级联,则方案二,数据更少的变动,则可能更少的影响级联。

代码示例

方案一的.vue文件代码如下:

<template>
    <view class="container">
        <view class="title">
            <text>uni-data-picker 本地数据</text>
        </view>
        <uni-data-picker placeholder="请选择班级" popup-title="请选择所在地区" :localdata="dataTree" v-model="classes"
             @nodeclick="onnodeclick"  >
        </uni-data-picker>

    </view>
</template>

<script>
    export default {
        data() {
            return {
                classes: '1-2',
                dataTree: [{
                    text: "一年级",
                    value: "1-0",
                    children: [{
                        text: "1.1班",
                        value: "1-1"
                    },
                    {
                        text: "1.2班",
                        value: "1-2"
                    }]
                },
                {
                    text: "二年级",
                    value: "2-0",
                    children: [{
                        text: "2.1班",
                        value: "2-1"
                    },
                    {
                        text: "2.2班",
                        value: "2-2"
                    }]
                },
                {
                    text: "三年级",
                    value: "3-0",
                    disable: true
                }]
            }
        },
        methods: {
            onnodeclick(e) {
                this.classes = e.value;
            },
        }
    }
</script>

<style>
    .container {
        height: 100%;
        /* #ifndef APP-NVUE */
        display: flex;
        max-width: 500px;
        padding: 0 15px;
        /* #endif */
        flex-direction: column;
    }

    .title {
        font-size: 14px;
        font-weight: bold;
        margin: 20px 0 5px 0;
    }

    .data-pickerview {
        height: 400px;
        border: 1px #e5e5e5 solid;
    }
</style>

 方案二的.vue文件代码如下:

<template>
    <view class="container">
        <view class="title">
            <text>uni-data-picker 本地数据</text>
        </view>
        <uni-data-picker placeholder="请选择班级" popup-title="请选择所在地区" :localdata="dataTree" v-model="classes"
             @nodeclick="onnodeclick"  @popupclosed="onpopupclosed">
        </uni-data-picker>

    </view>
</template>

<script>
    export default {
        data() {
            return {
                tempClasses : '',    // 临时存放vue值
                classes: '1-2',
                dataTree: [{
                    text: "一年级",
                    value: "1-0",
                    children: [{
                        text: "1.1班",
                        value: "1-1"
                    },
                    {
                        text: "1.2班",
                        value: "1-2"
                    }]
                },
                {
                    text: "二年级",
                    value: "2-0",
                    children: [{
                        text: "2.1班",
                        value: "2-1"
                    },
                    {
                        text: "2.2班",
                        value: "2-2"
                    }]
                },
                {
                    text: "三年级",
                    value: "3-0",
                    disable: true
                }]
            }
        },
        methods: {
            /** 点击选项时执行方法
             * @param {Object} e
             */
            onnodeclick(e) {
                this.tempClasses = e.value;
            },
            /** 关闭弹出框执行方法
             * @param {Object} e
             */
            onpopupclosed(e) {
                this.classes = this.tempClasses;
            },
        }
    }
</script>

<style>
    .container {
        height: 100%;
        /* #ifndef APP-NVUE */
        display: flex;
        max-width: 500px;
        padding: 0 15px;
        /* #endif */
        flex-direction: column;
    }

    .title {
        font-size: 14px;
        font-weight: bold;
        margin: 20px 0 5px 0;
    }

    .data-pickerview {
        height: 400px;
        border: 1px #e5e5e5 solid;
    }
</style>

扩展——获取数据驱动选择器当前的选中值

数据驱动选择器中,选择完成时(@change)可以获取到当前选中的数组。但是,@nodeclick方法或其他状态下是否可用获取当前选中的数组?可以。我们只要标记对应的数据驱动选择器,即可在代码中找到对象及其选中的数组。

1.标记uni-data-picker对象。

<uni-data-picker ref="class" placeholder="请选择班级" popup-title="请选择所在地区" :localdata="dataTree" v-model="classes"
         @nodeclick="onnodeclick" >

2.获取当前对象的选中值。

 onnodeclick(e) {
     this.classes = e.value;
     let selected = this.$refs["class"].selected;
     console.log("当前选中的值=>" , selected);
 },

参考网址

有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

<think>好的,我现在需要解决用户的问题:在uni-app中如何将uni-data-pickeruni-datetime-picker组件进行嵌套使用。用户希望看到具体的使用方法示例。首先,我需要回忆这两个组件的功能和用法。 首先,uni-data-picker是一个支持多级联选择的数据选择器,可以用于选择地区、分类等层级数据。它支持通过数据字典、本地数据或API获取数据源。而uni-datetime-picker是日期时间选择器,用于选择日期或时间。用户需要将这两个组件嵌套使用,可能是在选择某个数据后,再选择日期时间,比如先选择地区再选择该地区的某个时间。 接下来,我需要考虑如何将这两个组件结合。可能的场景是,在uni-data-picker选择完成后,触发某个事件,然后在相应位置显示uni-datetime-picker。需要处理数据联动,比如选择某个层级的数据后,动态显示日期选择器,并传递相关参数。 然后,我需要确保代码结构正确,包括数据绑定、事件处理和组件的嵌套方式。例如,在uni-data-picker的change事件中获取选中的值,然后根据这些值控制uni-datetime-picker的显示或数据源。同时,要注意表单提交时的数据整合,可能需要使用v-model来绑定各自的值,并在提交时合并数据。 另外,需要参考用户提供的引用内容。引用[1]中提到uni-data-picker支持多种数据源和展示方式,modelValue用于绑定值,可以支持数组形式。而引用[2]讨论表单提交,包括picker组件的使用。因此,在示例代码中,应该展示如何通过v-model绑定两个组件的值,并在提交时处理数据。 可能的步骤: 1. 在模板中放置uni-data-picker,绑定其v-model为selectedData,并设置change事件处理函数。 2. 当uni-data-picker的值变化时,触发事件,可以在此处决定是否显示uni-datetime-picker。 3. 在需要的位置放置uni-datetime-picker,绑定其v-model为selectedTime,并可能根据selectedData的值动态设置其属性,如日期范围。 4. 表单提交时,将两个组件的值合并处理。 需要注意的点: - 两个组件的v-model需要分别绑定不同的变量,避免冲突。 - 事件触发的时机,确保数据正确传递。 - 样式布局,可能需要将两个picker放在表单的不同位置,或者根据条件显示。 现在需要编写示例代码,演示基本的结构。例如,当选择完数据后显示日期选择器,或者两者同时显示,提交时收集所有数据。同时,处理表单提交的方法,将数据合并发送。 可能遇到的问题: - 如何根据uni-data-picker选择结果动态改变uni-datetime-picker的选项?比如选择不同地区后,可选的日期范围不同。这可能需要调用API获取对应的日期数据,但示例中可以简化,仅展示绑定和事件处理。 - 表单验证,确保两个组件的数据都被正确填写,但用户的问题可能不需要复杂的验证,所以示例中可以省略。 综上所述,示例代码应展示两个组件的嵌套使用,数据绑定和事件处理,以及表单提交时的数据整合。需要确保代码符合uni-app的语法,并参考官方文档中的使用方法。</think>在uni-app中嵌套使用`uni-data-picker`和`uni-datetime-picker`,通常需要结合表单数据绑定和事件联动。以下是具体实现方法及示例: --- ### 实现步骤 1. **数据绑定** 通过`v-model`分别绑定两个组件的值,确保数据独立且可联动。 2. **事件监听** 监听`uni-data-picker`的`@change`事件,根据选择结果动态控制`uni-datetime-picker`的显示或参数。 3. **数据整合** 在提交时合并两个组件的值,用于后续接口传参或表单提交。 --- ### 示例代码 ```html <template> <view> <!-- 数据选择器 --> <uni-data-picker v-model="selectedData" :local-data="categories" @change="handleDataChange" popup-title="请选择分类" ></uni-data-picker> <!-- 日期时间选择器(根据数据选择结果动态显示) --> <uni-datetime-picker v-if="showDateTimePicker" v-model="selectedTime" type="date" :start="startDate" :end="endDate" ></uni-datetime-picker> <!-- 提交按钮 --> <button @click="submitForm">提交</button> </view> </template> <script> export default { data() { return { selectedData: [], // 存储uni-data-picker选中的值 selectedTime: '', // 存储uni-datetime-picker选中的时间 showDateTimePicker: false, categories: [ // 本地测试数据 { text: '电子产品', value: '1', children: [ { text: '手机', value: '1-1' }, { text: '电脑', value: '1-2' } ]} ], startDate: '2023-01-01', endDate: '2023-12-31' }; }, methods: { handleDataChange(e) { // 当选择数据后,显示日期选择器 this.showDateTimePicker = e.detail.value.length > 0; }, submitForm() { // 提交整合后的数据 const formData = { category: this.selectedData, time: this.selectedTime }; console.log('提交数据:', formData); // 调用API提交,例如:this.$api.post(formData); } } }; </script> ``` --- ### 关键点解析 1. **数据联动** `uni-data-picker`的`@change`事件返回选中值,通过`showDateTimePicker`控制`uni-datetime-picker`的显隐,实现条件渲染[^1]。 2. **作用域隔离** 两个组件通过独立的`v-model`绑定数据(`selectedData`和`selectedTime`),避免冲突。 3. **动态参数** 可根据`selectedData`的值动态设置`uni-datetime-picker`的`start`和`end`属性,例如从接口获取日期范围[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值