npm 傳送門 github 傳送門javascript
npm install i-picker --save
複製代碼
import iPicker from 'i-picker';
Vue.use(iPicker);
複製代碼
經過 values 來設置默認值或改變對應值,注意不要設置列表數據中不存在的value值 非datetime須要設置 columns 列數據css
<button @click="show = true">show</button>
<i-picker v-model="show" :value="values" :columns="columns" @change="onChange" />
複製代碼
export default {
data() {
return {
values: [],
columns: ['杭州', '寧波', '溫州', '嘉興', '湖州']
};
},
methods: {
onChange (picker, text, index, disabled) {
console.log(`當前值:${text}, 當前value:${this.values}, 當前索引:${index}, 當前數據disabled狀態:${disabled}`);
}
}
};
複製代碼
選項能夠爲對象結構,經過設置 disabled 來禁用該選項html
若是設置的values中的數據是 disabled 狀態,則默認爲下一個 disabled 不爲true的數據java
若是該列全部的選項都是 disabled 的狀態,默認返回第一個,能夠經過 change 事件最後一個返回參數 disabled 來判斷數據狀態git
<i-picker v-model="show" :value="values" :columns="columns" @confirm="onConfirm" />
複製代碼
let yearTotal = []
for (var i = 2000; i <= 2030; i++) {
yearTotal.push({
name: i + '年',
value: i,
disabled: i % 5 === 0
})
}
export default {
data() {
return {
values: [],
columns: yearTotal
};
},
methods: {
onConfirm (text, value, index, disabled) {
this.values = value
}
}
};
複製代碼
<i-picker v-model="show" :value="values" :columns="columns" @change="onChange" @cancel="onCancel" @confirm="onConfirm" :visibleItemCount="5" toolbar title="iPicker"/>
複製代碼
export default {
data() {
return {
values: [2],
columns: [
{name: '杭州', disabled: true},
{name: '寧波'},
{name: '溫州', disabled: true},
{name: '嘉興'},
{name: '湖州'}
]
}
},
methods: {
onConfirm (text, value, index, disabled) {
this.values = value
console.log(`當前值:${text}, 當前索引:${index}`);
},
onCancel() {
console.log('取消');
}
}
};
複製代碼
keys 用於設置多列列表的數據,一個 keys 對應一個列表的數據github
<i-picker v-model="show" :value="values" :columns="columns" @change="onChange" @cancel="onCancel" @confirm="onConfirm" toolbar title="iPicker"/>
複製代碼
export default {
data() {
return {
values: [],
columns: [
{keys: ['浙江', '河北']},
{keys: [{name: '杭州'}, {name: '寧波', disabled: true}, {name: '溫州'}]}
]
};
},
methods: {
onChange (picker, text, value, index, disabled) {
switch(text[0]) {
case '浙江':
picker.setColumnKeys(1, [{name: '杭州'}, {name: '寧波', disabled: true}, {name: '溫州'}]);
break;
case '河北':
picker.setColumnKeys(1, [
{name:'石家莊市', value: 'shijiazhuang'},
{name:'唐山市', value: 'tangshan'},
{name:'秦皇島市', value: 'qinhuangdao'},
{name:'邯鄲市', value: 'handan'},
{name:'邢臺市', value: 'xingtai'},
{name:'保定市', value: 'baoding'}
]);
break;
default:
break;
}
},
onConfirm (text, value, index, disabled) {
this.values = value
},
onCancel () {
console.log('cancle')
}
}
};
複製代碼
<i-picker v-model="show" :value="values" :columns="columns" @cancel="onCancel" @confirm="onConfirm" toolbar title="iPicker"/>
複製代碼
export default {
data() {
return {
values: ['cn004', 'yuncheng'],
columns: [
{
keys: [
{name:'北京', value: 'cn001'},
{name:'天津', value: 'cn002'},
{name:'河北', value: 'cn003'},
{name:'山西', value: 'cn004'},
],
className: 'column1'
},
{
keys: {
'cn001': [
{name:'北京市', value: 'beijing'}
],
'cn002': [
{name:'天津市', value: 'tianjing', disabled: true},
],
'cn003': [
{name:'石家莊市', value: 'shijiazhuang'},
{name:'唐山市', value: 'tangshan'},
{name:'秦皇島市', value: 'qinhuangdao'},
{name:'邯鄲市', value: 'handan'},
{name:'邢臺市', value: 'xingtai'},
{name:'保定市', value: 'baoding'},
],
'cn004': [
{name:'太原市', value: 'taiyuan'},
{name:'大同市', value: 'datong'},
{name:'陽泉市', value: 'yangquan'},
{name:'長治市', value: 'changzhi'},
{name:'晉城市', value: 'jincheng'},
{name:'朔州市', value: 'shuozhou'},
{name:'晉中市', value: 'jinzhong'},
{name:'運城市', value: 'yuncheng'},
{name:'臨汾市', value: 'linfen'},
]
},
className: 'column2'
},
{
keys: {
'beijing': [
{name:'東城區', value: 'city001'},
{name:'西城區', value: 'city002'},
{name:'朝陽區', value: 'city003'},
{name:'豐臺區', value: 'city004'},
{name:'石景山區', value: 'city005'},
{name:'海淀區', value: 'city006'},
],
'tianjing': [
{name:'和平區', value: '1city'},
{name:'河東區', value: '2city'},
{name:'河西區', value: '3city'},
],
'shijiazhuang': [
{name:'長安區', value: 'changan'}
],
'tangshan': [
{name:'路南區', value: '001'},
{name:'路北區', value: '002'},
{name:'古冶區', value: '003'},
{name:'開平區', value: '004'},
{name:'豐南區', value: '005'},
{name:'豐潤區', value: '006'},
{name:'灤縣', value: '007'},
{name:'灤南縣', value: '008'},
],
'qinhuangdao': ['海港區'],
'handan': ['邯山區'],
'xingtai': ['橋東區'],
'baoding': ['競秀區'],
'taiyuan': ['小店區'],
'datong': ['城區'],
'yangquan': ['礦區'],
'changzhi': ['長治縣'],
'jincheng': ['城區'],
'shuozhou': ['朔城區'],
'jinzhong': ['榆次區'],
'yuncheng': ['鹽湖區', '臨猗區', '萬榮區'],
'linfen': [{name:'城區'}, {name:'古縣', disabled: true}],
},
className: 'column2'
},
]
};
}
};
複製代碼
單列數據格式ajax
// data
['杭州', '寧波', '溫州']
// 或者使用 name => value 的形式,不設置value的話默認是數組索引值
[
{ name: '杭州', value: 'city01', disabled: true },
{ name: '寧波', value: 'city02' },
{ name: '溫州', value: 'city03', disabled: true },
]
複製代碼
多列數據格式npm
keys 數據對應一個列表數據數組
// ajax異步動態數據
[
{
keys: ['浙江', '天津', '河北', '山西'],
className: 'column1'
},
{
keys: [{ name: '杭州' }, { name: '寧波', disabled: true }, { name: '溫州' }]
}
]
// 或者父子聯動數據
[
{
keys: [
{name:'北京', value: 'cn001'},
{name:'天津', value: 'cn002'},
{name:'河北', value: 'cn003'},
{name:'山西', value: 'cn004'},
],
className: 'column1'
},
{
keys: {
'cn001': [
{name:'北京市', value: 'beijing'}
],
'cn002': [
{name:'天津市', value: 'tianjing', disabled: true},
],
'cn003': [
{name:'石家莊市', value: 'shijiazhuang'},
{name:'唐山市', value: 'tangshan'},
{name:'秦皇島市', value: 'qinhuangdao'},
{name:'邯鄲市', value: 'handan'},
{name:'邢臺市', value: 'xingtai'},
{name:'保定市', value: 'baoding'},
],
'cn004': [
{name:'太原市', value: 'taiyuan'},
{name:'大同市', value: 'datong'},
{name:'陽泉市', value: 'yangquan'},
{name:'長治市', value: 'changzhi'},
{name:'晉城市', value: 'jincheng'},
{name:'朔州市', value: 'shuozhou'},
{name:'晉中市', value: 'jinzhong'},
{name:'運城市', value: 'yuncheng'},
{name:'臨汾市', value: 'linfen'},
]
},
className: 'column2'
},
{
keys: {
'beijing': [
{name:'東城區', value: 'city001'},
{name:'西城區', value: 'city002'},
{name:'朝陽區', value: 'city003'},
{name:'豐臺區', value: 'city004'},
{name:'石景山區', value: 'city005'},
{name:'海淀區', value: 'city006'},
],
'tianjing': [
{name:'和平區', value: '1city'},
{name:'河東區', value: '2city'},
{name:'河西區', value: '3city'},
],
'shijiazhuang': [
{name:'長安區', value: 'changan'}
],
'tangshan': [
{name:'路南區', value: '001'},
{name:'路北區', value: '002'},
{name:'古冶區', value: '003'},
{name:'開平區', value: '004'},
{name:'豐南區', value: '005'},
{name:'豐潤區', value: '006'},
{name:'灤縣', value: '007'},
{name:'灤南縣', value: '008'},
],
'qinhuangdao': ['海港區'],
'handan': ['邯山區'],
'xingtai': ['橋東區'],
'baoding': ['競秀區'],
'taiyuan': ['小店區'],
'datong': ['城區'],
'yangquan': ['礦區'],
'changzhi': ['長治縣'],
'jincheng': ['城區'],
'shuozhou': ['朔城區'],
'jinzhong': ['榆次區'],
'yuncheng': ['鹽湖區', '臨猗區', '萬榮區'],
'linfen': [{name:'城區'}, {name:'古縣', disabled: true}],
},
className: 'column3'
}
]
複製代碼
當 Picker 數據是經過異步獲取時,能夠經過 loading
屬性顯示加載提示數據結構
<i-picker v-model="show" :value="values" :columns="columns" :loading="loading" />
複製代碼
<i-picker v-model="show" :value="values" :columns="columns" @change="onChange" @cancel="onCancel" @confirm="onConfirm" :visibleItemCount="5" toolbar title="iPicker"/>
複製代碼
import icon from './assets/tui.png'
export default {
data() {
return {
values: [1],
columns: [
{name: '寧波'},
{name: `<img src="${icon}" class="y-custom-icon">杭州`},
{name: '溫州'},
{name: '嘉興'},
{name: '湖州'}
]
}
},
methods: {
onConfirm (text, value, index, disabled) {
this.values = value
console.log(`當前值:${text}, 當前索引:${index}`);
},
onCancel() {
console.log('取消');
}
}
};
複製代碼
<style>
.y-custom-icon {
width: 22px;
height: 22px;
margin: 0 3px 0 0;
vertical-align: text-bottom;
}
</style>
複製代碼
須要設置 type 類型
<i-picker v-model="show" :value="currentDate" format="YYYY-MM-DD HH:mm:ss" type="datetime" :min-date="minDate" :max-date="maxDate" @change="onChange" toolbar @cancel="onCancel" @confirm="onConfirm" title="iPicker"/>
複製代碼
export default {
data() {
return {
currentDate: new Date(2018, 0, 1),
minDate: new Date(2018, 0, 1),
maxDate: new Date(2019, 10, 1)
};
},
methods: {
onConfirm (text, value, index, disabled) {
this.currentDate = value
console.log(`當前值:${text.join(',')}, 當前value:${value.join(',')}, 當前索引:${index.join(',')}`);
}
}
};
複製代碼
經過傳入 formatter 函數對選項文字進行處理
<i-picker v-model="show" :value="currentDate" format="YYYY-MM" type="year-month" :min-date="minDate" :max-date="maxDate" :formatter="formatter" toolbar @cancel="onCancel" @confirm="onConfirm" title="iPicker"/>
複製代碼
export default {
data() {
return {
currentDate: new Date(2018, 8, 1),
minDate: new Date(2018, 0, 1),
maxDate: new Date(2019, 10, 1)
}
},
methods: {
formatter (type, value) {
if (type === 'year') {
return `${value}年`
} else if (type === 'month') {
return `${value}月`
}
return value
},
onConfirm (text, value, index) {
this.currentDate = value
console.log(`當前值:${text.join(',')}, 當前value:${value.join(',')}, 當前索引:${index.join(',')}`);
}
}
};
複製代碼
<i-picker v-model="show" :value="currentTime" type="time" :min-hour="minHour" :max-hour="maxHour" @change="onChange" toolbar @cancel="onCancel" @confirm="onConfirm" title="iPicker"/>
複製代碼
export default {
data() {
return {
currentTime: '12:30',
minHour: 10,
maxHour: 30
}
},
methods: {
onConfirm (text, value, index) {
this.currentDate = value
console.log(`當前值:${text.join(',')}, 當前value:${value.join(',')}, 當前索引:${index.join(',')}`);
}
}
};
複製代碼
參數 | 說明 | 類型 | 默認值 |
---|---|---|---|
show | 控制Picker的顯隱 使用 v-model 綁定 |
Boolean |
false |
values | 默認展現值 能夠經過values設置選中值 |
Array | string | Date |
[] |
toolbar | 是否顯示頂部欄 | Boolean |
false |
title | 頂部欄標題 | String |
'' |
loading | 是否顯示加載狀態 | Boolean |
false |
item-height | 選項高度 | Number |
44 |
confirm-button-text | 確認按鈕文字 | String |
確認 |
cancel-button-text | 取消按鈕文字 | String |
取消 |
visible-item-count | 可見的選項個數 | Number |
5 |
參數 | 說明 | 類型 | 默認值 |
---|---|---|---|
columns | 對象數組,配置每一列顯示的數據 | Array |
[] |
value-text | 選項對象中,文字對應的 key | String |
name |
value-key | 選項對象中,value對應的 key | String |
value |
參數 | 說明 | 類型 | 默認值 |
---|---|---|---|
format | 格式化 datetime 的展現,不支持特殊字符 | String |
'' |
type | 類型,可選值爲 datetime date time year-month |
String |
datetime |
formatter | 對選項文字進行處理,type 支持 year month day year-month |
(type, value) => value |
- |
min-date | 可選的最小日期 | Date |
十年前的 1 月 1 日 |
max-date | 可選的最大日期 | Date |
十年後的 12 月 31 日 |
min-hour | 可選的最小小時,針對 time 類型 | Number |
0 |
max-hour | 可選的最大小時,針對 time 類型 | Number |
23 |
min-minute | 可選的最小分鐘,針對 time 類型 | Number |
0 |
max-minute | 可選的最大分鐘,針對 time 類型 | Number |
59 |
事件名 | 說明 | 參數 |
---|---|---|
close | Picker關閉時觸發 | 關閉回調 |
confirm | 點擊完成按鈕時觸發 | 全部列選中值,全部列選中值對應的索引,全部列選中值對應的 disabled 狀態 |
cancel | 點擊取消按鈕時觸發 | 全部列選中值,全部列選中值對應的索引,全部列選中值對應的 disabled 狀態 |
change | 選項改變時觸發 | Picker 實例,全部列選中值,當前列對應的索引,全部列選中值對應的 disabled 狀態 |
當傳入多列數據時,columns
爲一個對象數組,數組中的每個對象配置每一列,每一列有如下key
key | 說明 |
---|---|
keys | 列中對應的備選值 |
className | 爲對應列添加額外的class |
經過 ref 能夠獲取到 picker 實例並調用實例方法
方法名 | 參數 | 返回值 | 介紹 |
---|---|---|---|
getNames | - | names | 獲取全部列選中的值 |
getValues | - | values | 獲取全部列選中的value |
getIndexes | - | indexes | 獲取全部列選中值對應的索引 |
getDisabled | - | disableds | 獲取全部列選中值對應的 disabled 狀態 |
getColumnType | columnIndex,type ('getName', 'getIndex') | value | 獲取對應列選中的值/索引 |
setColumnKeys | columnIndex, optionIndex | - | 設置對應列的備選值 |
謝謝你們的瀏覽~,首發文章歡迎你們的交流~~