Vuex에서 지도 상자 맵에 대한 중앙 집중식 상태를 설정하는 방법
나는 방금 vue와 함께 vuex를 사용하기 시작했다.나는 문서를 이해한다.나는 내가 vuex를 사용해야 하는지 그리고 만약 그렇다면 어떻게 해야 하는지 잘 모르는 특정한 문제가 있다.
나는 다양한 레이아웃과 구성 요소 등에 지도 박스 맵이 만능인 앱을 가지고 있다.나는 vue 단일 파일 구성 요소를 여러 개 만들 예정이지만 지도 박스 맵의 동일한 인스턴스로 작업하고 있으므로, 지도 박스 맵을 vuex 스토어에서 시작하고 관리하는 것이 타당하다고 생각한다.그래서 예를 들어 지도 레이아웃이나 다른 것을 변경하면 모든 구성요소에 반영된다.
내가 이 방향으로 계속 가면 몇 가지 일에 어리둥절해진다.
- 지도는 변수/배열이 아니라 지도 상자 클래스 맵의 인스턴스다.그래서 초기 상태는 빈 물체인데, 그 다음에 초기화할 필요가 있다고 생각한다.맞나?
- 초기화는 비동기적이며 페이지가 로드된 후에만 발생할 수 있다.그래서 아래 내 코드가 작동하지 않을 수도 있어!?
나는 다음을 따르려고 노력했다.
지도 상자 맵 모듈 제작,
mapboxmap.js
import simple from '../../components/simplestyle'
let mapboxgl = require('mapbox-gl/dist/mapbox-gl.js')
// initial state
const state = {
myMap: {},
mapLoaded: false
}
const mutations = {
loadMap (state, myMap) {
state.myMap = myMap
state.mapLoaded = true
}
}
const actions = {
loadMap (context) {
'use strict'
mapboxgl.accessToken = 'mysecretmapboxcode'
let myMap = new mapboxgl.Map({
container: 'map',
style: simple,
hash: true,
center: [-74.0073, 40.7124],
zoom: 16
})
context.commit('loadMap', myMap)
}
}
export default {
state,
mutations,
actions
}
구성 요소:
평면 배치.부에를 하다
<template>
<div>
<div id='map' class='map'>
</div>
</div>
</template>
<script type='text/babel'>
export default {
mounted () {
this.computed.myMapForView.set().then(() => this.computed.myMapForView.get())
},
computed: {
myMapForView: {
// getter
get: function () {
return this.$store.state.myMap
},
// setter
set: function () {
this.$store.dispatch('loadMap')
}
}
}
}
</script>
그건 효과가 없어.솔루션 접근법과 이를 위한 구체적인 방법에 대한 제안은 매우 감사하다.
브라우저에 표시되는 오류 메시지:
vue.runtime.common.js?d43f:433 TypeError: Cannot read property 'myMapForView' of undefined
at VueComponent.mounted (eval at 162 (0.ce2d9bf….js:21), <anonymous>:8:18)
at callHook (eval at <anonymous> (app.js:794), <anonymous>:2335:19)
at Object.insert (eval at <anonymous> (app.js:794), <anonymous>:2525:5)
at invokeInsertHook (eval at <anonymous> (app.js:794), <anonymous>:4352:28)
at VueComponent.patch [as __patch__] (eval at <anonymous> (app.js:794), <anonymous>:4508:5)
at VueComponent.Vue._update (eval at <anonymous> (app.js:794), <anonymous>:2222:19)
at VueComponent.eval (eval at <anonymous> (app.js:794), <anonymous>:2189:10)
at Watcher.get (eval at <anonymous> (app.js:794), <anonymous>:1652:27)
at Watcher.run (eval at <anonymous> (app.js:794), <anonymous>:1721:22)
at flushSchedulerQueue (eval at <anonymous> (app.js:794), <anonymous>:1539:13)
logError @ vue.runtime.common.js?d43f:433
편집: 다음으로 변경한 후this.myMapForView
로부터this.computed.myMapForView
브라우저에서 잘못된 정보를 얻었어.
vue.runtime.common.js?d43f:433
TypeError: Cannot read property 'set' of undefined
at VueComponent.mounted (eval at 162 (0.85b2be9….js:21), <anonymous>:6:22)
at callHook (eval at <anonymous> (app.js:794), <anonymous>:2335:19)
at Object.insert (eval at <anonymous> (app.js:794), <anonymous>:2525:5)
at invokeInsertHook (eval at <anonymous> (app.js:794), <anonymous>:4352:28)
at VueComponent.patch [as __patch__] (eval at <anonymous> (app.js:794), <anonymous>:4508:5)
at VueComponent.Vue._update (eval at <anonymous> (app.js:794), <anonymous>:2222:19)
at VueComponent.eval (eval at <anonymous> (app.js:794), <anonymous>:2189:10)
at Watcher.get (eval at <anonymous> (app.js:794), <anonymous>:1652:27)
at Watcher.run (eval at <anonymous> (app.js:794), <anonymous>:1721:22)
at flushSchedulerQueue (eval at <anonymous> (app.js:794), <anonymous>:1539:13)
logError @ vue.runtime.common.js?d43f:433
내가 보기엔 그런 것 같다.new mapboxgl.Map()
비동기식 함수로서 vuexActions에서는 돌연변이가 아닌 임의의 비동기식 작업을 포함할 수 있다. 돌연변이 처리기 함수는 동기식이어야 한다.
그러니 너는 해야 한다.new mapboxgl.Map()
다음과 같은 동작에서:
import simple from '../../components/simplestyle'
let mapboxgl = require('mapbox-gl/dist/mapbox-gl.js')
// initial state
const state = {
myMap: {},
mapLoaded: false
}
const mutations = {
loadMap (state, myMap) {
state.myMap = myMap
}
}
const actions = {
loadMap (context) {
'use strict'
mapboxgl.accessToken = 'mysecretmapboxkey'
var myMap = new mapboxgl.Map({
container: 'map',
style: simple,
hash: true,
center: [-74.0073, 40.7124],
zoom: 16
})
context.commit('loadMap', myMap)
}
}
export default {
state,
mutations,
actions
}
편집:
마우스 상호 작용으로 인해 상태가 변경되는 경우 다음과 같이 getter와 setter가 있는 vue 인스턴스에 계산된 속성을 가질 수 있다.
computed: {
myMapForView: {
// getter
get: function () {
return this.$store.state. myMap
},
// setter
set: function (newMap) {
this.$store.commit('loadMap', newMap)
}
}
}
작업 중: http://jsfiddle.net/aucqteLn/
또한 다음을 확인하십시오."strict: true"가 포함된 Vuex 스토어가 작동하지 않음
'programing' 카테고리의 다른 글
Java 8 forIndex(색인 포함) (0) | 2022.05.12 |
---|---|
돌연변이 후 경로 변경(VueRouter) 모범 사례(Vuex) (0) | 2022.05.12 |
오류 메시지."Object/Array 타입의 제안서는 기본값을 반환하기 위해 공장 기능을 사용해야 한다." (0) | 2022.05.12 |
Java에서 가져오기 이름 변경 또는 이름이 같은 클래스 두 개 가져오기 (0) | 2022.05.12 |
부동 소수점 값의 정밀도를 유지하기 위한 폭 지정자 인쇄 (0) | 2022.05.12 |