VUE中结合网络数据进行应用的开发
使用步骤:
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
GET
axios.get(地址?key=value&key2=value2).then(function(response){},function(error){});
axios.post(地址,{key:value,key2:value2}).then(function(response){},function(error){})
接口1:随机笑话
请求地址:https://autumnfish.cn/api/joke/list
请求方法:get
请求参数:num(笑话条数,数字)
响应内容:随机笑话
接口2:用户注册
请求地址:https://autumnfish.cn/api/user/reg
请求方法:post
请求参数:username(用户名,字符串)
响应内容:注册成功或失败
代码示例
<body>
<input type="button" value="get请求" id="get" />
<input type="button" value="post请求" id="post" />
body>
<script src="js/axios.min.js">script>
<script>
/*
随机笑话接口测试
请求地址:https://autumnfish.cn/api/joke/list
请求方法:get
请求参数:num(笑话条数,数字)
响应内容:随机笑话
*/
document.getElementById("get").onclick = function() {
axios.get("https://autumnfish.cn/api/joke/list?num=2").then(
function(resp) {
// 调用成功
console.log(resp);
},
function(err) {
// 调用失败
console.log(err);
}
);
};
/*
用户注册
请求地址:https://autumnfish.cn/api/user/reg
请求方法:post
请求参数:username:"用户名"
响应内容:注册成功或失败
*/
document.getElementById("post").onclick = function() {
axios
.post("https://autumnfish.cn/api/user/reg", {
username: "吃豆芽的张飞"
})
.then(
function(resp) {
console.log(resp);
},
function(err) {
console.log(err);
}
);
};
script>
通过vue+axios 完成一个获取笑话的案例。
接口:随机获取一条笑话
请求地址:https://autumnfish.cn/api/joke
请求方法:get
请求参数:无
响应内容:随机笑话
代码示例
<body>
<div id="app">
<input type="button" value="点击获取一个笑话" @click="getJoke" />
<p>{{ joke }}p>
div>
body>
<script src="../js/vue.min.js">script>
<script src="../js/axios.min.js">script>
<script>
/*
请求地址:https://autumnfish.cn/api/joke
请求方法:get
请求参数:无
响应内容:随机笑话
*/
var VM = new Vue({
el: "#app",
data: {
joke: "笑口常开"
},
methods: {
getJoke: function() {
// 把this进行保存
var that = this;
// 异步访问
axios.get("https://autumnfish.cn/api/joke").then(
function(resp) {
console.log(resp.data);
// 在回调函数内部,this无法正常使用,需要提前保存起来
that.joke = resp.data;
},
function(error) {}
);
}
}
});
script>
案例总结
请求地址:http://wthrcdn.etouch.cn/weather_mini
请求方法:get
请求参数:city (要查询的城市名称)
响应内容:天气信息
自定义JS文件
作为一个标准的应用程序,将创建VUE实例的代码抽取到main.js 文件中。
main.js
/**
* 请求地址:http://wthrcdn.etouch.cn/weather_mini
* 请求方法:get
* 请求参数:city (要查询的城市名称)
* 响应内容:天气信息
*/
var VM = new Vue({
el: "#app",
data: {
city: "",
// 定义数组保存 天气信息
weatherList: []
},
methods: {
// 编写查询天气的方法
searchWeather: function() {
console.log("天气查询");
console.log(this.city);
var that = this;
// 调用接口
axios.get("http://wthrcdn.etouch.cn/weather_mini?city=" + this.city).then(
function(resp) {
console.log(resp.data.data.forecast);
// 获取天气信息,保存到weatherList中
that.weatherList = resp.data.data.forecast;
},
function(error) {}
);
}
}
});
HTML页面代码
<body>
<div class="wrap" id="app" v-cloak>
<div class="search_form">
<div class="logo">天气查询div>
<div class="form_group">
<input
type="text"
class="input_txt"
placeholder="请输入要查询的城市"
v-model="city"
@keyup.enter="searchWeather"
/>
<button class="input_sub">回车查询button>
div>
div>
<ul class="weather_list">
<li v-for="item in weatherList">
<div class="info_type">
<span class="iconfont">{{ item.type }}span>
div>
<div class="info_temp">
<b>{{ item.low }}b>
~
<b>{{ item.high }}b>
div>
<div class="info_date">
<span>{{ item.date }}span>
div>
li>
ul>
div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
<script src="js/main.js">script>
body>
当访问天气预报案例页面时,使用插值表达式的地方出现了闪烁问题,如何解决呢?
v-cloak指令
1)添加样式
<style>
/* 通过属性选择器,设置、添加了v-cloak */
[v-cloak] {
display: none;
}
style>
2)在id为app的div中添加 v-cloak
<div class="wrap" id="app" v-cloak>
<div>
写在双括号中的表达式太长了,不利于阅读
{{text.split(',').reverse().join(',')}}
div>.
将这段操作text.split(',').reverse().join(',') 放到计算属性中,最终返回一个结果值就可以
<body>
<div id="app">
<h1>{{ res2 }}h1>
<h1>{{ res2 }}h1>
div>
body>
<script src="js/vue.min.js">script>
<script>
var VM = new Vue({
el: "#app",
data: {
a: 10,
b: 20
},
methods: {
res: function() {
console.log("res方法执行了!");
return this.a * this.b;
}
},
// 使用计算属性进行优化,减少运算次数,用于重复的运算
computed: {
res2: function() {
console.log("res2方法执行了!");
return this.a * this.b;
}
}
});
script>
{{ msg | filterA }} msg是需要处理的数据, filterA是过滤器, | 这个竖线是管道,通过这个管道将数据传输给过滤器进行过滤加工操作。
<h1 v-bind:id=" msg | filterA"> {{ msg }} h1>
需求:通过过滤器给价格前面添加一个符号$
<body>
<div id="app">
<p>电脑价格:{{ price | addIcon }}p>
div>
body>
<script src="js/vue.min.js">script>
<script>
// 局部过滤器,在Vue实例的内部创建filter
var VM = new Vue({
el: "#app", // 挂载点
// model
data: {
price: 200
},
// 局部过滤器
filters: {
// 定义处理函数,value = price
addIcon(value) {
return "$" + value;
}
}
});
script>
需求:将用户名开头字母大写。
<body>
<div id="app">
<p>{{ user.name | changeName }}p>
div>
body>
<script src="js/vue.min.js">script>
<script>
// 在创建Vue实例之前,创建全局过滤器
Vue.filter("changeName", function(value) {
// 将姓名的开头字母大写
return value.charAt(0).toUpperCase() + value.slice(1);
});
var VM = new Vue({
el: "#app",
data: {
user: { name: "jerry" }
}
});
script>
<body>
<div id="app">
<label>名:<input type="text" v-model="firstName"/>label>
<label>姓:<input type="text" v-model="lastName"/>label>
{{ fullName }}
div>
body>
<script src="js/vue.min.js">script>
<script>
var VM = new Vue({
el: "#app",
data: {
firstName: "",
lastName: "",
fullName: ""
},
// 侦听器
watch: {
firstName: function(nval, oval) {
// 参数1:新值,参数2:旧值
this.fullName = nval + " " + this.lastName;
},
lastName: function(nval, oval) {
this.fullName = this.firstName + " " + nval;
}
}
});
script>
语法格式:
Vue.component("组件名称", {
template: "html代码", // 组件的HTML结构代码
data() {
//组件数据
return {};
},
methods: {
// 组件的相关的js方法
方法名() {
// 逻辑代码
}
}
});
注意:
代码示例:
<body>
<div id="app">
<lagou-header>lagou-header>
div>
body>
<script src="js/vue.min.js">script>
<script>
// 定义全局组件
// 组件的命名规则:一般用短横线进行连接,左边是公司名,右边是组件的作用名称
Vue.component("lagou-header", {
template: "HTML{{msg}}
", // template模板中,只能有一个根元素
// 组件中的data是一个函数
data() {
return {
msg: "这是lagou-header组件中的数据部分"
};
},
methods: {
hello() {
alert("你好!");
}
}
});
var VM = new Vue({
el: "#app",
data: {},
methods: {}
});
script>
语法格式:
new Vue({
el: "#app",
components: {
组件名: {
// 组件结构
template: "HTML代码",
// data数据
data() {
return { msg: "xxxx" };
}
}
}
});
注意:
代码示例:
<body>
<div id="app">
<web-msg>web-msg>
div>
body>
<script src="js/vue.min.js">script>
<script>
// 创建局部组件
var VM = new Vue({
el: "#app",
components: {
// 组件名
"web-msg": {
template: "{{msg1}}
{{msg2}}
",
data() {
return {
msg1: "开发进行中...",
msg2: "开发已完成!"
};
}
}
}
});
script>
由于把html语言写在组件里面很不方便,也不太好看所以将它们分开写。
代码示例:
<body>
<div id="app">
<web-msg>web-msg>
div>
<template id="t1">
<div>
<button @click="show">{{ msg }}button>
div>
template>
body>
<script src="js/vue.min.js">script>
<script>
var VM = new Vue({
el: "#app",
components: {
"web-msg": {
template: "#t1",
data() {
return {
msg: "点击查询"
};
},
methods: {
show: function() {
alert("正在查询中,请稍后...");
}
}
}
}
});
script>
总结:
函数 | 说明 |
---|---|
beforeCreate() | 在创建Vue实例之前执行这个方法。例如 加载动画操作。 |
created() | 函数执行时,实例创建完成,属性绑定好了,但是DOM页面还没有生成。 |
beforeMount() | 函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中。 |
mounted() | 函数执行时,模板已经被渲染到页面,执行完就会显示到页面。 |
beforeUpdate() | 函数执行时,内存中的数据已经更新,但是还没有渲染到页面。 |
updated() | 函数执行时,内存中的数据已经更新,此方法执行完显示页面。 |
beforeDestroy() | 函数在实例销毁之前调用。 |
destroyed() | 函数在Vue 实例销毁后调用 |
//方式1: 本地导入
<script src="vue-router.min.js">script>
//方式2: CDN
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
Vue 的$mount()为手动挂载,在项目中可用于延时挂载(例如在挂载之前要进行一些其他操作、判断等),
之后要手动挂载上。new Vue时,el和$mount并没有本质上的不同。
<body>
<div id="app">
<h1>网上冲浪.comh1>
<p>
<router-link to="/home">go to homerouter-link>
<router-link to="/news">go to newsrouter-link>
p>
<router-view>router-view>
div>
body>
<script src="js/vue.min.js">script>
<script src="js/vue-router.min.js">script>
<script>
// 1.定义路由所需的组件
const home = { template: "首页 纵览天下大事" };
const news = { template: "新闻 用事实说话" };
// 2.定义路由,每个路由有两部分,path(路径),component(组件)
const routes = [
{ path: "/home", component: home },
{ path: "/news", component: news }
];
// 3.创建路由管理器实例
const router = new VueRouter({
routes: routes
});
// 4.创建Vue实例,将router注入到Vue实例中,让整个应用都拥有路由的功能
var VM = new Vue({
router
}).$mount("#app"); // $mount是手动挂载代替el
script>