Vue 異步請求


 

vue最初使用vue-resource來實現異步請求(ajax),vue 2.0開始推薦使用 axios 來代替vue-resource。

 

准備工作

1、使用npm下載axios

npm install axios

 

2、引入axios.js

<script src="js/axios.js"></script>

上線時換為min.js

 

 

 

 

前端   vue使用axios發起異步請求

可以這樣寫:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <!-- 引入vue.js -->
        <script src="js/vue.js"></script>
        <!-- 引入axios.js -->
        <script src="js/axios.js"></script>
    </head>
    <body>
        
    <div id="app"></div>

    <script>
        
        new Vue({
            el:'#app',
            template:`
                <div>
                    <button @click="login">發送</button>
                </div>
            `,
            data(){
                return{
                    
                }
            },
            methods:{

                  login:function() {
                      axios.post('/login', {  //get|post可選,用對象{ }傳遞數據,如果不傳遞數據,可缺省{ }。get方式參數也可以拼接在url中
                          username: 'chy',   //通常是獲取表單數據,$('#xxx').val
                          password: 'abcd'
                      }).then(function (response) {  //處理后台返回的數據。
                          console.log(response);  //response是后台返回的整個響應
                          console.log(response.data);  //.data才是后台返回的數據
                      }).catch(function (error) {  //發生錯誤時的處理
                          console.log(error);
                      });
                  }

            }

        })
    
    </script>        
        
    </body>
</html>
 

如果不需要后台返回數據,可以不要then。catch也不是必需的。

 

 

也可以這樣寫:

    methods:{

          login:function() {
              axios({
                  method:'post',  //請求方式
                  url:'/login',  //后台接口
                  data:{  //傳給后台的數據
                      username: 'chy',
                      password: 'abcde'
                  }
              }).then(function (response) {
                  console.log(response);  //response是后台返回的整個響應
                  console.log(response.data);  //.data才是后台返回的數據
              }).catch(function (error) {  //發生錯誤時的處理
                  console.log(error);
              });
          }

    }

這種是不跨域的,如果跨域,url要寫  host|ip:port/xxx,寫全。

發起異步請求時可以用resultType指定期待返回的數據類型(text、json、stream),可以但是沒必要,會自動識別返回的數據類型。

 

 

 

 

后台   處理ajax請求

@Controller
// @ResponseBody  //@ResponseBody可以寫在類上、方法上,寫在類上時,對類中所有方法都生效
// @RestController  //@RestController相當於@Controller+@ResponseBody
public class UserController {

    @RequestMapping("/login")
    @ResponseBody  //如果要返回數據給前端,需要用@ResponseBody修飾方法,以json形式返回,不然會被當做視圖名
    public String login(@RequestBody Map<String,String> map) {  //如果要接收ajax傳來的參數,需要用一個、且只能用一個Map來接收參數,並且要用@RequestBody標注
        String username = map.get("username");  //獲取ajax傳遞的參數
        String password = map.get("password");
        System.out.println(username);
        System.out.println(password);

        return "ok";  //返回給前端的數據。如果不返回數據,返回值類型設置為void即可

    }

}

 

 

上面的demo不涉及跨域請求,如果請求要跨域,前端、后台都要做一些其它設置。

 

 

 

后台  返回數據示例

@RestController  //相當於@Controller+@ResponseBody
public class UserController {

    //返回文本|字符串
    @RequestMapping("/login1")
    public String login1() {
        return "hello";
    }

    //返回對象
    @RequestMapping("/login2")
    public User login2() {
        User user = new User("chy", "abcd");
        return user;
    }

    //返回Map。Map和pojo類都是一回事,都是作為json對象返回
    @RequestMapping("/login3")
    public Map<String,Object> login3() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("username", "chy");
        map.put("age", 20);
        return map;
    }

    //返回List,以json數組的形式返回
    @RequestMapping("/login4")
    public List login4() {
        User user1 = new User("chy1", "abcd");
        User user2 = new User("chy2", "abcd");
        User user3 = new User("chy3", "abcd");
        ArrayList<User> userList = new ArrayList<>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        return userList;
    }

}

 

 

 

 

前端   取出數據示例

.then(function (response) {
      console.log(response.data);  //取出返回的數據,字符串|對象|Map|List
      // console.log(response.data.username);  //取出對象|Map的某個字段的值
      // console.log(response.data[0]);  //取出List中的某個元素
      // console.log(response.data[0].username);  //取出List中的某個元素的某個字段的值
  })

 

 

 

說明

如果調試時,Chrome控制台報錯:  net::ERR_SOCKET_NOT_CONNECTED   ,多刷新幾次,或者清除緩存即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM