123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- // picker/picker.js
- import { isString,isPlainObject } from './tool';
- Component({
- /**
- * 组件的属性列表
- */
- properties: {
- scrollType:{
- type: String,
- value: "normal"//"link": scroll间联动 "normal": scroll相互独立
- },
-
- listData: {
- type: Array,
- value: [],
- observer: function(newVal) {
- if (newVal.length === 0 || this._compareDate()) return;
- this._setTempData();
- let tempArr = [...new Array(newVal.length).keys()].map(() => 0)
- // console.log(tempArr,'测试~')
- this.data.lastValue = this.data.tempValue =tempArr;
- console.log(this.data.tempValue,'测试2')
- this._setDefault()
- // let {defaultPickData} = this.properties;
- // if(newVal.length === 0) return;
- //
- // this._setDefault(newVal, defaultPickData)
- }
- },
- defaultPickData:{
- type: Array,
- value: [],
- observer: function (newVal) {
- if (newVal.length === 0 || this._compareDate()) return;
- this._setTempData();
- this._setDefault()
- }
- },
- keyWordsOfShow:{
- type: String,
- value: "name"
- },
- isShowPicker:{
- type: Boolean,
- value: false,
- observer: function(newVal) {
- if (newVal) {
- this.setData({
- donghua:true
- })
- this._openPicker()
- }else{
-
- this._closePicker()
- }
- }
- },
- titleText: {//标题文案
- type: String,
- value: "标题"
- },
- cancelText:{//取消按钮文案
- type: String,
- value: "取消"
- },
- sureText:{//确定按钮文案
- type: String,
- value: "确定"
- },
- pickerHeaderStyle: String,//标题栏样式 view
- sureStyle: String, //标题栏确定样式 text
- cancelStyle: String,//标题栏取消样式 text
- titleStyle: String,//标题栏标题样式 view
- maskStyle: String,//设置蒙层的样式(详见picker-view) view
- indicatorStyle: String,//设置选择器中间选中框的样式(详见picker-view) view
- chooseItemTextStyle: String//设置picker列表文案样式 text
- },
- /**
- * 组件的初始数据
- */
- data: {
- columnsData:[],
- value:[],
- backData:[],
- height:0,
- isOpen: false,
- isUseKeywordOfShow: false,
- scrollEnd : true,//滚动是否结束
- lastValue : [],//上次各个colum的选择索引
- tempValue : [],
- isFirstOpen : true,
- onlyKey : '',
- defaultPickDataTemp: '',
- listDataTemp: '',
- },
- /**
- * 组件的方法列表
- */
- methods: {
- tapModal () {
- this.properties.isShowPicker = false;
- this._closePicker()
- },
- cancle () {
- this.setData({
- donghua:false
- })
- this.triggerEvent('cancle')
- this._closePicker()
- },
- sure () {
- let that=this
- this.setData({
- donghua: false
- })
- setTimeout(function(){
- let { scrollEnd, tempValue} = that.data;
- console.log(scrollEnd,"滚动")
-
- // if (!that.data.scrollEnd) return;
-
-
- let backData = that._getBackDataFromValue(tempValue);
- that.setData({
- backData
- })
- that.triggerEvent('sure', {
- choosedData:backData,
- choosedIndexArr:tempValue
- })
- that._closePicker()
- },900)
- },
- _bindChange (e) {
- console.log(e)
- let {scrollType} = this.properties;
- let { lastValue } = this.data;
- let val = e.detail.value;
- let backData = [];
- switch (scrollType) {
- case "normal":
- this.data.tempValue = val.concat();
- this.data.tempValue = val.concat();
- break;
- case "link":
- //let column_02 = this._getColumnData(this.properties.listData[val[0]].children);
- //let column_03 = this._getColumnData(this.properties.listData[val[0]].children[val[1]].children);
- let tempArray = [];
- if(val.length>1){
- val.slice(0,val.length-1).reduce((t,c,i) => {
- let v = t[c].children;
- tempArray.push(this._getColumnData(v))
- return v
- },this.properties.listData)
- }
- //let columnsData = [this.data.columnsData[0],column_02,column_03];
- let columnsData = [this.data.columnsData[0], ...tempArray];
- //设置value关联
- let compareIndex = this._getScrollCompareIndex(lastValue, val);
- if(compareIndex > -1){
- let tempI = 1;
- while(val[compareIndex+tempI]!==undefined){
- val[compareIndex+tempI] = 0;
- tempI++;
- }
- }
- val = this._validate(val);
- this.data.lastValue = val.concat();
- this.data.tempValue = val.concat();
- this.setData({
- columnsData,
- // value: val
- })
- }
- },
- _validate (val) {
- let { columnsData } = this.data;
- columnsData.forEach((v, i) => {
- if(columnsData[i].length - 1 < val[i]){
- val[i] = columnsData[i].length - 1;
- }
- })
- this.setData({
- value: val
- })
- return val;
- },
- _bindpickend(){
- console.log("滚动结束")
- this.data.scrollEnd = true;
- },
- _bindpickstart(){
- this.data.scrollEnd = false;
- console.log("滚动开始")
- },
- _openPicker () {
- if(!this.data.isFirstOpen){
- if(this.properties.listData.length !== 0){
- this._setDefault(this._computedBackData(this.data.backData))
- }
- }
- this.data.isFirstOpen = false;
- this.setData({
- isOpen: true
- })
- },
- _closePicker () {
- this.setData({
- isOpen: false
- })
- },
- _getColumnData (arr) {
- return arr.map((v) => this._fomateObj(v))
- },
- _fomateObj (o) {
- let tempO = {};
- for(let k in o){
- k !== "children" && (tempO[k] = o[k]);
- }
- return tempO;
- },
- _getScrollCompareIndex (arr1, arr2) {
- let tempIndex = -1;
- for(let i = 0, len = arr1.length; i<len; i++){
- if(arr1[i] !== arr2[i]){
- tempIndex = i;
- break;
- }
- }
- return tempIndex;
- },
- //根据id获取索引
- _getIndexByIdOfObject (listData,idArr,key,arr) {
- if(!Array.isArray(listData)) return;
- for(let i = 0,len = listData.length; i<len; i++){
- if(listData[i][key] == idArr[arr.length][key]){
- arr.push(i)
- return this._getIndexByIdOfObject(listData[i].children,idArr,key,arr)
- }
- }
- },
- _setDefault (inBackData) {
- let {listData,defaultPickData,scrollType} = this.properties;
- let { lastValue, tempValue, onlyKey } = this.data;
- if(inBackData){
- defaultPickData = inBackData;
- }
- let backData = [];
- switch (scrollType) {
- case "normal":
- if(isPlainObject(listData[0][0])){
- this.setData({
- isUseKeywordOfShow: true
- })
- }
- if(Array.isArray(defaultPickData) && defaultPickData.length>0){
- backData = listData.map((v, i) => v[defaultPickData[i]]);
- this.data.tempValue = defaultPickData;
- this.data.lastValue = defaultPickData;
- }else{
- backData = listData.map((v) => v[0]);
- }
- this.setData({
- columnsData: listData,
- backData: backData,
- value: defaultPickData
- })
- break;
- case "link":
- // let column_01 = this._getColumnData(newVal);
- // let column_02 = this._getColumnData(newVal[0].children);
- // let column_03 = this._getColumnData(newVal[0].children[0].children);
- // let columnsData = [column_01,column_02,column_03];
- let columnsData = [];
- //如果默认值
- if(Array.isArray(defaultPickData) && defaultPickData.length>0 && defaultPickData.every((v, i) => isPlainObject(v))){
- let key = onlyKey = Object.keys(defaultPickData[0])[0];
- let arr = [];
- this._getIndexByIdOfObject(listData, defaultPickData, key, arr);
- defaultPickData = arr;
- let tempI = 0;
- do{
- lastValue.push(defaultPickData[tempI]);
- columnsData.push(this._getColumnData(listData))
- listData = listData[defaultPickData[tempI]].children;
- tempI++;
- }while (listData)
- backData = columnsData.map((v, i) => v[defaultPickData[i]]);
- //如果没有默认值
- }else{
- this.data.onlyKey = this.properties.keyWordsOfShow||'name';
- do{
- lastValue.push(0);
- columnsData.push(this._getColumnData(listData))
- listData = listData[0].children;
- }while (listData)
- backData = columnsData.map((v) => v[0]);
- }
- this.data.tempValue = defaultPickData;
- this.data.lastValue = defaultPickData;
- this.setData({
- isUseKeywordOfShow: true,
- columnsData,
- backData,
- })
- setTimeout(()=>{
- this.setData({
- value: defaultPickData
- })
- },0)
- break;
- }
- },
- _computedBackData(backData) {
- let {scrollType, listData} = this.properties;
- let { onlyKey } = this.data;
- if(scrollType === 'normal'){
- return backData.map((v, i) => listData[i].findIndex((vv, ii) => this._compareObj(v, vv)))
- }else{
- return backData.map((v, i) => {
- let o = {};
- o[onlyKey] = v[onlyKey]
- return o;
- })
- }
- },
- _compareObj (o1, o2) {
- let {keyWordsOfShow} = this.properties;
- if(typeof o1 !== "object"){
- return o1 === o2
- }else{
- return o1[keyWordsOfShow] === o2[keyWordsOfShow]
- }
- },
- _getBackDataFromValue (val) {
- let tempArr = [];
- if(val.length > 0){
- tempArr = this.data.columnsData.reduce((t, v, i) => {
- return t.concat(v[val[i]])
- }, [])
- }else{
- tempArr = this.data.columnsData.map((v, i) => v[0])
- }
- return tempArr
- },
- _compareDate () { //完全相等返回true
- let {defaultPickDataTemp, listDataTemp} = this.data;
- let {defaultPickData, listData} = this.properties
- return defaultPickDataTemp === defaultPickData && listDataTemp === listData
- },
- _setTempData () {
- let {defaultPickData, listData} = this.properties;
- this.data.defaultPickDataTemp = defaultPickData;
- this.data.listDataTemp = listData;
- }
- }
- })
|