QS-picker-custom2.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <template>
  2. <QSPickerTemplate ref="QSPickerTem" :height="height" :fontScale="fontScale"
  3. :buttonSet="buttonSet" :title="title" :mode="mode" :zIndex="zIndex" :bgColor_title="bgColor_title"
  4. :autoHide="autoHide" :titleColor="titleColor" @confirm="confirm">
  5. <block v-if="linkage">
  6. <block v-if="linkageNum==2">
  7. <picker-view
  8. @touchmove.prevent.stop="voidFc()"
  9. indicator-style="height: 60px;"
  10. :value="value" @change="bindChange($event)">
  11. <picker-view-column>
  12. <view
  13. class="flex_row_c_c pickerDefault"
  14. :class="((value[0] || 0) === index?'selectColor':'defaultColor')"
  15. v-for="(item,index) in (itemObject.step_1 || [])"
  16. :key="index">
  17. {{steps.step_1_value?item[steps.step_1_value]:item}}
  18. </view>
  19. </picker-view-column>
  20. <picker-view-column>
  21. <view
  22. class="flex_row_c_c pickerDefault"
  23. :class="((value[1] || 0) === index?'selectColor':'defaultColor')"
  24. v-for="(item,index) in getItem2"
  25. :key="index">
  26. {{steps.step_2_value?item[steps.step_2_value]:item}}
  27. </view>
  28. </picker-view-column>
  29. </picker-view>
  30. </block>
  31. <block v-else-if="linkageNum==3">
  32. <picker-view
  33. @touchmove.prevent.stop="voidFc()"
  34. indicator-style="height: 60px;"
  35. :value="value"
  36. @change="bindChange($event)">
  37. <picker-view-column>
  38. <view
  39. class="flex_row_c_c pickerDefault"
  40. :class="((value[0] || 0) === index?'selectColor':'defaultColor')"
  41. v-for="(item,index) in (itemObject.step_1 || [])"
  42. :key="index">
  43. {{steps.step_1_value?item[steps.step_1_value]:item}}
  44. </view>
  45. </picker-view-column>
  46. <picker-view-column>
  47. <view
  48. class="flex_row_c_c pickerDefault"
  49. :class="((value[1] || 0) === index?'selectColor':'defaultColor')"
  50. v-for="(item,index) in getItem2"
  51. :key="index">
  52. {{steps.step_2_value?item[steps.step_2_value]:item}}
  53. </view>
  54. </picker-view-column>
  55. <picker-view-column>
  56. <view
  57. class="flex_row_c_c pickerDefault"
  58. :class="((value[2] || 0) === index?'selectColor':'defaultColor')"
  59. v-for="(item,index) in getItem3"
  60. :key="index">
  61. {{steps.step_3_value?item[steps.step_3_value]:item}}
  62. </view>
  63. </picker-view-column>
  64. </picker-view>
  65. </block>
  66. </block>
  67. <block v-else>
  68. <picker-view
  69. @touchmove.prevent.stop="voidFc()"
  70. indicator-style="height: 60px;"
  71. :value="value"
  72. @change="bindChange($event)">
  73. <picker-view-column v-for="(items, indexs) in itemArray" :key="indexs">
  74. <view
  75. class="flex_row_c_c pickerDefault"
  76. :class="((value[indexs] || 0) === index?'selectColor':'defaultColor')"
  77. v-for="(item, index) in items"
  78. :key="index">
  79. {{steps.step_1_value?item[steps.step_1_value]:item}}
  80. </view>
  81. </picker-view-column>
  82. </picker-view>
  83. </block>
  84. </QSPickerTemplate>
  85. </template>
  86. <script>
  87. import _app from '../../../js/app.js';
  88. import QSPickerTemplate from './QS-pickerTemplate.vue';
  89. import QSPickerMixin from '../js/QS-picker-mixin.js';
  90. export default {
  91. name: 'QS-picker-custom2',
  92. mixins: [QSPickerMixin()],
  93. components: {
  94. QSPickerTemplate
  95. },
  96. props: {
  97. linkage: {
  98. type: Boolean,
  99. default: false
  100. },
  101. linkageNum: {
  102. type: [Number, String],
  103. default: 2
  104. },
  105. steps: Object,
  106. async: {
  107. type: Boolean,
  108. default: false
  109. },
  110. customId: {
  111. type: [String, Object],
  112. deault: ''
  113. }
  114. },
  115. data() {
  116. return {
  117. itemArray: [],
  118. itemObject: {},
  119. async_1: [],
  120. async_2: [],
  121. oldValue: [],
  122. memoryData_1: [],
  123. memoryData_2: [],
  124. waiting: false,
  125. };
  126. },
  127. computed: {
  128. getItem2() {
  129. if(this.async) {
  130. return this.async_1 || [];
  131. }else{
  132. return (this.itemObject.step_2?this.itemObject.step_2[this.value[0]||0]:[]) || [];
  133. }
  134. },
  135. getItem3() {
  136. if(this.async) {
  137. return this.async_2 || [];
  138. }else{
  139. return (this.itemObject.step_3?this.itemObject.step_3[this.value[0]||0]?this.itemObject.step_3[this.value[0]||0][this.value[1]||0]:[]:[]) || [];
  140. }
  141. }
  142. },
  143. methods: {
  144. init() {
  145. if (this.dataSet.defaultValue instanceof Array && this.dataSet.defaultValue)
  146. this.value = this.dataSet.defaultValue;
  147. this.checkAsync();
  148. },
  149. checkAsync() {
  150. if (this.async && this.itemObject.step_1 && this.itemObject.step_1.length > 0) {
  151. if(this.linkageNum == 2) {
  152. if(this.async_1.length !== 0)
  153. return;
  154. }else if(this.linkageNum == 3) {
  155. if(this.async_2 !== 0)
  156. return;
  157. }
  158. this.getAsyncData({
  159. value: this.value,
  160. launch: true
  161. });
  162. }
  163. },
  164. bindChange({
  165. detail: {
  166. value
  167. }
  168. }) { //解构 赋值
  169. this.value = value;
  170. const oldValue = [...this.oldValue];
  171. if (this.async && this.linkage) {
  172. switch (Number(this.linkageNum)) {
  173. case 2:
  174. if (oldValue[0] !== value[0]) {
  175. this.getAsyncData({
  176. value,
  177. index: 0
  178. });
  179. }
  180. break;
  181. case 3:
  182. if (oldValue[0] !== value[0]) {
  183. this.getAsyncData({
  184. value,
  185. index: 0
  186. });
  187. } else if (oldValue[1] !== value[1]) {
  188. this.getAsyncData({
  189. value,
  190. index: 1
  191. });
  192. }
  193. break;
  194. default:
  195. break;
  196. }
  197. }
  198. this.$emit('pickerChange', {value});
  199. },
  200. getAsyncData(obj) { // 逐级获取
  201. let oldValue = [];
  202. if (this.oldValue.length&&this.oldValue.length > 0) oldValue = [...this.oldValue];
  203. if (obj.value.length === 0) {
  204. switch (Number(this.linkageNum)) {
  205. case 2:
  206. obj.value = [0, 0];
  207. break;
  208. case 3:
  209. obj.value = [0, 0, 0];
  210. break;
  211. default:
  212. break;
  213. }
  214. this.value = [...obj.value];
  215. }
  216. obj = {
  217. ...obj,
  218. datas: {
  219. data_0: [...this.itemObject.step_1],
  220. data_1: this.async_1.length&&this.async_1.length>0?[...this.async_1]: []
  221. },
  222. linkageNum: this.linkageNum,
  223. customId: this.customId,
  224. type: 'picker-custom2',
  225. oldValue
  226. };
  227. _app.getPickerAsyncData.call(this, obj);
  228. },
  229. confirm() {
  230. let _this = this;
  231. if(_this.waiting) {
  232. _app.showToast('正在获取数据, 请稍候');
  233. return;
  234. }
  235. const async = _this.async;
  236. const datas = _this.linkage ? _this.itemObject : _this.itemArray;
  237. const v = _this.value;
  238. let data;
  239. if (_this.linkage) {
  240. data = {}
  241. for(let i = 0; i < _this.linkageNum; i++) {
  242. if(!v[i]) v[i] = 0;
  243. }
  244. if(_this.linkageNum == 2) { //二级联动
  245. data.steps1 = datas.step_1[v[0]];
  246. data.steps2 = async?this.async_1[v[1]]:datas.step_2[v[0]][v[1]];
  247. }else if(_this.linkageNum == 3) { //三级联动
  248. data.steps1 = datas.step_1[v[0]];
  249. if(!data.steps1)
  250. _app.showToast('第一列中不存在第'+v[0]+'项');
  251. data.steps2 = async?this.async_1[v[1]]:datas.step_2[v[0]][v[1]];
  252. if(!data.steps2)
  253. _app.showToast('第二列中不存在第'+v[1]+'项');
  254. data.steps3 = async?this.async_2[v[2]]:datas.step_3[v[0]][v[1]][v[2]];
  255. if(!data.steps3)
  256. _app.showToast('第三列中不存在第'+v[2]+'项');
  257. }else{
  258. _app.showToast('不在指定范围中');
  259. }
  260. } else { //无联动
  261. data = [];
  262. for (let i = 0; i < datas.length; i++) {
  263. let d = datas[i];
  264. data.push(d[(v[i]||0)]);
  265. }
  266. }
  267. const obj = {
  268. data,
  269. value: v
  270. }
  271. _this.$emit('confirm', obj);
  272. if (this.autoHide) this.hide();
  273. },
  274. setData(data) {
  275. if(this.linkage) {
  276. this.itemObject = data;
  277. }else{
  278. this.itemArray= data;
  279. }
  280. }
  281. }
  282. }
  283. </script>
  284. <style scoped>
  285. @import url("../css/QS-picker.css");
  286. @import url("../../../config/css/picker.css");
  287. </style>