index.taro.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <picker
  3. :mode="mode"
  4. :range="range"
  5. @change="onChange"
  6. @columnChange="onColumnChange"
  7. :value="value"
  8. >
  9. <slot></slot>
  10. </picker>
  11. </template>
  12. <script lang="ts">
  13. import { onUpdated, ref, watch } from 'vue';
  14. const { create } = createComponent('picker');
  15. import { commonProps } from './commonProps';
  16. import { createComponent } from './../../utils/create';
  17. export default create({
  18. props: {
  19. mode: {
  20. type: String,
  21. default: 'selector'
  22. },
  23. ...commonProps
  24. },
  25. emits: ['confirm'],
  26. setup(props, { emit }) {
  27. let value = ref<any>([]);
  28. let range = ref<any>([]);
  29. onUpdated(() => {
  30. console.log('updated', props.listData);
  31. });
  32. const onChange = (e: any) => {
  33. let ret;
  34. if (props.mode === 'selector') {
  35. ret = props.listData[e.detail.value];
  36. } else if (props.mode === 'multiSelector') {
  37. ret = range.value
  38. ?.map((item: any, idx: number) => item[e.detail.value[idx]])
  39. .filter((res: any) => res);
  40. }
  41. emit('confirm', e.detail.value, ret);
  42. };
  43. watch(
  44. props.listData,
  45. (val: any) => {
  46. try {
  47. if (val.length) {
  48. value.value = [];
  49. range.value = [];
  50. if (props.mode === 'selector') {
  51. range.value = props.listData;
  52. } else if (props.mode === 'multiSelector') {
  53. val.forEach((item: any) => {
  54. value.value.push(item.defaultIndex);
  55. range.value.push(item.values);
  56. });
  57. }
  58. }
  59. } catch (error) {
  60. console.log('listData参数格式错误', error);
  61. }
  62. },
  63. { immediate: true, deep: true }
  64. );
  65. const onColumnChange = (e: any) => {
  66. console.log('修改的列为', e.detail.column, ',值为', e.detail.value);
  67. };
  68. return {
  69. confirm,
  70. onChange,
  71. value,
  72. range,
  73. onColumnChange
  74. };
  75. }
  76. });
  77. </script>
  78. <style lang="scss" scoped></style>