jp-picker.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <view>
  3. <picker @change="PickerChange" :value="index" :disabled="disabled" :range-value="rangeValue" :range-key="rangeKey" :range="range">
  4. <view class=" picker action">
  5. <view class="text-grey ">{{label || '请选择'}}</view>
  6. </view>
  7. </picker>
  8. </view>
  9. </template>
  10. <script>
  11. export default {
  12. data() {
  13. return {
  14. index: -1,
  15. label: '请选择'
  16. };
  17. },
  18. props: {
  19. value: String,
  20. empty: {
  21. type: String,
  22. default: ''
  23. },
  24. rangeKey: {
  25. type: String,
  26. default: 'label'
  27. },
  28. rangeValue: {
  29. type: String,
  30. default: 'value'
  31. },
  32. range: {
  33. type: Array,
  34. default: []
  35. },
  36. disabled: {
  37. type: Boolean,
  38. default: false
  39. },
  40. onChangeNew: {
  41. type: Function,
  42. default: null,
  43. }
  44. },
  45. mounted() {
  46. if (this.empty) {
  47. this.label = this.empty
  48. }
  49. },
  50. watch:{
  51. value: {
  52. handler (val) {
  53. if(val) {
  54. let options = this.range.filter((option)=>{
  55. return option.value === val
  56. })
  57. if(options.length === 0){
  58. this.label = '请选择'
  59. } else {
  60. this.label = options[0][this.rangeKey]
  61. }
  62. }
  63. },
  64. immediate: true,
  65. deep: false
  66. }
  67. },
  68. methods:{
  69. PickerChange(e) {
  70. this.index = e.detail.value;
  71. if(this.index !== -1){
  72. this.label = this.range[this.index][this.rangeKey]
  73. this.$emit('input', this.range[this.index][this.rangeValue])
  74. }else{
  75. this.label = '请选择'
  76. this.$emit('input', null)
  77. }
  78. if (this.onChangeNew) {
  79. this.onChangeNew()
  80. }
  81. }
  82. }
  83. }
  84. </script>
  85. <style>
  86. </style>