fs-collapse.vue 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <template>
  2. <view class="fs-collapse">
  3. <slot></slot>
  4. </view>
  5. </template>
  6. <script setup>
  7. import { computed, provide, watch, reactive, onMounted, getCurrentInstance } from 'vue'
  8. const props = defineProps({
  9. accordion: Boolean,
  10. active: {
  11. type: [Number, String],
  12. default: '0'
  13. },
  14. position: {
  15. type: String,
  16. default: 'right',
  17. validator(value) {
  18. return ['left', 'right'].includes(value)
  19. }
  20. },
  21. rotate: {
  22. type: [Number, String],
  23. default: 90
  24. },
  25. activeType: String,
  26. activeColor: String,
  27. allOpen: Boolean,
  28. border: {
  29. type: Boolean,
  30. default: true
  31. }
  32. })
  33. const emits = defineEmits(['change'])
  34. const emitEvent = (name) => {
  35. setActive(name)
  36. emits('change', name)
  37. }
  38. const children = reactive([])
  39. const setActive = (name) => {
  40. children.forEach(item => {
  41. if (props.accordion) {
  42. item.setActive(name === item.name ? !item.open : false)
  43. } else {
  44. if (name === item.name) {
  45. item.setActive(!item.open)
  46. }
  47. }
  48. })
  49. }
  50. provide('collapse', reactive({
  51. ...props,
  52. children,
  53. emitEvent
  54. }))
  55. watch(() => props.active, value => {
  56. setActive(value)
  57. })
  58. defineExpose({
  59. children
  60. })
  61. </script>
  62. <style lang="scss" scoped>
  63. .fs-collapse{
  64. // background-color: #fff;
  65. }
  66. </style>