在脚本中调用 axios 后,Vue 数据未定义

Posted

技术标签:

【中文标题】在脚本中调用 axios 后,Vue 数据未定义【英文标题】:Vue data getting undefined after axios call in script 【发布时间】:2019-02-06 00:05:21 【问题描述】:

我正在尝试通过使用 axios 的 api 在我的传单地图上渲染标记。在我的 axios 调用中,我正在获取数据并且如果我在我的渲染模板中 data ,数据就会显示。问题是当尝试在同一个脚本中使用数据时,就在 axios 调用从数据中渲染标记之后。在 axios 调用后尝试使用数据时,我得到 undefined

export default 
      type: Array,
      data () 
        return 
          post: [],
        
      , 
      created () 
        axios.get("")
          .then((response)  =>  
          // console.log(response.data.resource)
          this.post = response.data.resource;
          // console.log([this.post.lat])
        ).catch(error => 
          console.log(error.message);
        )
      ,
      mounted () 
        var mymap = L.map(this.$refs['mapElement']).setView([40.783058, -73.971252], 12);
        var myIcon = L.icon(
          iconUrl: redMarker,
          iconSize: [38, 95],
          iconAnchor: [22, 94],
          popupAnchor: [-3, -76],
        )
        var myIcon2 = L.icon(
          iconUrl: greenMarker,
          iconSize: [38, 95],
          iconAnchor: [22, 94],
          popupAnchor: [-3, -76],

        )
        var marker = L.marker([40.783058, -73.971252], icon: myIcon).addTo(mymap);
          // console.log([this.post[0].lat])
        var marker2 = L.marker([this.post.lat, this.post.lng], icon: myIcon2).addTo(mymap);

[Vue 警告]:挂载钩子错误:“错误:无效的 LatLng 对象:(未定义,未定义)”

【问题讨论】:

【参考方案1】:

很难确切地说出问题所在,但我会删除标记并在 lat 更改时重新添加它,这样您就可以重新渲染应该解决问题的标记:

watch: 
    'post.lat': (newLat, oldLat) => 
        //we should destroy the marker here and regenerate it.
    

【讨论】:

【参考方案2】:

axios.get 是一个异步函数。如果前一个钩子包含异步函数,Vue Hooks 不会等到前一个钩子完成后自行执行。

在您的情况下,挂载的钩子在创建的钩子完成之前完成,所以this.post 仍然是一个空数组。

为了一个好的做法,您需要将map 实例存储在数据中,并在axios.get 回调中向地图添加标记。下面是一些示例代码。

export default 
    type: Array,
    data() 
        return 
            mymap: null,
            post: []
        
    ,
    created() ,
    mounted() 
        this.mymap = L.map(this.$refs['mapElement']).setView([40.783058, -73.971252], 12);
        var myIcon = L.icon(
            iconUrl: redMarker,
            iconSize: [38, 95],
            iconAnchor: [22, 94],
            popupAnchor: [-3, -76],
        )
        var myIcon2 = L.icon(
            iconUrl: greenMarker,
            iconSize: [38, 95],
            iconAnchor: [22, 94],
            popupAnchor: [-3, -76],

        )
        var marker = L.marker([40.783058, -73.971252],  icon: myIcon ).addTo(mymap);
        // console.log([this.post[0].lat])

        axios.get("")
            .then((response) => 
                // console.log(response.data.resource)
                this.post = response.data.resource;
                var marker2 = L.marker([this.post.lat, this.post.lng],  icon: myIcon2 ).addTo(this.mymap);
                // console.log([this.post.lat])
            ).catch(error => 
                console.log(error.message);
            )
    

【讨论】:

如果有人遇到“如果前一个挂钩包含异步函数,Vue Hooks 不会等到前一个挂钩完成后自行执行”,请看这个小提琴显示@mannok 确实是对的~jsfiddle.net/h2k8w9mz

以上是关于在脚本中调用 axios 后,Vue 数据未定义的主要内容,如果未能解决你的问题,请参考以下文章

Axios 响应数据未加载到 Laravel 中的 Vue 组件上

无法读取未定义的属性“推送”-vue 和 axios

Laravel Vue Axios 未定义

Vuex 操作未将本地存储令牌添加到 Axios 调用后

为啥axios数据存储在变量中时未定义?

在 Jest 中模拟 axios 返回 axios 未定义