1. 程式人生 > 其它 >uni-app之資料驅動的picker選擇器( uni-data-picker)之可以選擇到任意級別

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

參考網址

有志者,事竟成,破釜沉舟,百二秦關終屬楚; 苦心人,天不負,臥薪嚐膽,三千越甲可吞吳。