JSONP跨域请求在Vue中怎么用?一直报错
我在Vue项目里想用JSONP请求第三方接口,但总是失败,浏览器控制台提示“Uncaught ReferenceError: callback is not defined”。我试过动态创建script标签,也试过axios-jsonp插件,都不行。
下面是我现在写的代码,接口是百度搜索的suggest接口,应该支持JSONP:
<template>
<div>{{ result }}</div>
</template>
<script>
export default {
data() {
return { result: '' }
},
mounted() {
const script = document.createElement('script')
script.src = 'https://suggestion.baidu.com/su?wd=前端&cb=callback'
document.head.appendChild(script)
},
methods: {
callback(res) {
this.result = res.s[0]
}
}
}
</script>
这个callback方法根本没被调用,是不是作用域问题?该怎么正确绑定回调函数?
解决这个问题的方法是在全局作用域中定义回调函数,然后在 Vue 实例中调用它。具体步骤如下:
1. 在 Vue 实例外部定义一个全局回调函数。
2. 将这个全局回调函数与 Vue 实例关联起来,以便在获取到数据后更新 Vue 的 data 属性。
下面是修改后的代码示例:
为什么这样做?
1. 全局回调函数:JSONP 请求需要在全局作用域中定义回调函数,因为浏览器会在全局作用域中查找并调用这个函数。
2. 关联 Vue 实例:通过将 Vue 实例挂载到
window对象上,并在全局回调函数中调用 Vue 实例的方法,可以在获取到数据后更新 Vue 的 data 属性。这样处理后,当 JSONP 请求成功并返回数据时,全局回调函数会被调用,并且能够正确地更新 Vue 实例中的数据。
两个解决方案:
1. 简单粗暴的直接挂window上:
2. 更优雅的用jsonp库(推荐):
先安装
jsonp这个包第二种方式更靠谱,不用手动处理script标签和全局污染。JSONP这种上古技术现在确实用得少了,CORS才是王道,但遇到必须用JSONP的老接口也没办法。