picker.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. // picker/picker.js
  2. import { isString,isPlainObject } from './tool';
  3. Component({
  4. /**
  5. * 组件的属性列表
  6. */
  7. properties: {
  8. scrollType:{
  9. type: String,
  10. value: "normal"//"link": scroll间联动 "normal": scroll相互独立
  11. },
  12. listData: {
  13. type: Array,
  14. value: [],
  15. observer: function(newVal) {
  16. if (newVal.length === 0 || this._compareDate()) return;
  17. this._setTempData();
  18. let tempArr = [...new Array(newVal.length).keys()].map(() => 0)
  19. // console.log(tempArr,'测试~')
  20. this.data.lastValue = this.data.tempValue =tempArr;
  21. console.log(this.data.tempValue,'测试2')
  22. this._setDefault()
  23. // let {defaultPickData} = this.properties;
  24. // if(newVal.length === 0) return;
  25. //
  26. // this._setDefault(newVal, defaultPickData)
  27. }
  28. },
  29. defaultPickData:{
  30. type: Array,
  31. value: [],
  32. observer: function (newVal) {
  33. if (newVal.length === 0 || this._compareDate()) return;
  34. this._setTempData();
  35. this._setDefault()
  36. }
  37. },
  38. keyWordsOfShow:{
  39. type: String,
  40. value: "name"
  41. },
  42. isShowPicker:{
  43. type: Boolean,
  44. value: false,
  45. observer: function(newVal) {
  46. if (newVal) {
  47. this.setData({
  48. donghua:true
  49. })
  50. this._openPicker()
  51. }else{
  52. this._closePicker()
  53. }
  54. }
  55. },
  56. titleText: {//标题文案
  57. type: String,
  58. value: "标题"
  59. },
  60. cancelText:{//取消按钮文案
  61. type: String,
  62. value: "取消"
  63. },
  64. sureText:{//确定按钮文案
  65. type: String,
  66. value: "确定"
  67. },
  68. pickerHeaderStyle: String,//标题栏样式 view
  69. sureStyle: String, //标题栏确定样式 text
  70. cancelStyle: String,//标题栏取消样式 text
  71. titleStyle: String,//标题栏标题样式 view
  72. maskStyle: String,//设置蒙层的样式(详见picker-view) view
  73. indicatorStyle: String,//设置选择器中间选中框的样式(详见picker-view) view
  74. chooseItemTextStyle: String//设置picker列表文案样式 text
  75. },
  76. /**
  77. * 组件的初始数据
  78. */
  79. data: {
  80. columnsData:[],
  81. value:[],
  82. backData:[],
  83. height:0,
  84. isOpen: false,
  85. isUseKeywordOfShow: false,
  86. scrollEnd : true,//滚动是否结束
  87. lastValue : [],//上次各个colum的选择索引
  88. tempValue : [],
  89. isFirstOpen : true,
  90. onlyKey : '',
  91. defaultPickDataTemp: '',
  92. listDataTemp: '',
  93. },
  94. /**
  95. * 组件的方法列表
  96. */
  97. methods: {
  98. tapModal () {
  99. this.properties.isShowPicker = false;
  100. this._closePicker()
  101. },
  102. cancle () {
  103. this.setData({
  104. donghua:false
  105. })
  106. this.triggerEvent('cancle')
  107. this._closePicker()
  108. },
  109. sure () {
  110. let that=this
  111. this.setData({
  112. donghua: false
  113. })
  114. setTimeout(function(){
  115. let { scrollEnd, tempValue} = that.data;
  116. console.log(scrollEnd,"滚动")
  117. // if (!that.data.scrollEnd) return;
  118. let backData = that._getBackDataFromValue(tempValue);
  119. that.setData({
  120. backData
  121. })
  122. that.triggerEvent('sure', {
  123. choosedData:backData,
  124. choosedIndexArr:tempValue
  125. })
  126. that._closePicker()
  127. },900)
  128. },
  129. _bindChange (e) {
  130. console.log(e)
  131. let {scrollType} = this.properties;
  132. let { lastValue } = this.data;
  133. let val = e.detail.value;
  134. let backData = [];
  135. switch (scrollType) {
  136. case "normal":
  137. this.data.tempValue = val.concat();
  138. this.data.tempValue = val.concat();
  139. break;
  140. case "link":
  141. //let column_02 = this._getColumnData(this.properties.listData[val[0]].children);
  142. //let column_03 = this._getColumnData(this.properties.listData[val[0]].children[val[1]].children);
  143. let tempArray = [];
  144. if(val.length>1){
  145. val.slice(0,val.length-1).reduce((t,c,i) => {
  146. let v = t[c].children;
  147. tempArray.push(this._getColumnData(v))
  148. return v
  149. },this.properties.listData)
  150. }
  151. //let columnsData = [this.data.columnsData[0],column_02,column_03];
  152. let columnsData = [this.data.columnsData[0], ...tempArray];
  153. //设置value关联
  154. let compareIndex = this._getScrollCompareIndex(lastValue, val);
  155. if(compareIndex > -1){
  156. let tempI = 1;
  157. while(val[compareIndex+tempI]!==undefined){
  158. val[compareIndex+tempI] = 0;
  159. tempI++;
  160. }
  161. }
  162. val = this._validate(val);
  163. this.data.lastValue = val.concat();
  164. this.data.tempValue = val.concat();
  165. this.setData({
  166. columnsData,
  167. // value: val
  168. })
  169. }
  170. },
  171. _validate (val) {
  172. let { columnsData } = this.data;
  173. columnsData.forEach((v, i) => {
  174. if(columnsData[i].length - 1 < val[i]){
  175. val[i] = columnsData[i].length - 1;
  176. }
  177. })
  178. this.setData({
  179. value: val
  180. })
  181. return val;
  182. },
  183. _bindpickend(){
  184. console.log("滚动结束")
  185. this.data.scrollEnd = true;
  186. },
  187. _bindpickstart(){
  188. this.data.scrollEnd = false;
  189. console.log("滚动开始")
  190. },
  191. _openPicker () {
  192. if(!this.data.isFirstOpen){
  193. if(this.properties.listData.length !== 0){
  194. this._setDefault(this._computedBackData(this.data.backData))
  195. }
  196. }
  197. this.data.isFirstOpen = false;
  198. this.setData({
  199. isOpen: true
  200. })
  201. },
  202. _closePicker () {
  203. this.setData({
  204. isOpen: false
  205. })
  206. },
  207. _getColumnData (arr) {
  208. return arr.map((v) => this._fomateObj(v))
  209. },
  210. _fomateObj (o) {
  211. let tempO = {};
  212. for(let k in o){
  213. k !== "children" && (tempO[k] = o[k]);
  214. }
  215. return tempO;
  216. },
  217. _getScrollCompareIndex (arr1, arr2) {
  218. let tempIndex = -1;
  219. for(let i = 0, len = arr1.length; i<len; i++){
  220. if(arr1[i] !== arr2[i]){
  221. tempIndex = i;
  222. break;
  223. }
  224. }
  225. return tempIndex;
  226. },
  227. //根据id获取索引
  228. _getIndexByIdOfObject (listData,idArr,key,arr) {
  229. if(!Array.isArray(listData)) return;
  230. for(let i = 0,len = listData.length; i<len; i++){
  231. if(listData[i][key] == idArr[arr.length][key]){
  232. arr.push(i)
  233. return this._getIndexByIdOfObject(listData[i].children,idArr,key,arr)
  234. }
  235. }
  236. },
  237. _setDefault (inBackData) {
  238. let {listData,defaultPickData,scrollType} = this.properties;
  239. let { lastValue, tempValue, onlyKey } = this.data;
  240. if(inBackData){
  241. defaultPickData = inBackData;
  242. }
  243. let backData = [];
  244. switch (scrollType) {
  245. case "normal":
  246. if(isPlainObject(listData[0][0])){
  247. this.setData({
  248. isUseKeywordOfShow: true
  249. })
  250. }
  251. if(Array.isArray(defaultPickData) && defaultPickData.length>0){
  252. backData = listData.map((v, i) => v[defaultPickData[i]]);
  253. this.data.tempValue = defaultPickData;
  254. this.data.lastValue = defaultPickData;
  255. }else{
  256. backData = listData.map((v) => v[0]);
  257. }
  258. this.setData({
  259. columnsData: listData,
  260. backData: backData,
  261. value: defaultPickData
  262. })
  263. break;
  264. case "link":
  265. // let column_01 = this._getColumnData(newVal);
  266. // let column_02 = this._getColumnData(newVal[0].children);
  267. // let column_03 = this._getColumnData(newVal[0].children[0].children);
  268. // let columnsData = [column_01,column_02,column_03];
  269. let columnsData = [];
  270. //如果默认值
  271. if(Array.isArray(defaultPickData) && defaultPickData.length>0 && defaultPickData.every((v, i) => isPlainObject(v))){
  272. let key = onlyKey = Object.keys(defaultPickData[0])[0];
  273. let arr = [];
  274. this._getIndexByIdOfObject(listData, defaultPickData, key, arr);
  275. defaultPickData = arr;
  276. let tempI = 0;
  277. do{
  278. lastValue.push(defaultPickData[tempI]);
  279. columnsData.push(this._getColumnData(listData))
  280. listData = listData[defaultPickData[tempI]].children;
  281. tempI++;
  282. }while (listData)
  283. backData = columnsData.map((v, i) => v[defaultPickData[i]]);
  284. //如果没有默认值
  285. }else{
  286. this.data.onlyKey = this.properties.keyWordsOfShow||'name';
  287. do{
  288. lastValue.push(0);
  289. columnsData.push(this._getColumnData(listData))
  290. listData = listData[0].children;
  291. }while (listData)
  292. backData = columnsData.map((v) => v[0]);
  293. }
  294. this.data.tempValue = defaultPickData;
  295. this.data.lastValue = defaultPickData;
  296. this.setData({
  297. isUseKeywordOfShow: true,
  298. columnsData,
  299. backData,
  300. })
  301. setTimeout(()=>{
  302. this.setData({
  303. value: defaultPickData
  304. })
  305. },0)
  306. break;
  307. }
  308. },
  309. _computedBackData(backData) {
  310. let {scrollType, listData} = this.properties;
  311. let { onlyKey } = this.data;
  312. if(scrollType === 'normal'){
  313. return backData.map((v, i) => listData[i].findIndex((vv, ii) => this._compareObj(v, vv)))
  314. }else{
  315. return backData.map((v, i) => {
  316. let o = {};
  317. o[onlyKey] = v[onlyKey]
  318. return o;
  319. })
  320. }
  321. },
  322. _compareObj (o1, o2) {
  323. let {keyWordsOfShow} = this.properties;
  324. if(typeof o1 !== "object"){
  325. return o1 === o2
  326. }else{
  327. return o1[keyWordsOfShow] === o2[keyWordsOfShow]
  328. }
  329. },
  330. _getBackDataFromValue (val) {
  331. let tempArr = [];
  332. if(val.length > 0){
  333. tempArr = this.data.columnsData.reduce((t, v, i) => {
  334. return t.concat(v[val[i]])
  335. }, [])
  336. }else{
  337. tempArr = this.data.columnsData.map((v, i) => v[0])
  338. }
  339. return tempArr
  340. },
  341. _compareDate () { //完全相等返回true
  342. let {defaultPickDataTemp, listDataTemp} = this.data;
  343. let {defaultPickData, listData} = this.properties
  344. return defaultPickDataTemp === defaultPickData && listDataTemp === listData
  345. },
  346. _setTempData () {
  347. let {defaultPickData, listData} = this.properties;
  348. this.data.defaultPickDataTemp = defaultPickData;
  349. this.data.listDataTemp = listData;
  350. }
  351. }
  352. })