QS-picker.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. <template>
  2. <view :style="{'z-index': zIndex}" @touchmove.stop="voidFc()" @tap.prevent.stop="voidFc()">
  3. <view
  4. class="mask"
  5. :class="showPicker?'show':'hide'"
  6. :style="{'z-index': Number(zIndex) + 1}"
  7. @touchmove.prevent.stop="voidFc()"
  8. @tap.prevent.stop="hide()"></view>
  9. <view
  10. class="flex_column"
  11. :class="[mode||'middle', showPicker?'show':'hide']"
  12. :style="'z-index:' + (Number(zIndex) + 2) + ';'"
  13. @touchmove.prevent.stop="voidFc()"
  14. @tap.prevent.stop="voidFc()">
  15. <view class="flex_column" :class="(mode||'middle') + '_view'" :style="{'height': heightSize}">
  16. <block v-if="mode==='bottom'">
  17. <view class="flex_row_between_c width100 padding20rpx" :style="{'font-size': titleSize, 'background-color': bgColor_title||'#f8f8f8'}">
  18. <view class="flex_row_none_c width250rpx " :style="{'color': buttonSet.cancleColor||'#ADADAD'}" @tap="hide()">
  19. {{buttonSet.cancleName||'取消'}}
  20. </view>
  21. <view class="flex_row_c_c width250rpx" :style="{'color': titleColor||'#999'}">
  22. {{title||''}}
  23. </view>
  24. <view class="flex_row_e_c width250rpx" :style="{'color': buttonSet.confirmColor||'#3399FF'}" @tap="confirm()">
  25. {{buttonSet.confirmName||'确定'}}
  26. </view>
  27. </view>
  28. </block>
  29. <block v-else-if="mode==='middle'">
  30. <view class="flex_row_c_c width100 padding20rpx" :style="{'font-size': titleSize, 'background-color': bgColor_title||'#f8f8f8', 'color': titleColor||'#999'}" v-if="title">
  31. {{title||''}}
  32. </view>
  33. </block>
  34. <picker-view @touchmove.prevent.stop="voidFc()" :indicator-style="'height:' + wH*(lineHeight||.09) + 'px;' + indicator_style" class="width100 height100 backgroundColor_white" :style="{'font-size': contentSize, 'color': contentColor||'black'}" :value="value" @change="bindChange($event)">
  35. <block v-if="type==='date'">
  36. <picker-view-column v-if="setObj.dateMode>=1">
  37. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in years" :key="picker_index">{{picker_item}}年</view>
  38. </picker-view-column>
  39. <picker-view-column v-if="setObj.dateMode>=2">
  40. <!-- #ifndef H5 -->
  41. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in 12" :key="picker_index">{{picker_item+1}}月</view>
  42. <!-- #endif -->
  43. <!-- #ifdef H5 -->
  44. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in 12" :key="picker_index">{{picker_item}}月</view>
  45. <!-- #endif -->
  46. </picker-view-column>
  47. <picker-view-column v-if="setObj.dateMode>=3">
  48. <!-- #ifndef H5 -->
  49. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in days" :key="picker_index">{{picker_item+1}}日</view>
  50. <!-- #endif -->
  51. <!-- #ifdef H5 -->
  52. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in days" :key="picker_index">{{picker_item}}日</view>
  53. <!-- #endif -->
  54. </picker-view-column>
  55. <picker-view-column v-if="setObj.dateMode>=4">
  56. <!-- #ifndef H5 -->
  57. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in 24" :key="picker_index">{{picker_item}}时</view>
  58. <!-- #endif -->
  59. <!-- #ifdef H5 -->
  60. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in 24" :key="picker_index">{{picker_item-1}}时</view>
  61. <!-- #endif -->
  62. </picker-view-column>
  63. <picker-view-column v-if="setObj.dateMode>=5">
  64. <!-- #ifndef H5 -->
  65. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in 60" :key="picker_index">{{picker_item}}分</view>
  66. <!-- #endif -->
  67. <!-- #ifdef H5 -->
  68. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in 60" :key="picker_index">{{picker_item-1}}分</view>
  69. <!-- #endif -->
  70. </picker-view-column>
  71. <picker-view-column v-if="setObj.dateMode>=6">
  72. <!-- #ifndef H5 -->
  73. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in 60" :key="picker_index">{{picker_item}}秒</view>
  74. <!-- #endif -->
  75. <!-- #ifdef H5 -->
  76. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in 60" :key="picker_index">{{picker_item-1}}秒</view>
  77. <!-- #endif -->
  78. </picker-view-column>
  79. </block>
  80. <block v-else-if="type==='city'">
  81. <picker-view-column>
  82. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in provinceDataList" :key="picker_index">{{picker_item.label}}</view>
  83. </picker-view-column>
  84. <picker-view-column>
  85. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in cityDataList" :key="picker_index">{{picker_item.label}}</view>
  86. </picker-view-column>
  87. <picker-view-column>
  88. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in areaDataList" :key="picker_index">{{picker_item.label}}</view>
  89. </picker-view-column>
  90. </block>
  91. <block v-else-if="type==='provincialStreet'">
  92. <picker-view-column>
  93. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in provinceDataList" :key="picker_index">{{picker_item.label}}</view>
  94. </picker-view-column>
  95. <picker-view-column>
  96. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in cityDataList" :key="picker_index">{{picker_item.label}}</view>
  97. </picker-view-column>
  98. <picker-view-column>
  99. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in areaDataList" :key="picker_index">{{picker_item.label}}</view>
  100. </picker-view-column>
  101. <picker-view-column>
  102. <view class="flex_row_c_c" v-for="(picker_item,picker_index) in streetDataList" :key="picker_index">{{picker_item}}</view>
  103. </picker-view-column>
  104. </block>
  105. <block v-if="type==='custom'">
  106. <block v-if="setObj.linkage">
  107. <block v-if="setObj.linkageNum===2">
  108. <picker-view-column>
  109. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemArray" :key="index">{{item[setObj.steps.step_1_value]}}</view>
  110. </picker-view-column>
  111. <picker-view-column>
  112. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemArray[value[0]][setObj.steps.step_2_item]" :key="index">{{item[setObj.steps.step_2_value]||item}}</view>
  113. </picker-view-column>
  114. </block>
  115. <block v-else-if="setObj.linkageNum===3">
  116. <picker-view-column>
  117. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemArray" :key="index">{{item[setObj.steps.step_1_value]}}</view>
  118. </picker-view-column>
  119. <picker-view-column>
  120. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemArray[value[0]][setObj.steps.step_2_item]" :key="index">{{item[setObj.steps.step_2_value]}}</view>
  121. </picker-view-column>
  122. <picker-view-column>
  123. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemArray[value[0]][setObj.steps.step_2_item][value[1]][setObj.steps.step_3_item]"
  124. :key="index">{{item[setObj.steps.step_3_value]||item}}</view>
  125. </picker-view-column>
  126. </block>
  127. </block>
  128. <block v-else>
  129. <picker-view-column v-for="(items, indexs) in setObj.itemArray" :key="indexs">
  130. <view class="flex_row_c_c" v-for="(item, index) in items" :key="index">{{setObj.steps?setObj.steps.step_1_value?item[setObj.steps.step_1_value]:item:item}}</view>
  131. </picker-view-column>
  132. </block>
  133. </block>
  134. <block v-if="type==='custom2'">
  135. <block v-if="setObj.linkage">
  136. <block v-if="setObj.linkageNum===2">
  137. <picker-view-column>
  138. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemObject.step_1" :key="index">{{setObj.steps.step_1_value?item[setObj.steps.step_1_value]:item}}</view>
  139. </picker-view-column>
  140. <picker-view-column>
  141. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemObject.step_2[value[0]]" :key="index">{{setObj.steps.step_2_value?item[setObj.steps.step_2_value]:item}}</view>
  142. </picker-view-column>
  143. </block>
  144. <block v-else-if="setObj.linkageNum===3">
  145. <picker-view-column>
  146. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemObject.step_1" :key="index">{{setObj.steps.step_1_value?item[setObj.steps.step_1_value]:item}}</view>
  147. </picker-view-column>
  148. <picker-view-column>
  149. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemObject.step_2[value[0]]" :key="index">{{setObj.steps.step_2_value?item[setObj.steps.step_2_value]:item}}</view>
  150. </picker-view-column>
  151. <picker-view-column>
  152. <view class="flex_row_c_c" v-for="(item,index) in setObj.itemObject.step_3[value[0]][value[1]]" :key="index">{{setObj.steps.step_3_value?item[setObj.steps.step_3_value]:item}}</view>
  153. </picker-view-column>
  154. </block>
  155. </block>
  156. <block v-else>
  157. <picker-view-column v-for="(items, indexs) in setObj.itemArray" :key="indexs">
  158. <view class="flex_row_c_c" v-for="(item, index) in items" :key="index">{{setObj.steps.step_1_value?item[setObj.steps.step_1_value]:item}}</view>
  159. </picker-view-column>
  160. </block>
  161. </block>
  162. </picker-view>
  163. <block v-if="mode==='top'">
  164. <view class="flex_row_between_c width100 padding20rpx" :style="{'font-size': titleSize, 'background-color': bgColor_title||'#f8f8f8'}">
  165. <view class="flex_row_none_c width250rpx " :style="{'color': buttonSet.cancleColor||'#ADADAD'}" @tap="hide()">
  166. {{buttonSet.cancleName||'取消'}}
  167. </view>
  168. <view class="flex_row_c_c width250rpx" :style="{'color': titleColor||'#999'}">
  169. {{title||''}}
  170. </view>
  171. <view class="flex_row_e_c width250rpx" :style="{'color': buttonSet.confirmColor||'#3399FF'}" @tap="confirm()">
  172. {{buttonSet.confirmName||'确定'}}
  173. </view>
  174. </view>
  175. </block>
  176. </view>
  177. <view class="flex_row" style="margin-top: 20px;" v-if="mode==='middle'">
  178. <view class="flex_row_c_c width50">
  179. <button :type="buttonSet.cancelType||'default'" @tap="hide()" :style="classObj.btnSize + (buttonSet.cancelStyle||'')">{{buttonSet.cancelName||'取消'}}</button>
  180. </view>
  181. <view class="flex_row_c_c width50">
  182. <button :type="buttonSet.confirmType||'primary'" @tap="confirm()" :style="classObj.btnSize + (buttonSet.confirmStyle||'')">{{buttonSet.confirmName||'确定'}}</button>
  183. </view>
  184. </view>
  185. </view>
  186. </view>
  187. </template>
  188. <script>
  189. import QSPicker from '../js/QS-picker.js';
  190. var provinceData = {};
  191. var cityData = {};
  192. var areaData = {};
  193. var streetData = {};
  194. const Sys = uni.getSystemInfoSync();
  195. const wH = Sys.screenHeight;
  196. const wW = Sys.screenWidth;
  197. export default {
  198. name: 'QS-picker',
  199. props: {
  200. pickerId: {
  201. type: String,
  202. default: '未定义Id'
  203. },
  204. type: { //类型
  205. type: String,
  206. default: 'date'
  207. },
  208. height: { //picker高度
  209. type: Number,
  210. default: 0
  211. },
  212. lineHeight: {
  213. type: Number,
  214. default: .09
  215. },
  216. indicator_style: { //picker单行样式
  217. type: String,
  218. default: ''
  219. },
  220. fontscale: { //picker内文字大小
  221. type: Number,
  222. default: .02
  223. },
  224. width: { //picker宽度
  225. type: Number,
  226. default: .8
  227. },
  228. buttonSet: { //按钮设置
  229. type: Object,
  230. default () {
  231. return {};
  232. }
  233. },
  234. dataSet: { //各类型携带的数据
  235. type: Object,
  236. default () {
  237. return {};
  238. }
  239. },
  240. showReset: { //每次显示是否重置value
  241. type: Boolean,
  242. default: false
  243. },
  244. title: { //title标题
  245. type: String,
  246. default: ''
  247. },
  248. mode: {
  249. type: String,
  250. default: 'bottom'
  251. },
  252. zIndex: {
  253. type: [Number, String],
  254. default: 9999
  255. },
  256. bgColor_title: {
  257. type: String,
  258. default: '#F8F8F8'
  259. },
  260. autoHide: {
  261. type: Boolean,
  262. default: true
  263. },
  264. titleColor: {
  265. type: String,
  266. default: '#999'
  267. },
  268. contentColor: {
  269. type: String,
  270. default: 'black'
  271. }
  272. },
  273. data() {
  274. return {
  275. showPicker: false,
  276. setObj: {},
  277. //date
  278. years: [],
  279. days: 0,
  280. value: [],
  281. //city、provincialStreet
  282. provinceDataList: [],
  283. cityDataList: [],
  284. areaDataList: [],
  285. //provincialStreet
  286. streetDataList: [],
  287. defaultValue: [],
  288. wH,
  289. classObj: {
  290. btnSize: 'font-size: ' + (wH * (this.fontscale + .005)) + 'px;',
  291. }
  292. };
  293. },
  294. computed: {
  295. heightSize() {
  296. if(this.mode==='middle') {
  297. return wH*(this.height||.3) + 'px';
  298. }else{
  299. return wH*(this.height||.45) + 'px';
  300. }
  301. },
  302. titleSize() {
  303. return (wH * (this.fontscale + .002)) + 'px';
  304. },
  305. contentSize() {
  306. return (wH * this.fontscale) + 'px';
  307. }
  308. },
  309. watch: {
  310. dataSet() {
  311. this.init();
  312. },
  313. showPicker(n, o) {
  314. if (n && this.showReset) {
  315. let defaultValue = this.defaultValue;
  316. switch (this.type) {
  317. case 'city':
  318. this.cityDataList = cityData[defaultValue[0]];
  319. this.areaDataList = areaData[defaultValue[0]][defaultValue[1]];
  320. break;
  321. case 'provincialStreet':
  322. this.cityDataList = cityData[defaultValue[0]];
  323. this.areaDataList = areaData[defaultValue[0]][defaultValue[1]];
  324. this.streetDataList = streetData[defaultValue[0]][defaultValue[1]][defaultValue[2]];
  325. break;
  326. case 'date':
  327. let data = QSPicker.countDays(this.years[defaultValue[0]], defaultValue);
  328. this.days = data.days;
  329. this.value = data.val;
  330. break;
  331. default:
  332. break;
  333. }
  334. this.value = [...defaultValue];
  335. }
  336. }
  337. },
  338. created() {
  339. this.init();
  340. },
  341. methods: {
  342. init() {
  343. let value = [];
  344. let setObj = {};
  345. //date
  346. let years = [];
  347. let days = 0;
  348. // city、provincialStreet
  349. let provinceDataList;
  350. let cityDataList;
  351. let areaDataList;
  352. //provincialStreet
  353. let streetDataList;
  354. switch (this.type) {
  355. case 'date': //date
  356. setObj = QSPicker.creatDateObj(this.dataSet);
  357. console.log('setObj: ' + JSON.stringify(setObj));
  358. let defaultDate = setObj.defaultValue;
  359. years = QSPicker.countYears(setObj.startYear || (new Date().getFullYear() - 5), setObj.endYear || (new Date().getFullYear() +
  360. 5));
  361. let endYear = years[years.length - 1];
  362. let defaultYear = defaultDate.getFullYear(),
  363. defaultMonth = defaultDate.getMonth(),
  364. defaultDay = defaultDate.getDate(),
  365. defaultHour = defaultDate.getHours(),
  366. defaultMinute = defaultDate.getMinutes(),
  367. defaultSecond = defaultDate.getSeconds();
  368. let compareY = defaultYear > endYear;
  369. let year = compareY ? endYear : defaultYear;
  370. let month = compareY ? 11 : defaultMonth;
  371. defaultDate[1] = month;
  372. days = QSPicker.countDays(year, defaultDate).days;
  373. let dm = setObj.dateMode;
  374. if (dm >= 1) {
  375. if (compareY)
  376. value.push(years.length - 1);
  377. else
  378. for (let i = 0; i < years.length; i++) {
  379. if (year == years[i]) {
  380. value.push(i);
  381. }
  382. }
  383. }
  384. if (dm >= 2) value.push(compareY ? 11 : month);
  385. if (dm >= 3) value.push(compareY ? days : defaultDay - 1);
  386. if (dm >= 4) value.push(defaultHour);
  387. if (dm >= 5) value.push(defaultMinute);
  388. if (dm >= 6) value.push(defaultSecond);
  389. //date
  390. this.years = years;
  391. this.days = days;
  392. this.setObj = setObj;
  393. break;
  394. case 'city':
  395. value = this.dataSet.defaultValue || [0, 0, 0];
  396. provinceData = require('./city-data/province.js').default;
  397. cityData = require('./city-data/city.js').default;
  398. areaData = require('./city-data/area.js').default;
  399. provinceDataList = provinceData;
  400. cityDataList = cityData[value[0]];
  401. areaDataList = areaData[value[0]][value[1]];
  402. //city、provincialStreet
  403. this.provinceDataList = provinceDataList;
  404. this.cityDataList = cityDataList;
  405. this.areaDataList = areaDataList;
  406. break;
  407. case 'provincialStreet':
  408. value = this.dataSet.defaultValue || [0, 0, 0, 0];
  409. provinceData = require('./city-data/province.js').default;
  410. cityData = require('./city-data/city.js').default;
  411. areaData = require('./city-data/area.js').default;
  412. streetData = require('./city-data/streets.js').default;
  413. provinceDataList = provinceData;
  414. cityDataList = cityData[value[0]];
  415. areaDataList = areaData[value[0]][value[1]];
  416. streetDataList = streetData[value[0]][value[1]][value[2]];
  417. //provincialStreet
  418. this.provinceDataList = provinceDataList;
  419. this.cityDataList = cityDataList;
  420. this.areaDataList = areaDataList;
  421. this.streetDataList = streetDataList;
  422. break;
  423. case 'custom':
  424. setObj = QSPicker.creatCustomObj(this.dataSet);
  425. if (setObj.defaultValue) {
  426. value = setObj.defaultValue;
  427. } else {
  428. if (setObj.linkage) {
  429. for (let i = 0; i < setObj.linkageNum; i++) {
  430. value.push(0);
  431. }
  432. } else {
  433. setObj.itemArray.forEach(item => {
  434. value.push(0);
  435. });
  436. }
  437. }
  438. this.setObj = setObj;
  439. break;
  440. case 'custom2':
  441. setObj = QSPicker.creatCustom2Obj(this.dataSet);
  442. if (setObj.defaultValue) {
  443. value = setObj.defaultValue;
  444. } else {
  445. if (setObj.linkage) {
  446. for (let i = 0; i < setObj.linkageNum; i++) {
  447. value.push(0);
  448. }
  449. } else {
  450. setObj.itemArray.forEach(item => {
  451. value.push(0);
  452. });
  453. }
  454. }
  455. this.setObj = setObj;
  456. break;
  457. default:
  458. break;
  459. }
  460. let defaultValue = [...value];
  461. this.value = value;
  462. this.defaultValue = defaultValue;
  463. },
  464. bindChange({
  465. detail: {
  466. value
  467. }
  468. }) {
  469. // console.log(JSON.stringify(e))
  470. let changevalue;
  471. switch (this.type) {
  472. case 'city':
  473. changevalue = value;
  474. if (this.value[0] !== changevalue[0]) {
  475. // 第一级发生滚动
  476. this.cityDataList = cityData[changevalue[0]];
  477. this.areaDataList = areaData[changevalue[0]][0];
  478. changevalue[1] = 0;
  479. changevalue[2] = 0;
  480. } else if (this.value[1] !== changevalue[1]) {
  481. // 第二级滚动
  482. this.areaDataList = areaData[changevalue[0]][changevalue[1]];
  483. changevalue[2] = 0;
  484. }
  485. this.value = changevalue;
  486. break;
  487. case 'provincialStreet':
  488. changevalue = value;
  489. if (this.value[0] !== changevalue[0]) {
  490. // 第一级发生滚动
  491. this.cityDataList = cityData[changevalue[0]];
  492. this.areaDataList = areaData[changevalue[0]][0];
  493. this.streetDataList = streetData[changevalue[0]] && streetData[changevalue[0]][0] && streetData[changevalue[0]][
  494. 0
  495. ][0] ? streetData[changevalue[0]][0][0] : [];
  496. changevalue[1] = 0;
  497. changevalue[2] = 0;
  498. changevalue[3] = 0;
  499. } else if (this.value[1] !== changevalue[1]) {
  500. // 第二级滚动
  501. this.areaDataList = areaData[changevalue[0]][changevalue[1]];
  502. this.streetDataList = streetData[changevalue[0]] && streetData[changevalue[0]][changevalue[1]] && streetData[
  503. changevalue[0]][changevalue[1]][0] ? streetData[changevalue[0]][changevalue[1]][0] : [];
  504. changevalue[2] = 0;
  505. changevalue[3] = 0;
  506. } else if (this.value[2] !== changevalue[2]) {
  507. this.streetDataList = streetData[changevalue[0]] && streetData[changevalue[0]][changevalue[1]] && streetData[
  508. changevalue[0]][changevalue[1]][changevalue[2]] ? streetData[changevalue[0]][changevalue[1]][changevalue[2]] :
  509. [];
  510. changevalue[3] = 0;
  511. }
  512. this.value = changevalue;
  513. break;
  514. case 'date':
  515. let data = QSPicker.countDays(this.years[value[0]], value);
  516. this.days = data.days;
  517. this.value = data.val;
  518. break;
  519. default:
  520. this.value = value;
  521. break;
  522. }
  523. },
  524. confirm() {
  525. let type = this.type;
  526. let value = this.value;
  527. let obj = {
  528. type,
  529. value,
  530. pickerId: this.pickerId
  531. }
  532. let setObj = this.setObj;
  533. let data;
  534. switch (type) {
  535. case 'date':
  536. data = '';
  537. let dateFormatArray = setObj.dateFormatArray;
  538. console.log('dateFormatArray:' + JSON.stringify(dateFormatArray));
  539. for (let i = 1; i <= this.setObj.dateMode; i++) {
  540. if (i <= 6) {
  541. let j = i - 1;
  542. let f = i - 2;
  543. switch (i) {
  544. case 1:
  545. data += this.years[value[j]];
  546. break;
  547. case 2:
  548. data += dateFormatArray[f] + (value[j] + 1);
  549. break;
  550. case 3:
  551. data += dateFormatArray[f] + (value[j] + 1);
  552. break;
  553. default:
  554. data += dateFormatArray[f] + value[j];
  555. break;
  556. }
  557. }
  558. }
  559. break;
  560. case 'city':
  561. data = {
  562. label: this._getLabel(),
  563. value: this.value,
  564. cityCode: this._getCityCode()
  565. };
  566. break;
  567. case 'provincialStreet':
  568. data = {
  569. label: this._getprovincialStreetLabel(),
  570. value: this.value,
  571. cityCode: this._getCityCode()
  572. };
  573. break;
  574. case 'custom':
  575. let custom_datas = setObj.itemArray;
  576. data = {};
  577. let custom_val = this.value;
  578. let custom_steps = setObj.steps;
  579. if (setObj.linkage) {
  580. if (setObj.linkageNum === 2) { //二级联动
  581. data.steps1 = custom_datas[custom_val[0]];
  582. data.steps2 = custom_datas[custom_val[0]][custom_steps.step_2_item][custom_val[1]];
  583. } else if (setObj.linkageNum === 3) { //三级联动
  584. data.steps1 = custom_datas[custom_val[0]];
  585. if (!data.steps1)
  586. QSPicker.showToast('第一列中不存在第' + custom_val[0] + '项');
  587. data.steps2 = data.steps1[custom_steps.step_2_item][custom_val[1]];
  588. if (!data.steps2)
  589. QSPicker.showToast('第二列中不存在第' + custom_val[1] + '项');
  590. data.steps3 = data.steps2[custom_steps.step_3_item][custom_val[2]];
  591. if (!data.steps3)
  592. QSPicker.showToast('第三列中不存在第' + custom_val[2] + '项');
  593. } else {
  594. QSPicker.showToast('不在指定范围中');
  595. }
  596. } else { //无联动
  597. data = [];
  598. for (let i = 0; i < custom_datas.length; i++) {
  599. let d = custom_datas[i];
  600. data.push(d[custom_val[i]]);
  601. }
  602. }
  603. break;
  604. case 'custom2':
  605. let custom2_datas = setObj.linkage ? setObj.itemObject : setObj.itemArray;
  606. let custom2_val = this.value;
  607. if (setObj.linkage) {
  608. data = {}
  609. if (setObj.linkageNum === 2) { //二级联动
  610. data.steps1 = custom2_datas.step_1[custom2_val[0]];
  611. data.steps2 = custom2_datas.step_2[custom2_val[0]][custom2_val[1]];
  612. } else if (setObj.linkageNum === 3) { //三级联动
  613. data.steps1 = custom2_datas.step_1[custom2_val[0]];
  614. if (!data.steps1)
  615. QSPicker.showToast('第一列中不存在第' + custom2_val[0] + '项');
  616. data.steps2 = custom2_datas.step_2[custom2_val[0]][custom2_val[1]];
  617. if (!data.steps2)
  618. QSPicker.showToast('第二列中不存在第' + custom2_val[1] + '项');
  619. data.steps3 = custom2_datas.step_3[custom2_val[0]][custom2_val[1]][custom2_val[2]];
  620. if (!data.steps3)
  621. QSPicker.showToast('第三列中不存在第' + custom2_val[2] + '项');
  622. } else {
  623. QSPicker.showToast('不在指定范围中');
  624. }
  625. } else { //无联动
  626. data = [];
  627. for (let i = 0; i < custom2_datas.length; i++) {
  628. let d = custom2_datas[i];
  629. data.push(d[custom2_val[i]]);
  630. }
  631. }
  632. break;
  633. default:
  634. break;
  635. }
  636. obj.data = data;
  637. this.$emit('confirm', obj);
  638. console.log(this.autoHide)
  639. if(this.autoHide)
  640. this.hide();
  641. },
  642. _getprovincialStreetLabel() {
  643. let pcikerLabel =
  644. this.provinceDataList[this.value[0]].label +
  645. '-' +
  646. this.cityDataList[this.value[1]].label +
  647. '-' +
  648. this.areaDataList[this.value[2]].label +
  649. (this.streetDataList[this.value[3]] ? '-' + this.streetDataList[this.value[3]] : '');
  650. return pcikerLabel;
  651. },
  652. _getLabel() {
  653. let pcikerLabel =
  654. this.provinceDataList[this.value[0]].label +
  655. '-' +
  656. this.cityDataList[this.value[1]].label +
  657. '-' +
  658. this.areaDataList[this.value[2]].label;
  659. return pcikerLabel;
  660. },
  661. _getCityCode() {
  662. return this.areaDataList[this.value[2]].value;
  663. },
  664. show() {
  665. this.showPicker = true;
  666. this.$emit('showQSPicker', {
  667. pickerId: this.pickerId,
  668. type: this.type
  669. });
  670. },
  671. hide() {
  672. this.showPicker = false;
  673. this.$emit('hideQSPicker', {
  674. pickerId: this.pickerId,
  675. type: this.type
  676. });
  677. },
  678. voidFc() {}
  679. }
  680. }
  681. </script>
  682. <style scoped>
  683. /* middle */
  684. .middle{
  685. position: fixed;
  686. left: 50%;
  687. top: 50%;
  688. opacity: 0;
  689. pointer-events: none;
  690. perspective: 2500upx;
  691. transition: all .3s ease-in-out;
  692. }
  693. .middle.show{
  694. transition-delay: .3s;
  695. transform: translate(-50%, -50%);
  696. pointer-events: auto;
  697. opacity: 1;
  698. }
  699. .middle.hide{
  700. transform: translate(-50%, -50%);
  701. opacity: 0;
  702. pointer-events: none;
  703. }
  704. .middle_view{
  705. background-color: #FFF;
  706. border-radius: 15upx;
  707. overflow: hidden;
  708. width: 80vw;
  709. }
  710. /* bottom */
  711. .bottom{
  712. position: fixed;
  713. left: 0;
  714. bottom: 0;
  715. pointer-events: none;
  716. perspective: 2500upx;
  717. transition: all .3s ease-in-out;
  718. transform: translateY(100%);
  719. }
  720. .bottom.show{
  721. transform: translateY(0);
  722. pointer-events: auto;
  723. }
  724. .bottom.hide{
  725. transform: translateY(100%);
  726. pointer-events: none;
  727. }
  728. .bottom_view{
  729. width: 100vw;
  730. background-color: white;
  731. }
  732. /* top */
  733. .top{
  734. position: fixed;
  735. left: 0;
  736. top: 0;
  737. pointer-events: none;
  738. perspective: 2500upx;
  739. transition: all .3s ease-in-out;
  740. transform: translateY(-100%);
  741. }
  742. .top.show{
  743. transform: translateY(0);
  744. pointer-events: auto;
  745. }
  746. .top.hide{
  747. transform: translateY(-100%);
  748. pointer-events: none;
  749. }
  750. .top_view{
  751. width: 100vw;
  752. background-color: white;
  753. }
  754. /* mask */
  755. .mask{
  756. position: fixed;
  757. top: 0;
  758. left: 0;
  759. height: 100vh;
  760. width: 100vw;
  761. opacity: 0;
  762. background-color: rgba(0,0,0,.6);
  763. transition: all .3s ease-in-out;
  764. pointer-events: none;
  765. }
  766. .mask.show{
  767. opacity: 1;
  768. pointer-events: auto;
  769. }
  770. .mask.hide{
  771. opacity: 0;
  772. transition: all .3s ease-in-out .3s;
  773. pointer-events: none;
  774. }
  775. .flex_column_c_c {
  776. display: flex;
  777. flex-direction: column;
  778. justify-content: center;
  779. align-items: center;
  780. }
  781. .text_align_center {
  782. text-align: center;
  783. }
  784. /* flex */
  785. .flex_1 {
  786. flex: 1;
  787. }
  788. .flex_column {
  789. display: flex;
  790. flex-direction: column;
  791. }
  792. .flex_row_e_none {
  793. display: flex;
  794. flex-direction: row;
  795. justify-content: flex-end;
  796. }
  797. .flex_column_c_c {
  798. display: flex;
  799. flex-direction: column;
  800. justify-content: center;
  801. align-items: center;
  802. }
  803. .flex_row {
  804. display: flex;
  805. flex-direction: row;
  806. }
  807. .flex_row_none_c {
  808. display: flex;
  809. flex-direction: row;
  810. align-items: center;
  811. }
  812. .flex_row_e_c {
  813. display: flex;
  814. flex-direction: row;
  815. justify-content: flex-end;
  816. align-items: center;
  817. }
  818. .flex_row_c_c {
  819. display: flex;
  820. flex-direction: row;
  821. justify-content: center;
  822. align-items: center;
  823. }
  824. .flex_row_between_c {
  825. display: flex;
  826. flex-direction: row;
  827. justify-content: space-between;
  828. align-items: center;
  829. }
  830. /* width height */
  831. .width50 {
  832. width: 50%;
  833. }
  834. .width100 {
  835. width: 100%;
  836. }
  837. .width250rpx{
  838. width: 250rpx;
  839. }
  840. .height100 {
  841. height: 100%;
  842. }
  843. /* padding */
  844. .padding20rpx{
  845. padding: 20rpx;
  846. }
  847. view, block, botton, text, picker, picker-view picker-view-column {
  848. box-sizing: border-box;
  849. }
  850. .backgroundColor_white{
  851. background-color: white;
  852. }
  853. </style>