uni-app之數據驅動的picker選擇器( uni-data-picker)之可以選擇到任意級別


背景說明

uni-app 官方的插件市場有數據驅動選擇器,可以用作多級分類的場景。本人引入插件后,發現,在h5和微信小程序都只能選擇到葉子級。而在給出的官方組件示例中確並非如此。

 

 可以選擇年級,而不選擇班級。然后,想試試官方的手機版,發現並沒有示例(截至日期2021年8月3日)為止。

當然,這里操作起選擇器的時候,或多或少,有些繁瑣。因為下方的選擇框關閉一次。

然后,我把官網的示例項目下載下來。運行一下,發現做不到只選擇年級,不選擇班級(似乎,只能到葉子節點了)。

兩邊的東西居然有區別。不知道官網以后會不會改進方案。

  網頁的組件示例 下載的組件示例
點擊一次后 選擇當前組件,並關閉用於選擇的彈出框 如果包含子級,則切換到子級選擇頁面;如果不包含子級選擇,則關閉

不過,本人的需求中,有可能選擇的不是葉子。比如,選擇部門的時候。所以,怎樣才能任意層級的數據都是可選的呢?

問題和提出解決方案

查看說明,發現了uni-data-picker包含以下事件。

事件名稱 類型 說明
@change EventHandle 選擇完成時觸發 {detail: {value}}
@nodeclick EventHandle 節點被點擊時觸發
@popupclosed EventHandle 彈出層被關閉時觸發

 思前想后,有了兩種解決方案。

方案一:當點擊某一項(觸發@nodeclick)時,則選中某一項。

方案二:當點擊某一項(觸發@nodeclick)時,暫存當前選中的項值;當關閉彈出層(@popupclosed)時,則選中某一項。

考慮如果涉及級聯,則方案二,數據更少的變動,則可能更少的影響級聯。

代碼示例

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

 1 <template>
 2     <view class="container">
 3         <view class="title">
 4             <text>uni-data-picker 本地數據</text>
 5         </view>
 6         <uni-data-picker placeholder="請選擇班級" popup-title="請選擇所在地區" :localdata="dataTree" v-model="classes"
 7              @nodeclick="onnodeclick"  >
 8         </uni-data-picker>
 9 
10     </view>
11 </template>
12 
13 <script>
14     export default {
15         data() {
16             return {
17                 classes: '1-2',
18                 dataTree: [{
19                     text: "一年級",
20                     value: "1-0",
21                     children: [{
22                         text: "1.1班",
23                         value: "1-1"
24                     },
25                     {
26                         text: "1.2班",
27                         value: "1-2"
28                     }]
29                 },
30                 {
31                     text: "二年級",
32                     value: "2-0",
33                     children: [{
34                         text: "2.1班",
35                         value: "2-1"
36                     },
37                     {
38                         text: "2.2班",
39                         value: "2-2"
40                     }]
41                 },
42                 {
43                     text: "三年級",
44                     value: "3-0",
45                     disable: true
46                 }]
47             }
48         },
49         methods: {
50             onnodeclick(e) {
51                 this.classes = e.value;
52             },
53         }
54     }
55 </script>
56 
57 <style>
58     .container {
59         height: 100%;
60         /* #ifndef APP-NVUE */
61         display: flex;
62         max-width: 500px;
63         padding: 0 15px;
64         /* #endif */
65         flex-direction: column;
66     }
67 
68     .title {
69         font-size: 14px;
70         font-weight: bold;
71         margin: 20px 0 5px 0;
72     }
73 
74     .data-pickerview {
75         height: 400px;
76         border: 1px #e5e5e5 solid;
77     }
78 </style>
View Code

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

 1 <template>
 2     <view class="container">
 3         <view class="title">
 4             <text>uni-data-picker 本地數據</text>
 5         </view>
 6         <uni-data-picker placeholder="請選擇班級" popup-title="請選擇所在地區" :localdata="dataTree" v-model="classes"
 7              @nodeclick="onnodeclick"  @popupclosed="onpopupclosed">
 8         </uni-data-picker>
 9 
10     </view>
11 </template>
12 
13 <script>
14     export default {
15         data() {
16             return {
17                 tempClasses : '',    // 臨時存放vue值
18                 classes: '1-2',
19                 dataTree: [{
20                     text: "一年級",
21                     value: "1-0",
22                     children: [{
23                         text: "1.1班",
24                         value: "1-1"
25                     },
26                     {
27                         text: "1.2班",
28                         value: "1-2"
29                     }]
30                 },
31                 {
32                     text: "二年級",
33                     value: "2-0",
34                     children: [{
35                         text: "2.1班",
36                         value: "2-1"
37                     },
38                     {
39                         text: "2.2班",
40                         value: "2-2"
41                     }]
42                 },
43                 {
44                     text: "三年級",
45                     value: "3-0",
46                     disable: true
47                 }]
48             }
49         },
50         methods: {
51             /** 點擊選項時執行方法
52              * @param {Object} e
53              */
54             onnodeclick(e) {
55                 this.tempClasses = e.value;
56             },
57             /** 關閉彈出框執行方法
58              * @param {Object} e
59              */
60             onpopupclosed(e) {
61                 this.classes = this.tempClasses;
62             },
63         }
64     }
65 </script>
66 
67 <style>
68     .container {
69         height: 100%;
70         /* #ifndef APP-NVUE */
71         display: flex;
72         max-width: 500px;
73         padding: 0 15px;
74         /* #endif */
75         flex-direction: column;
76     }
77 
78     .title {
79         font-size: 14px;
80         font-weight: bold;
81         margin: 20px 0 5px 0;
82     }
83 
84     .data-pickerview {
85         height: 400px;
86         border: 1px #e5e5e5 solid;
87     }
88 </style>
View Code

擴展——獲取數據驅動選擇器當前的選中值

數據驅動選擇器中,選擇完成時(@change)可以獲取到當前選中的數組。但是,@nodeclick方法或其他狀態下是否可用獲取當前選中的數組?可以。我們只要標記對應的數據驅動選擇器,即可在代碼中找到對象及其選中的數組。

1.標記uni-data-picker對象。

<uni-data-picker ref="class" placeholder="請選擇班級" popup-title="請選擇所在地區" :localdata="dataTree" v-model="classes"
         @nodeclick="onnodeclick" >

2.獲取當前對象的選中值。

1 onnodeclick(e) {
2     this.classes = e.value;
3     let selected = this.$refs["class"].selected;
4     console.log("當前選中的值=>" , selected);
5 },

參考網址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM