Vue js AJAX 请求与数据响应教程(六)
- Vue.js
- 9小时前
- 3热度
- 0评论
在现代 Web 开发中,Vue.js 是一个非常流行的前端框架,它提供了丰富的功能来简化复杂的用户界面开发。本文将详细介绍如何使用 Vue.js 进行 AJAX 请求,并探讨如何实现数据的动态响应。通过本文,你将学会如何使用 vue-resource 库进行 GET 和 POST 请求,以及如何使用 Vue 的响应式系统来管理数据。
什么是 vue-resource?
vue-resource 是一个用于 Vue.js 的 HTTP 客户端库,可以帮助你在 Vue 应用中轻松地进行 AJAX 请求。虽然 Vue 2.0 推荐使用 axios,但 vue-resource 仍然是一个非常实用的选择,特别是在一些简单的项目中。
引入 vue-resource
首先,你需要在项目中引入 vue-resource 库。可以通过 CDN 方式引入:
<script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js"></script>GET 请求
简单的 GET 请求
下面是一个简单的 GET 请求示例,我们将从服务器获取一个文本文件的内容并显示在页面上:
<div id="app">
<p>{{ msg }}</p>
<button @click="fetchData">获取数据</button>
</div>
<script>
window.onload = function () {
var vm = new Vue({
el: '#app',
data: {
msg: 'Hello World!'
},
methods: {
fetchData: function () {
// 发送 GET 请求
this.$http.get('/try/ajax/ajax_info.txt')
.then(function (response) {
this.msg = response.body;
}, function (error) {
console.log('请求失败处理');
});
}
}
});
};
</script>在这个示例中,我们定义了一个 Vue 实例,并在 methods 中定义了一个 fetchData 方法。当用户点击按钮时,会触发 fetchData 方法,发送一个 GET 请求并更新 msg 数据。
带参数的 GET 请求
如果你需要在 GET 请求中传递参数,可以使用 params 选项:
this.$http.get('/get.php', { params: { a: 1, b: 2 } })
.then(function (response) {
this.msg = response.body;
}, function (error) {
console.log(error.status);
});POST 请求
发送 POST 请求
POST 请求通常用于向服务器发送数据。在 vue-resource 中,发送 POST 请求也非常简单:
<div id="app">
<p>{{ msg }}</p>
<button @click="postData">发送数据</button>
</div>
<script>
window.onload = function () {
var vm = new Vue({
el: '#app',
data: {
msg: 'Hello World!'
},
methods: {
postData: function () {
// 发送 POST 请求
this.$http.post('/try/ajax/demo_test_post.php', {
name: '菜鸟教程',
url: 'http://www.runoob.com'
}, {
emulateJSON: true
}).then(function (response) {
this.msg = response.body;
}, function (error) {
console.log(error.status);
});
}
}
});
};
</script>在这个示例中,我们定义了一个 postData 方法,用于发送 POST 请求并将数据发送到服务器。emulateJSON: true 选项用于确保数据以 application/x-www-form-urlencoded 格式发送。
服务器端处理
服务器端的 PHP 代码如下:
<?php
$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : '';
$url = isset($_POST['url']) ? htmlspecialchars($_POST['url']) : '';
echo '网站名: ' . $name;
echo "\n";
echo 'URL 地址: ' . $url;
?>语法与 API
vue-resource 提供了多种 HTTP 请求方法,包括 get、post、put、delete 等。这些方法都可以通过全局 Vue.http 对象或 Vue 实例的 this.$http 来调用。
// 全局调用
Vue.http.get('/someUrl', [options]).then(successCallback, errorCallback);
Vue.http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);
// 实例内调用
this.$http.get('/someUrl', [options]).then(successCallback, errorCallback);
this.$http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);请求选项
vue-resource 的请求选项包括但不限于以下内容:
| 参数 | 类型 | 描述 |
|---|---|---|
| url | string | 请求的目标 URL |
| body | Object, FormData, string | 作为请求体发送的数据 |
| headers | Object | 作为请求头部发送的头部对象 |
| params | Object | 作为 URL 参数的参数对象 |
| method | string | HTTP 方法(例如 GET,POST,...) |
| timeout | number | 请求超时(单位:毫秒)(0 表示永不超时) |
| before | function(request) | 在请求发送之前修改请求的回调函数 |
| progress | function(event) | 用于处理上传进度的回调函数 ProgressEvent |
| credentials | boolean | 是否需要出示用于跨站点请求的凭据 |
| emulateHTTP | boolean | 是否需要通过设置 X-HTTP-Method-Override 头部并且以传统 POST 方式发送 PUT,PATCH 和 DELETE 请求 |
| emulateJSON | boolean | 设置请求体的类型为 application/x-www-form-urlencoded |
响应对象
vue-resource 返回的响应对象包含以下属性和方法:
| 属性 | 类型 | 描述 |
|---|---|---|
| url | string | 响应的 URL 源 |
| body | Object, Blob, string | 响应体数据 |
| headers | Header | 请求头部对象 |
| ok | boolean | 当 HTTP 响应码为 200 到 299 之间的数值时该值为 true |
| status | number | HTTP 响应码 |
| statusText | string | HTTP 响应状态 |
| 方法 | 类型 | 描述 |
|---|---|---|
| text() | Promise<string> | 以字符串方式返回响应体 |
| json() | Promise<Object> | 以格式化后的 JSON 对象方式返回响应体 |
| blob() | Promise<Blob> | 以二进制 Blob 对象方式返回响应体 |
数据响应
Vue.js 的响应式系统使得数据管理变得非常方便。我们可以通过 $watch 方法来监听数据的变化,并在数据变化时执行相应的操作。
监听数据变化
下面是一个简单的示例,展示了如何使用 $watch 监听数据变化:
<div id="app">
<p style="font-size: 25px;">计数器: {{ counter }}</p>
<button @click="counter++" style="font-size: 25px;">点我</button>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
counter: 1
}
});
vm.$watch('counter', function (newVal, oldVal) {
alert('计数器值的变化: ' + oldVal + ' 变为 ' + newVal + '!');
});
setTimeout(function () {
vm.counter += 20;
}, 10000);
</script>在这个示例中,我们定义了一个 counter 数据,并使用 $watch 监听其变化。当 counter 发生变化时,会弹出一个提示框显示变化前后的新旧值。
动态添加属性
Vue 不能检测到对象属性的添加或删除。如果需要在运行时动态添加属性,可以使用 Vue.set 方法:
<div id="app">
<p style="font-size: 25px;">计数器: {{ products.id }}</p>
<button @click="products.id++" style="font-size: 25px;">点我</button>
</div>
<script>
var myProduct = { id: 1, name: 'book', price: '20.00' };
var vm = new Vue({
el: '#app',
data: {
products: myProduct
}
});
Vue.set(myProduct, 'qty', 1);
vm.$watch('products.id', function (newVal, oldVal) {
alert('计数器值的变化: ' + oldVal + ' 变为 ' + newVal + '!');
});
</script>在这个示例中,我们使用 Vue.set 方法动态添加了一个 qty 属性,并成功实现了响应式。
删除属性
如果需要删除动态添加的属性,可以使用 Vue.delete 方法:
<div id="app">
<p style="font-size: 25px;">计数器: {{ products.id }}</p>
<button @click="products.id++" style="font-size: 25px;">点我</button>
</div>
<script>
var myProduct = { id: 1, name: 'book', price: '20.00' };
var vm = new Vue({
el: '#app',
data: {
products: myProduct
}
});
Vue.delete(myProduct, 'price');
vm.$watch('products.id', function (newVal, oldVal) {
alert('计数器值的变化: ' + oldVal + ' 变为 ' + newVal + '!');
});
</script>在这个示例中,我们使用 Vue.delete 方法删除了 price 属性,并成功实现了响应式。
总结
通过本文,你学会了如何使用 vue-resource 进行 AJAX 请求,并了解了 Vue.js 的响应式系统。无论是简单的 GET 请求还是复杂的 POST 请求,vue-resource 都能提供强大的支持。同时,通过 $watch、Vue.set 和 Vue.delete 方法,你可以灵活地管理数据的变化,实现更加动态和响应式的用户界面。
希望本文对你有所帮助,如果你有任何问题或建议,欢迎留言交流!