123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- <template>
- <view class="w-picker-view">
- <picker-view class="d-picker-view" :indicator-style="itemHeight" :value="pickVal" @change="handlerChange">
- <picker-view-column v-for="(group,gIndex) in range" :key="gIndex">
- <view class="w-picker-item" v-for="(item,index) in group" :key="index">{{item[nodeKey]}}</view>
- </picker-view-column>
- </picker-view>
- </view>
- </template>
- <script>
- export default {
- data() {
- return {
- pickVal:[],
- range:[],
- checkObj:{}
- };
- },
- props:{
- itemHeight:{
- type:String,
- default:"44px"
- },
- value:{
- type:[Array,String],
- default:""
- },
- defaultType:{
- type:String,
- default:"label"
- },
- options:{
- type:Array,
- default(){
- return []
- }
- },
- defaultProps:{
- type:Object,
- default(){
- return{
- lable:"label",
- value:"value",
- children:"children"
- }
- }
- },
- level:{
- //多级联动层级,表示几级联动
- type:[Number,String],
- default:2
- }
- },
- computed:{
- nodeKey(){
- return this.defaultProps.label;
- },
- nodeVal(){
- return this.defaultProps.value;
- },
- nodeChild(){
- return this.defaultProps.children;
- }
- },
- watch:{
- value(val){
- if(this.options.length!=0){
- this.initData();
- }
- },
- options(val){
- this.initData();
- }
- },
- created() {
- if(this.options.length!=0){
- this.initData();
- }
- },
- methods:{
- getData(){
- //用来处理初始化数据
- let options=this.options;
- let col1={},col2={},col3={},col4={};
- let arr1=options,arr2=[],arr3=[],arr4=[];
- let col1Index=0,col2Index=0,col3Index=0,col4Index=0;
- let a1="",a2="",a3="",a4="";
- let dVal=[],obj={};
- let value=this.value;
- let data=[];
- a1=value[0];
- a2=value[1];
- if(this.level>2){
- a3=value[2];
- }
- if(this.level>3){
- a4=value[3];
- };
- /*第1列*/
- col1Index=arr1.findIndex((v)=>{
- return v[this.defaultType]==a1
- });
- col1Index=value?(col1Index!=-1?col1Index:0):0;
- col1=arr1[col1Index];
-
- /*第2列*/
- arr2=arr1[col1Index][this.nodeChild];
- col2Index=arr2.findIndex((v)=>{
- return v[this.defaultType]==a2
- });
- col2Index=value?(col2Index!=-1?col2Index:0):0;
- col2=arr2[col2Index];
-
- /*第3列*/
- if(this.level>2){
- arr3=arr2[col2Index][this.nodeChild];
- col3Index=arr3.findIndex((v)=>{
- return v[this.defaultType]==a3;
- });
- col3Index=value?(col3Index!=-1?col3Index:0):0;
- col3=arr3[col3Index];
- };
-
-
- /*第4列*/
- if(this.level>3){
- arr4=arr3[col4Index][this.nodeChild];
- col4Index=arr4.findIndex((v)=>{
- return v[this.defaultType]==a4;
- });
- col4Index=value?(col4Index!=-1?col4Index:0):0;
- col4=arr4[col4Index];
- };
- switch(this.level*1){
- case 2:
- dVal=[col1Index,col2Index];
- obj={
- col1,
- col2
- }
- data=[arr1,arr2];
- break;
- case 3:
- dVal=[col1Index,col2Index,col3Index];
- obj={
- col1,
- col2,
- col3
- }
- data=[arr1,arr2,arr3];
- break;
- case 4:
- dVal=[col1Index,col2Index,col3Index,col4Index];
- obj={
- col1,
- col2,
- col3,
- col4
- }
- data=[arr1,arr2,arr3,arr4];
- break
- }
- return {
- data,
- dVal,
- obj
- }
- },
- initData(){
- let dataData=this.getData();
- let data=dataData.data;
- let arr1=data[0];
- let arr2=data[1];
- let arr3=data[2]||[];
- let arr4=data[3]||[];
- let obj=dataData.obj;
- let col1=obj.col1,col2=obj.col2,col3=obj.col3||{},col4=obj.col4||{};
- let result="",value=[];
- let range=[];
- switch(this.level){
- case 2:
- value=[col1[this.nodeVal],col2[this.nodeVal]];
- result=`${col1[this.nodeKey]+col2[this.nodeKey]}`;
- range=[arr1,arr2];
- break;
- case 3:
- value=[col1[this.nodeVal],col2[this.nodeVal],col3[this.nodeVal]];
- result=`${col1[this.nodeKey]+col2[this.nodeKey]+col3[this.nodeKey]}`;
- range=[arr1,arr2,arr3];
- break;
- case 4:
- value=[col1[this.nodeVal],col2[this.nodeVal],col3[this.nodeVal],col4[this.nodeVal]];
- result=`${col1[this.nodeKey]+col2[this.nodeKey]+col3[this.nodeKey]+col4[this.nodeKey]}`;
- range=[arr1,arr2,arr3,arr4];
- break;
- }
- this.range=range;
- this.checkObj=obj;
- this.$nextTick(()=>{
- this.pickVal=dataData.dVal;
- });
- this.$emit("change",{
- result:result,
- value:value,
- obj:obj
- })
- },
- handlerChange(e){
- let arr=[...e.detail.value];
- let col1Index=arr[0],col2Index=arr[1],col3Index=arr[2]||0,col4Index=arr[3]||0;
- let arr1=[],arr2=[],arr3=[],arr4=[];
- let col1,col2,col3,col4,obj={};
- let result="",value=[];
- arr1=this.options;
- arr2=(arr1[col1Index]&&arr1[col1Index][this.nodeChild])||arr1[arr1.length-1][this.nodeChild]||[];
- col1=arr1[col1Index]||arr1[arr1.length-1]||{};
- col2=arr2[col2Index]||arr2[arr2.length-1]||{};
- if(this.level>2){
- arr3=(arr2[col2Index]&&arr2[col2Index][this.nodeChild])||arr2[arr2.length-1][this.nodeChild];
- col3=arr3[col3Index]||arr3[arr3.length-1]||{};
- }
- if(this.level>3){
- arr4=(arr3[col3Index]&&arr3[col3Index][this.nodeChild])||arr3[arr3.length-1][this.nodeChild]||[];
- col4=arr4[col4Index]||arr4[arr4.length-1]||{};
- }
- switch(this.level){
- case 2:
- obj={
- col1,
- col2
- }
- this.range=[arr1,arr2];
- result=`${(col1[this.nodeKey]||'')+(col2[this.nodeKey]||'')}`;
- value=[col1[this.nodeVal]||'',col2[this.nodeVal]||''];
- break;
- case 3:
- obj={
- col1,
- col2,
- col3
- }
- this.range=[arr1,arr2,arr3];
- result=`${(col1[this.nodeKey]||'')+(col2[this.nodeKey]||'')+(col3[this.nodeKey]||'')}`;
- value=[col1[this.nodeVal]||'',col2[this.nodeVal]||'',col3[this.nodeVal]||''];
- break;
- case 4:
- obj={
- col1,
- col2,
- col3,
- col4
- }
- this.range=[arr1,arr2,arr3,arr4];
- result=`${(col1[this.nodeKey]||'')+(col2[this.nodeKey]||'')+(col3[this.nodeKey]||'')+(col4[this.nodeKey]||'')}`;
- value=[col1[this.nodeVal]||'',col2[this.nodeVal]||'',col3[this.nodeVal]||'',col4[this.nodeVal]||''];
- break;
- }
- this.checkObj=obj;
- this.pickVal=arr;
- this.$emit("change",{
- result:result,
- value:value,
- obj:obj
- })
- }
- }
- }
- </script>
- <style lang="scss">
- @import "./w-picker.css";
- </style>
|