| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- <template>
- <span>
- <slot></slot>
- </span>
- </template>
- <script>
- import MarkerClusterer from 'bmaplib.markerclusterer'
- import {createSize} from '../base/factory.js'
- import commonMixin from '../base/mixins/common.js'
- export default {
- name: 'bml-marker-clusterer',
- mixins: [commonMixin('markerClusterer')],
- props: {
- gridSize: {
- type: Object
- },
- maxZoom: {
- type: Number
- },
- minClusterSize: {
- type: Number
- },
- styles: {
- type: Array,
- default () {
- return []
- }
- },
- averageCenter: {
- type: Boolean,
- default: false
- }
- },
- watch: {
- gridSize: {
- handler (val) {
- const {BMap, originInstance} = this
- originInstance.setGridSize(BMap, val.map)
- },
- deep: true
- },
- maxZoom (val) {
- const {originInstance} = this
- originInstance.setMaxZoom(val)
- },
- minClusterSize: {
- handler (val) {
- const {BMap, originInstance} = this
- originInstance.setMinClusterSize(createSize(BMap, val))
- },
- deep: true
- },
- styles: {
- handler (val) {
- const {BMap, originInstance} = this
- const obj = JSON.parse(JSON.stringify(val)).map(item => {
- item.size = item.size && createSize(BMap, item.size)
- return item
- })
- originInstance.setStyles(obj)
- },
- deep: true
- },
- averageCenter (val) {
- this.reload()
- }
- },
- methods: {
- load () {
- const {BMap, map, gridSize, minClusterSize, maxZoom, styles, averageCenter} = this
- this.originInstance = new MarkerClusterer(map, {
- gridSize: gridSize && createSize(BMap, gridSize),
- maxZoom,
- minClusterSize: minClusterSize && createSize(BMap, minClusterSize),
- styles: styles.map(item => {
- item.size = createSize(BMap, item.size)
- return item
- }),
- isAverageCenter: averageCenter
- })
- this.$nextTick(() => {
- const markers = this.$children.map(inst => inst.originInstance).filter(marker => marker instanceof BMap.Marker)
- this.originInstance.addMarkers(markers)
- })
- }
- },
- beforeCreate () {
- this.preventChildrenRender = true
- }
- }
- </script>
|