首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用react useState更新状态

无法使用react useState更新状态
EN

Stack Overflow用户
提问于 2019-06-01 19:12:34
回答 2查看 996关注 0票数 0

我正在学习react hooks。在我的代码中,我将绘制地图的初始值设置为

代码语言:javascript
复制
//map state
const [mapData, setMapData] = useState(
    { lat: 40.712776, lng: -74.0059, zoom: 5 }
);

useEffect()回调中,我加载了一次地图

代码语言:javascript
复制
useEffect(() => {
    initMap();
}, []); // run once

initMap()中,有一个map.on()方法来获取更新的地理位置。initMap()

代码语言:javascript
复制
const initMap = () => {
    mapboxgl.accessToken = 'token';
    const map = new mapboxgl.Map({
        container: mapContainer,
        style: 'mapbox://styles/mapbox/streets-v11',
        center: [mapData.lng, mapData.lat],
        zoom: mapData.zoom
    }); // load the map with init values

    // update the `mapData` as map move
    map.on('moveend', () => {
        const { lng, lat } = map.getCenter(); // logs the updated lat and lon
        setMapData({ lat: lat.toFixed(4), lng: lng.toFixed(4), zoom: map.getZoom().toFixed(2) }); // suppose to set the updated value
        console.log(mapData); // not logging updated values!
    });
}

setMapData()未设置状态。但是map.on被调用并记录值。

EN

回答 2

Stack Overflow用户

发布于 2019-06-01 19:19:11

setState是异步的,更新状态可能对后面的语句可用,也可能不可用。

使用在mapData更新上运行的效果挂钩来对更改做出反应。

代码语言:javascript
复制
useEffect(() => console.log(mapData), [mapData])
票数 1
EN

Stack Overflow用户

发布于 2020-04-25 02:43:18

这也是useSelector的情况。我不相信Mapbox会以这种方式支持React Hooks。我将事件处理程序添加到我的map中,但这些处理程序无法访问组件的useState/useSelector的当前值。这些值始终是将事件处理程序添加到映射时的值。我求助于添加另一个触发useEffects的状态,而不是在我的事件处理程序中全部处理它。

编辑:我注意到你可以使用redux的'useStore‘钩子来抓取当前的redux存储,甚至在Mapbox事件处理程序中也可以!它更难测试,但是,你必须手动模拟'useStore‘。希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56406196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档