美文网首页
server-mock ajax

server-mock ajax

作者: swhzzz | 来源:发表于2017-06-16 15:52 被阅读0次

    ajax 是什么?有什么作用?

    ajax全称Asynchronous javascript and xml。它的主要作用是在向服务器发送请求的时候,不用刷新页面,同时能接收和处理服务器的数据

    前后端开发联调需要注意哪些事情?后端接口完成前如何 mock 数据?

    前后端开发需要注意的事情
    1.数据的传输格式是post还是get
    2.请求的url的名字
    3.以key=valaue的形式向后端传递参数,多组数据中间要加上&
    4.后端返回的数据的格式是否为json

    如何mock数据
    方法一 使用nodejs的express框架
    方法二使用server-mock,具体步骤:
    1.在需要开启服务器的文件夹下创建router.js
    2.在router.js内写好对应接口的函数
    3.通过git bash 执行mock start来开启服务器
    4.选中地址,右键打开网址
    5.ctrl+c关闭服务器

    点击按钮,使用 ajax 获取数据,如何在数据到来之前防止重复点击?

    设定一个变量isDataArrive来监控数据有没有达到,默认为true

    var isDataArrive=true;
    btn.addEventListener('click',function(){
    
        if(!isDataArrive) return;
        xhr=new XMLHttpRequest();
        xhr.onreadystatechange=function(){
          if(xhr.readySyate === 4){
                if(xhr.status ===200){
                         //todo
                         isDataArrive=true;//数据来了之后设置为true,又可以发请求了
                  }
              }
           
        }
        xhr.open(...)
        xhr.send(...);
        isDataArrive=false;//发送一次请求后立即设置为false防止用户再次发请求
    }
    
    

    封装一个 ajax 函数,能通过如下方式调用。后端在本地使用server-mock来 mock 数据

    function ajax(opts){
        var xhr=new XMLHttpRequest();
        
        xhr.onreadystatechange=function(){
            if(xhr.readyState === 4){
                if(xhr.status === 200 || xhr.status === 304){
                    var results=JSON.parse(xhr.responseText);
                    opts.success(results);
                }else
                    opts.error()
            }
        }
    
        var str='';//拼接URL
        for(key in opts.data){
            str+=key+'='+opts.data[key]+'&';
        }
        str=str.substr(0,str.length-1);//去掉&符号
    
    
        if(opts.type === 'get'){
            xhr.open(opts.type,opts.url+'?'+str,true);
            xhr.send();
        }
        if(opts.type === 'post')
            xhr.open(opts.type,url,true);
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xhr.send(str);
        }
    
    }
    
    document.querySelector('#btn').addEventListener('click', function(){
        ajax({
            url: '/login',   //接口地址
            type: 'get',               // 类型, post 或者 get,
            data: {
                username: 'xiaoming',
                password: 'abcd1234'
            },
            success: function(ret){
                console.log(ret);       // {status: 0}
            },
            error: function(){
               console.log('出错了')
            }
        })
    });
    

    实现加载更多的功能

    前端代码

    ct.addEventListener('mouseover',function(e){
                if(e.target.tagName.toLowerCase() === 'li'){
                    e.target.classList.add('hover');
                }
            });
            
            ct.addEventListener('mouseout',function(e){
                if(e.target.tagName.toLowerCase() === 'li'){
                    e.target.classList.remove('hover');
                }
            });
    
            btn.addEventListener('click',function(e){
                e.preventDefault();
    
                if(!isDataArrived ) return;
                var xhr=new XMLHttpRequest();
                xhr.open('GET','/loadmore?index='+pos+'&length=5');
                xhr.onreadystatechange=function(){
                    if(xhr.readyState === 4){
                        if(xhr.status === 200 || xhr.status === 304){
                            var results=JSON.parse(xhr.responseText);
                            var docfrag=document.createDocumentFragment();
                            for(var i=0;i<results.length;i++){
                                var li=document.createElement('li');
                                li.innerText=results[i];
                                docfrag.appendChild(li);
                            }
                            ct.appendChild(docfrag);
                            pos+=5;
                            isDataArrived=true;
                        }
                    }
                }
                xhr.send();
                isDataArrived=false;
            });
    

    后端代码

    app.get('/loadmore',function(req,res){
        var idx=req.query.index;
        var len=req.query.length;
        var data=[];
        for(var i=0;i<len;i++,idx++){
            data.push('内容'+idx);
        }
        res.send(data);
    })
    

    相关文章

      网友评论

          本文标题:server-mock ajax

          本文链接:https://www.haomeiwen.com/subject/ggiptxtx.html