MarkerClusterer.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <template>
  2. <span>
  3. <slot></slot>
  4. </span>
  5. </template>
  6. <script>
  7. import MarkerClusterer from 'bmaplib.markerclusterer'
  8. import {createSize} from '../base/factory.js'
  9. import commonMixin from '../base/mixins/common.js'
  10. export default {
  11. name: 'bml-marker-clusterer',
  12. mixins: [commonMixin('markerClusterer')],
  13. props: {
  14. gridSize: {
  15. type: Object
  16. },
  17. maxZoom: {
  18. type: Number
  19. },
  20. minClusterSize: {
  21. type: Number
  22. },
  23. styles: {
  24. type: Array,
  25. default () {
  26. return []
  27. }
  28. },
  29. averageCenter: {
  30. type: Boolean,
  31. default: false
  32. }
  33. },
  34. watch: {
  35. gridSize: {
  36. handler (val) {
  37. const {BMap, originInstance} = this
  38. originInstance.setGridSize(BMap, val.map)
  39. },
  40. deep: true
  41. },
  42. maxZoom (val) {
  43. const {originInstance} = this
  44. originInstance.setMaxZoom(val)
  45. },
  46. minClusterSize: {
  47. handler (val) {
  48. const {BMap, originInstance} = this
  49. originInstance.setMinClusterSize(createSize(BMap, val))
  50. },
  51. deep: true
  52. },
  53. styles: {
  54. handler (val) {
  55. const {BMap, originInstance} = this
  56. const obj = JSON.parse(JSON.stringify(val)).map(item => {
  57. item.size = item.size && createSize(BMap, item.size)
  58. return item
  59. })
  60. originInstance.setStyles(obj)
  61. },
  62. deep: true
  63. },
  64. averageCenter (val) {
  65. this.reload()
  66. }
  67. },
  68. methods: {
  69. load () {
  70. const {BMap, map, gridSize, minClusterSize, maxZoom, styles, averageCenter} = this
  71. this.originInstance = new MarkerClusterer(map, {
  72. gridSize: gridSize && createSize(BMap, gridSize),
  73. maxZoom,
  74. minClusterSize: minClusterSize && createSize(BMap, minClusterSize),
  75. styles: styles.map(item => {
  76. item.size = createSize(BMap, item.size)
  77. return item
  78. }),
  79. isAverageCenter: averageCenter
  80. })
  81. this.$nextTick(() => {
  82. const markers = this.$children.map(inst => inst.originInstance).filter(marker => marker instanceof BMap.Marker)
  83. this.originInstance.addMarkers(markers)
  84. })
  85. }
  86. },
  87. beforeCreate () {
  88. this.preventChildrenRender = true
  89. }
  90. }
  91. </script>