vuex状态改变时如何重新渲染vue组件?

How to re-render vue component when vuex state change?

我想创建一个类似控件图层的组件来更改传单的底图。但我不想使用 L.control.layers。因此,我制作了一个侧边栏组件,其中包含更改底图的选项。

我使用 vuejs 并使用 vuex 组织数据。 这是我的代码

store.js

import Vue from 'vue'
import Vuex from 'vuex'
import "leaflet/dist/leaflet.css";

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        satellite: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
        dark: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',
        osm: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
        topography: 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',
        baseMap: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}'
    },
    getters: {
        baseMap: state => state.baseMap
    },
    actions: {
        changeBaseMap({ commit }, base) {
            commit("CHANGE_BASE_MAP", base);
        }
    },
    mutations: {
        CHANGE_BASE_MAP(state, base) {
            state.baseMap = base
        }
    },
})

更改 baseMap 值的侧边栏组件已运行。但是,当 baseMap 状态改变时传单组件不会改变,它只是改变 baseMap 的值而不是传单组件。

这是我的地图组件,我使用 computedstate 更改时访问 baseMap

<template>
    <div id="container" >
        <div id="map"></div>
    </div> 
</template>

<script>
import "leaflet/dist/leaflet.css";
import L from "leaflet";

export default {
    name: "Map",
    data() {
        return {
            center: [-0.789275,113.921327],
            zoom: 5,
            map: null
        };
    },
    computed: {
        baseMap: function () {
            return this.$store.getters.baseMap
        }
    },
    methods: {
        setupLeafletMap () {
            this.map = L.map("map").setView(this.center, this.zoom);
            var tilelayer = L.tileLayer(this.baseMap)
            tilelayer.addTo(this.map)
        }
    },
    mounted() {
        this.setupLeafletMap();
    }
};
</script>

我尝试调用 <div> 标签内的 baseMap 值,当状态改变时,它也会改变。但是传单底层没有改变

<div id="map">{{ baseMap }}</div>

我一直在寻找解决方案,但我仍然感到困惑。我不知道还能做什么。

你应该

 watch: {
        baseMap () {
            this.setupLeafletMap()
        }
    },