index.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <div class="date-cell">
  3. <van-cell v-if="disabled" :required="required" :title="title" :label="label"/>
  4. <van-cell :required="required" :title="title" :label="label" is-link @click="clickItem"/>
  5. <van-popup v-model="showPicker" round lazy-render position="bottom" :close-on-popstate="true" get-container="#app">
  6. <van-picker
  7. v-bind="$attrs"
  8. show-toolbar
  9. :value-key="prop.label"
  10. v-model="selected"
  11. :columns="columns"
  12. @confirm="pickerConfirm"
  13. @cancel="cancelPicker"
  14. />
  15. </van-popup>
  16. </div>
  17. </template>
  18. <script>
  19. import {getDict} from "@/api/toConsult";
  20. export default {
  21. props:{
  22. //禁用
  23. disabled:{
  24. type: [Boolean,String],
  25. default: false,
  26. },
  27. //双向绑定的数据
  28. value:{
  29. type: [String,Number],
  30. default: null,
  31. },
  32. required:{
  33. type: [Boolean,String],
  34. default: false,
  35. },
  36. //字典表
  37. dict:{
  38. type: String,
  39. default: null,
  40. },
  41. //标题
  42. title:{
  43. type: String,
  44. default: null,
  45. },
  46. //父组件给的列表数据
  47. dataList:{
  48. type: Array,
  49. default: ()=>[],
  50. },
  51. //自定义字段
  52. prop:{
  53. type: Object,
  54. default: ()=>(
  55. {
  56. label:'dictLabel',
  57. value:'dictValue'
  58. }
  59. ) ,
  60. }
  61. },
  62. data(){
  63. return{
  64. showPicker:false,
  65. selected:null,
  66. label:'',
  67. columns: [],
  68. }
  69. },
  70. watch:{
  71. dict:{
  72. handler(val){
  73. if(!val) return;
  74. if(this.dataList.length) return;
  75. this.queryDict();
  76. },
  77. immediate: true
  78. },
  79. dataList:{
  80. handler(val){
  81. if(this.dict) return;
  82. this.columns = this.dataList;
  83. },
  84. immediate: true
  85. },
  86. value:{
  87. handler (val) {
  88. console.log(val, '6666')
  89. if(!val){
  90. this.selected = null;
  91. this.label = null;
  92. }else{
  93. setTimeout(()=>{
  94. this.columns.forEach(v=> {
  95. console.log(v[this.prop.value], '7777')
  96. if (v[this.prop.value] === val) {
  97. this.selected = v;
  98. this.label = v[this.prop.label];
  99. }
  100. })
  101. },200)
  102. // this.selected = val;
  103. // this.label = val.dictLabel;
  104. }
  105. },
  106. immediate:true
  107. }
  108. },
  109. methods:{
  110. queryDict(){
  111. console.log(this.dict,'this.dict')
  112. getDict( this.dict ).then(res => {
  113. let { code, data, msg } = res;
  114. if (code == 200) {
  115. this.columns = data;
  116. }
  117. })
  118. },
  119. cancelPicker(){
  120. this.showPicker = false;
  121. },
  122. pickerConfirm(val){
  123. this.selected = val;
  124. this.label = val[this.prop.label];
  125. this.showPicker = false;
  126. this.$emit('change',this.selected[this.prop.value])
  127. },
  128. clickItem(){
  129. this.showPicker = true;
  130. },
  131. },
  132. model:{
  133. prop: 'value',
  134. event: 'change',
  135. }
  136. }
  137. </script>
  138. <style scoped>
  139. </style>