zoukankan      html  css  js  c++  java
  • 2019.8.27更新:《Vue.js实战一书p231练习试做(3)

    练习: 学习XMLHttpRequest (即XHR )相关知识,开发一个简单的 ajax 插件,用于异步获取服务端数据。

    此插件代码如下:(已测试可正常使用)

    const install=function(Vue,opotions={}){
        const ajax=new Vue({
            data(){
                return{
                    options:null,
                    data:'',
                    type:'GET',
                    url:'',
                    success:function(){},
                    error:function(){},
                    xhr:null
                    
                };
            },
            methods:{
                initialize(options){
                    this.setOptions(options);
                    //this.data=this.setData(this.options.data);
                    this.data=this.options.data;
                    this.type=this.options.type;
                    this.url=this.options.url;
                    this.success=this.options.success;
                    this.error=this.options.error;
                    this.xhr=this.createXHR();
                    this.start();
                },
                setOptions(options){
                    this.options={
                        type:'GET',
                        data:'',
                        success:function(mes){alert(mes)},
                        error:function(mes){alert(mes)},
                        url:''
                    };
                    Object.assign(this.options,options);
                    //for(var p in options) this.options[p]=opotions[p];
                },
                //把传入的数据设置为key1=value1&key2=value2格式的字符串,如果
                //是使用FormData对象生成数据,则可以不用,不然会出错
                setData(data){
                    let localdata=[];
                    for(let i in data){
                        localdata.push(encodeURIComponent(i) +
                        '='+encodeURIComponent(data[i]));
                    }
                    localdata=localdata.join('&');
                    return localdata;
                },
                createXHR(){
                    const _this=this;
                    const xhr = new XMLHttpRequest();
                    xhr.onreadystatechange=function(){
                        if(xhr.readyState==4){
                            const status=xhr.status;
                            if(status>=200 && status<300){
                                _this.success &&
                                _this.success(xhr.responseText);
                            }else{
                                _this.error &&
                                _this.error(status);
                            }
                        }
                    };
                    return xhr;
                },
                get(url){
                    this.xhr.open('get',url+'?'+this.data,true);
                    this.xhr.send(null);
                },
                post(url,mes){
                    this.xhr.open('post',url,true);
                    //this.xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                    this.xhr.send(mes);
                },
                start(){
                    switch(this.type.toUpperCase()){
                        case 'GET':
                            this.get(this.url);
                            break;
                        case 'POST':
                            this.post(this.url,this.data);
                            break;
                    }
                }
            },
            created(){
                this.initialize();
            }
        });
        Vue.prototype.$ajax=ajax;
    };
    export default install;

    使用方法:

    在main.js中导入 

    import VueAjax from './components/vue-ajax';
    Vue.use(VueAjax);

    在 .vue 格式文件中,

    <template>
      <div id="app">
        <form id="user-info">
            <label for="user-name">Name:</label><input type="text" id="user-name" name="user-name" /><br />
            <label for="user-email">Email:</label><input type="text" id="user-email" name="user-email" /><br />
            <input type="button" value="Submit" @click="submitData" />
        </form>
      </div>
    </template>
    <script>
    export default {
      methods:{
        submitData(){
          var form=document.getElementById('user-info');
          var objs={
            type:'post',
            url:'postexample.php',
            data:new FormData(form)
          }
          this.$ajax.initialize(objs);
        }
      },
      
    }
    </script>

    可以直接调用get/post,传入url/data

    也可以调用Initialize,传入一个参数对象

    this.$ajax.initialize(objs);
    this.$ajax.get('example.txt');
    this.$ajax.post('postexample.php',new FormData(form));
     
  • 相关阅读:
    Axiom3D:资源引用与加载基本流程.
    实践:C++平台迁移以及如何用C#做C++包装层
    Axiom3D:Buffer漫谈
    CSS: hover选择器的使用
    TTS 语音修复 ,缺少文件的,没注册类的
    sqlserver 查找某个字段在哪张表里
    Excel 表格查找重复数据,去重复统计
    C# HttpWebResponse WebClient 基础连接已经关闭: 发送时发生错误.
    C# 控件置于最顶层、最底层
    C# 线程 正确使用Thread.Join()停止方式
  • 原文地址:https://www.cnblogs.com/sx00xs/p/11421460.html
Copyright © 2011-2022 走看看