React中使用ajax获取数据在移动浏览器中不显示问题

这个问题困扰了我半个月的时间,今天终于解决了。

在做的一个小项目,页面加载后使用ajax读取本地REST数据,保存在状态中,稍后在form的选择下拉框中显示,代码如下:

150     componentDidMount() {
151       var that = this;
152       const url = 'http://localhost/api/grads/';
153       $.ajax({
154         headers:{
155           'Content-Type':'application/json',
156         },
157         url: url,
158         type:"GET",
159         dataType:"json",
160         data:{},
161         success: function(result){
162           that.setState({grades:result,})
163         },
164         error: function(xhr, status,err){
165           console.log(err.Message);
166         },
167       })
168     }

奇怪的是,运行时在电脑端谷歌、火狐浏览器访问,数据都能加载,在手机端使用谷歌浏览器访问,选择下拉框始终为空,这说明手机端浏览器ajax获取数据时出了问题。
今天偶然在stackoverflow这个帖子里终于找到了解决办法,修改后代码如下:

150     componentDidMount() {
151       var that = this;
152       const url = 'http://localhost/api/grads/';
153       $(function(){$.ajax({  // 此处添加$(function(){
154         headers:{
155           'Content-Type':'application/json',
156         },
157         url: url,
158         type:"GET",
159         dataType:"json",
160         data:{},
161         success: function(result){
162           that.setState({grades:result,})
163         },
164         error: function(xhr, status,err){
165           console.log(err.Message);
166         },
167       })}) // 此处添加})
168     }

修改后手机谷歌浏览器显示正常。这个$(function(){}的功能何在?

javascript中$(function() {....}) 是 jQuery 中的经典用法,等同于 $(document).ready(function() {....}),即在页面加载完成后才执行某个函数,如果函数中要操作 DOM,在页面加载完成后再执行会更安全,所以在使用 jQuery 时这样的写法很常见。

$(document).ready() 里的代码是在页面内容都加载完才执行的,如果把代码直接写到script标签里,当页面加载完这个script标签就会执行里边的代码了,此时如果你标签里执行的代码调用了当前还没加载过来的代码或者dom,那么就会报错,当然如果你把script标签放到页面最后面那么就没问题了,此时和ready效果一样。

$(document).ready(function(){})可以简写成$(function(){});

可参考jquery此处的官方文档

可能的原因是手机端刘览器与电脑端浏览器页面加载中处理脚本时间不同,前者是未等页面加载结束即执行jquery脚本,后者则相反,所以后者不需$(function(){}也可正常显示。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 5,567评论 0 106
  • 五十三:请解释 JavaScript 中 this 是如何工作的。1.方法调用模式当一个函数被保存为一个对象的属性...
    Arno_z阅读 595评论 0 2
  • “ Hello soldier! 我喜欢你, 我一直都喜欢你。 ” 还记得那个曾经吗?我说我喜欢你,你还不信,没想...
    刷新那段回忆阅读 371评论 0 0