官方网站: https://cn.vuejs.org/v2/guide/ 作者 尤雨溪是中国人.
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js">script>
<script src="./js/vue.min.js">script>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<script src="./js/vue.min.js">script>
head>
<body>
<div id="app">
{{name}}
div>
<script>
// 3.创建Vue实例
var VM = new Vue({
el: "#app",
data: {
name: "Hello Vue"
}
});
script>
body>
html>
<body>
<div id="app">
{{name}} <br>
{{school.name}}{{school.phone}} <br>
<ul>
<li>{{names[0]}}li>
<li>{{names[1]}}li>
<li>{{names[2]}}li>
ul>
div>
body>
<script>
// 3.创建Vue实例
var VM = new Vue({
el: "#app",
data: {
name: "Hello Vue",
// 对象类型
school: {
name: "实验小学",
phone: "100101100"
},
//数组类型
names:["尼古拉斯","赵四","凯撒"]
}
});
script>
Vue中的声明式渲染,简单理解就是我们声明数据,Vue帮我们将数据渲染到HTML.
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<h2>{{name}}h2>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
name:"Hello World!"
}
});
script>
html>
根据官网的介绍,指令 是带有 v- 前缀的特殊属性。通过指令来操作DOM元素
作用: 获取data数据, 设置标签的内容.
注意: 默认写法会替换全部内容,使用插值表达式{{ }}可以替换指定内容.
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<h2>{{message}}基础知识h2>
<h2 v-text="message">基础知识h2>
<h2 v-text="message+2021">h2>
<h2 v-text="message+'高级知识'">h2>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
message:"Vue框架"
}
}
);
script>
html>
作用: 设置元素的 innerHTML (可以向元素中写入新的标签)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
/*
v-html指令:设置元素的innerHTML,向元素中写入标签
*/
style>
head>
<body>
<div id="app">
<h2>{{message}}h2>
<h2 v-text="message">h2>
<h2 v-html="message">h2>
<h2 v-html="url">h2>
<h2 v-text="url">h2>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
message:"Vue框架",
url:"百度"
}
});
script>
html>
作用: 为元素绑定事件, 比如: v-on:click,可以简写为 @click=“方法”
绑定的方法定义在 VUE实例的, method属性中
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
/*
v-on指令:作用是为了元素绑定事件
*/
style>
head>
<body>
<div id="app">
<input type="button" value="点击按钮" v-on:click="show"/>
<hr>
<input type="button" value="点击按钮" @click="show"/>
<hr>
<input type="button" value="双击按钮" @dblclick="show"/>
<h2 @click="changeFood">{{food}}h2>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
food:"小龙虾"
},
// 通过methods 专门存放Vue方法
methods:{
show:function(){
alert("Vue真好用");
},
changeFood:function(){
console.log(this.food);
//使用this获取data中的数据
//Vue中不需要考虑如何更改dom,重点放在修改数据上,数据更新后 使用数据的那个元素也会同步更新
this.food+="真好吃";
}
}
});
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<input type="button" value="点击此处" @click="showTime(666,'爱你哟')">
<input type="text" @keyup.enter="hi">
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{},
methods:{
showTime:function(p1,p2){
console.log(p1);
console.log(p2);
},
hi:function(){
alert("你好");
}
}
});
script>
html>
编码步骤:
①data中定义数据: 比如 num 值为1
②methods中添加两个方法: 比如add(递增) ,sub(递减)
③使用{{ }} 将num设置给 span标签
④使用v-on 将add,sub 分别绑定给 + ,- 按钮
⑤累加到10 停止
⑥递减到0 停止
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<link rel="stylesheet" href="./css/inputNum.css">
head>
<body>
<div id="app">
<input type="button" class="btn btn_plus" v-on:click="add">
<span>{{num}}span>
<input type="button" class="btn btn_minus" @click="sub">
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
num:1
},
methods:{
add:function(){
if(this.num < 10){
this.num++;
}else{
alert("别点了已经最大了");
}
},
sub:function(){
if(this.num > 0){
this.num--;
}else{
alert("别点了已经最小了");
}
}
}
});
script>
html>
案例总结
作用: v-show指令, 根据真假值,切换元素的显示状态
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<input type="button" value="切换状态" v-on:click="changeShow">
<br>
<img v-show="isShow" src="./img/car.gif">
<br>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
isShow:true,
age:20
},
methods:{
changeShow:function(){
//触发,对isShow取反
this.isShow = !this.isShow;
}
}
});
script>
html>
作用: 根据表达值的真假,切换元素的显示和隐藏( 操纵dom 元素 )
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<input type="button" value="切换状态" v-on:click="changeShow">
<br>
<img v-if="isShow" src="./img/car.gif">
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
isShow:false
},
methods:{
changeShow:function(){
//触发,对isShow取反
this.isShow = !this.isShow;
}
}
});
script>
html>
作用: 设置元素的属性 (比如:src,title,class)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<img src="./img/lagou.jpg" alt="图片无法显示">
<img v-bind:src="imgSrc">
<br>
<img v-bind:src="imgSrc" :title="imgTitle">
<div :style="{ fontSize:size+'px'}">v-bind指令div>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
imgSrc:"./img/lagou.jpg",
imgTitle:"拉钩钩",
size:50
}
});
script>
html>
作用: 根据数据生成列表结构
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<input type="button" value="添加数据" @click="add">
<input type="button" value="移除数据" @click="remove">
<ul>
<li v-for="(item,index) in arr">
{{index+1}}号城市:{{item}}
li>
ul>
<h2 v-for="p in persons">
{{p.name}}
h2>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
//数组
arr:["苏州","上海","北京","杭州"],
//对象数组
persons:[{name:"张三"},{name:"李四"},{name:"王五"}]
},
methods:{
add:function(){
//向数组元素添加数据 push
this.persons.push({name:"马六"});
},
remove:function(){
//向数组元素移除数据 shift
this.persons.shift();
}
}
});
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
{{name}}
div>
body>
<script src="./js/vue.min.js">script>
<script>
//创建的vue实例就是VM ViewModel
var VM = new Vue({
el:"#app",
//data就是MVVM中的 model
data:{
name:"hello"
}
});
script>
html>
作用: 获取和设置表单元素的值(实现双向数据绑定)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<input type="button" value="修改message" @click="update">
<br>
<input type="text" v-model="message">
<h2>{{message}}h2>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
message:"一起加油吧"
},
methods:{
update:function(){
this.message="加油";
}
}
});
script>
html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Vue记事本title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="robots" content="noindex, nofollow" />
<meta name="googlebot" content="noindex, nofollow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" type="text/css" href="../css/index.css" />
head>
<body>
<section id="app">
<header class="header">
<h1>VUE记事本h1>
<input
autofocus="autofocus"
autocomplete="off"
placeholder="输入日程"
class="new-todo"
v-model="inputValue"
@keyup.enter="add"
/>
header>
<section class="main">
<ul class="listview">
<li class="todo" v-for="(item,index) in list">
<div class="view">
<span class="index">{{index+1}}span> <label>{{item}}label>
<button class="destroy" @click="remove(index)">button>
div>
li>
ul>
section>
<footer class="footer">
<span class="todo-count"> <strong>{{list.length}}strong> items left span>
<button class="clear-completed" @click="clear">
Clear
button>
footer>
section>
body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
list:["吃饭","喝酒","敲代码"],
inputValue:"996还是007"
},
methods:{
//新增日程方法
add:function(){
//将用户输入的内容添加到list中
this.list.push(this.inputValue);
},
//删除操作
remove:function(index){
console.log(index);
//使用 splice(元素的索引,删除几个)
this.list.splice(index,1);
},
//清空操作
clear:function(){
this.list = [];
}
}
});
script>
html>
总结:
①基于数据的开发方式
②v-text设置的是文本,可以使用简化方式 {{ }}
Ajax 是指一种创建交互式网页应用的开发技术。Ajax = 异步 JavaScript 和 XML。
Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分
进行更新(局部更新)。传统的网页如果需要更新内容,必须重载整个网页页面。
简单记: Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术, 维护用户体验
性, 进行网页的局部刷新.
浏览器访问服务器的方式
同步访问: 客户端必须等待服务器端的响应,在等待过程中不能进行其他操作
异步访问: 客户端不需要等待服务的响应,在等待期间,浏览器可以进行其他操作
ajax.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Documenttitle>
head>
<body>
<input type="text" />
<input type="button" value="Jquery发送异步请求" onclick="run1()" />
body>
<script src="./jquery-1.8.3.min.js">script>
<script>
function run1() {
//JQuery Ajax方式 发送异步请求
$.ajax({
url: "/ajax",
async:true,
data: { name: "张三" },
type: "post",
dataType:"text",
success: function (res) {
console.log(res)
alert("响应成功" + res);
},
error: function () {
alert("响应失败!");
}
});
}
script>
html>
servlet
@WebServlet("/ajax")
public class AjaxServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求数据
String username = req.getParameter("name");
//模拟业务操作,造成的延时效果
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//2.打印username
System.out.println(username);
resp.getWriter().write("hello hello");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
VUE中结合网络数据进行应用的开发
目前十分流行网络请求库,专门用来发送请求,其内部还是ajax,进行封装之后使用更加方便
axios作用: 在浏览器中可以帮助我们完成 ajax异步请求的发送.
Vue2.0之后,尤雨溪推荐大家用axios替换JQuery ajax
使用步骤:
1.导包
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
2.请求方式,以GET和POST举例
GET
axios.get(地址?key=value&key2=value2).then(function(response){},function(error){});
axios.post(地址,{key:value,key2:value2}).then(function(response){},function(error){})
3.根据接口文档, 访问测试接口,进行测试
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<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:"张ABC"})
.then(function(resp){
console.log(resp);
},function(err){
//调用失败
console.log(err);
})
};
script>
html>
通过vue+axios 完成一个获取笑话的案例.
接口: 随机获取一条笑话
请求地址:https://autumnfish.cn/api/joke
请求方法:get
请求参数:无
响应内容:随机笑话
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<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无法正常使用,需要提前保存起来
console.log(that.joke);
that.joke = resp.data;
},function(error){
console.log(error);
});
}
}
});
script>
html>
案例总结
请求地址:http://wthrcdn.etouch.cn/weather_mini
请求方法:get
请求参数:city (要查询的城市名称)
响应内容:天气信息
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){
});
}
}
});
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>天气查询title>
<link rel="stylesheet" href="css/reset.css" />
<link rel="stylesheet" href="css/index.css" />
head>
<body>
<div class="wrap" id="app">
<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>
html>
案例总结
我们发现访问天气预报案例页面时, 使用插值表达式的地方出现了闪烁问题,如何解决呢?
v-cloak指令
作用: 解决插值表达式闪烁问题
当网络较慢,网页还在加载 Vue.js ,而导致 Vue 来不及渲染,这时页面就会显示出 Vue 源代码。我
们可以使用 v-cloak 指令来解决这一问题。
①添加样式
<style>
/* 通过属性选择器,设置 添加了v-cloak */
[v-cloak] {
display: none;
}
style>
②在id为app的div中添加 v-cloak
<div class="wrap" id="app" v-cloak>
在Vue应用中,在模板中双向绑定一些数据或者表达式,但是表达式如果过长,或者逻辑更为复杂
时,就会变得臃肿甚至难以维护和阅读,比如下面的代码:
<div>
写在双括号中的表达式太长了,不利于阅读
{{text.split(',').reverse().join(',')}}
div>.
将这段操作text.split(',').reverse().join(',') 放到计算属性中,最终返回一个结果值就可以
computed 的作用: 减少运算次数, 缓存运算结果. 运用于重复相同的计算.
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<h1>{{a+b}}h1>
<h1>{{a+b}}h1>
<h1>{{res()}}h1>
<h1>{{res()}}h1>
<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>
html>
①定义函数也可以实现与 计算属性相同的效果,都可以简化运算。
②不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会
重新求值。
过滤器是对即将显示的数据做进一步的筛选处理,然后进行显示,值得注意的是过滤器并没有改变原
来的数据,只是在原数据的基础上产生新的数据。
数据加工车间,对值进行筛选加工.
{{ msg | filterA }} msg是需要处理的数据, filterA是过滤器, | 这个竖线是管道,通过这个管道
将数据传输给过滤器进行过滤 加工操作
< h1 v-bind:id=" msg | filterA"> {{ msg }} h1>
需求: 通过过滤器给电脑价格前面 添加一个符号¥
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<p>电脑价格:{{price | addIcon}}p>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
price:200
},
//局部过滤器
filters:{
//定义处理函数 value=price
addIcon(value){
return "¥" + value;
}
}
});
script>
html>
需求: 将用户名开头字母大写
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<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:"jack"}
}
});
script>
html>
Vue.js 提供了一个方法 watch,它用于观察Vue实例上的数据变动。
作用: 当你有一些数据需要随着其它数据变动而变动时,可以使用侦听属性
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<h2>计数器:{{count}}h2>
<input type="button" value="点我+1" @click="count++">
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
count:1
},
watch:{
//监测属性值的变化
count:function(nval,oval){ //参数1 新的值 参数2 原来的值
alert("计数器发生变化 " + oval + "变化为 " + nval);
}
}
});
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<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){
this.fullname = nval + " " + this.lastname;
},
lastname:function(nval,oval){
this.fullname = this.firstname + " " + nval;
}
}
});
script>
html>
组件(Component)是自定义封装的功能。在前端开发过程中,经常出现多个网页的功能是重复
的,而且很多不同的页面之间,也存在同样的功能。
我们将相同的功能进行抽取,封装为组件,这样,前端人员就可以在组件化开发时,只需要书写一次代
码,随处引入即可使用。
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象
为一个组件树。
vue的组件有两种: 全局组件和局部组件
语法格式:
Vue.component("组件名称", {
template: "html代码", // 组件的HTML结构代码
data(){ //组件数据
return {}
},
methods: { // 组件的相关的js方法
方法名(){
// 逻辑代码
}
}
})
注意:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<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(){
return{
msg:"这是xxx-header组件的数据部分"
};
},
methods:{
hello(){
alert("你好")
}
}
});
var VM = new Vue({
el:"#app",
data:{},
methods:{}
});
script>
html>
相比起全局组件,局部组件只能在同一个实例内才能被调用。局部组件的写法和全局组件差不多。 唯
一不同就是:局部组件要写在Vue实例里面。
语法格式:
new Vue({
el: "#app",
components: {
组件名: {
// 组件结构
template: "HTML代码",
// data数据
data() { return { msg:"xxxx" };},
},
},
});
注意:
创建局部组件,注意 components,注意末尾有 ‘s’,而全局组件是不用+ ‘s’ 的。这意味着,
components 里可以创建多个组件。
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<web-msg>web-msg>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{},
components:{
"web-msg":{
template:"{{msg1}}
{{msg2}}
",
data(){
return{
msg1:"开发中。。。",
msg2:"开发结束。。。"
};
}
}
}
});
script>
html>
由于把html语言写在组件里面很不方便,也不太好看所以将它们分开写。
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<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",
data:{},
components:{
"web-msg":{
template:"#t1",
data(){
return{
msg:"点击查询"
};
},
methods:{
show(){
alert("正在查询中。。。");
}
}
}
}
});
script>
html>
总结:
每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期
了解生命周期的好处:
下图展示了实例的生命周期。你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参
考价值会越来越高。
生命周期中的钩子函数
钩子函数:钩子函数是在一个事件触发的时候,在系统级捕获到了他,然后做一些操作
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<h2 id="msg">{{message}}h2>
<button @click="next">获取下一句button>
div>
body>
<script src="./js/vue.min.js">script>
<script>
var VM = new Vue({
el:"#app",
data:{
message:"遥想当年,金戈铁马"
},
methods:{
show(){
alert("show方法执行了...");
},
next(){
this.message = "气吞万里如虎";
}
},
beforeCreate() {
alert("1.beforeCreate函数,在Vue对象实例化之前执行");
console.log(this.message);
this.show();
},
created() {
alert("2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成");
console.log(this.message);
this.show();
},
beforeMount() {
alert("3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中");
console.log("页面显示的内容" + document.getElementById("msg").innerText);
console.log("data中的message数据是: " + this.message);
},
mounted() {
alert("4.mounted函数执行时,模板已经渲染到页面,执行完页面显示");
console.log("页面显示的内容" + document.getElementById("msg").innerText);
console.log("data中的message数据是: " + this.message);
},
beforeUpdate() {
alert("5.beforeUpdate执行时,内存中的数据已更新,但是页面尚未被渲染");
console.log("页面显示的内容:" + document.getElementById("msg").innerText);
console.log("data中的message数据是: " + this.message);
},
updated() {
alert("6.updated执行时,内存中的数据已更新,此方法执行完显示页面!");
console.log("页面显示的内容:" + document.getElementById("msg").innerText);
console.log("data中的message数据是: " + this.message);
},
});
script>
html>
在Web开发中,路由是指根据URL分配到对应的处理程序。 路由允许我们通过不同的 URL 访问不同的
内容。
通过 Vue.js 可以实现多视图单页面web应用(single page web application,SPA)
百度百科
单页面Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。
单页应用不存在页面跳转,它本身只有一个HTML页面。我们传统意义上的页面跳转在单页应用的概
念下转变为了 body 内某些元素的替换和更新,举个例子:
整个body的内容从登录组件变成了欢迎页组件, 从视觉上感受页面已经进行了跳转。但实际上,页面
只是随着用户操作,实现了局部内容更新,依然还是在index.html 页面中。
单页面应用的好处:
①用户操作体验好,用户不用刷新页面,整个交互过程都是通过Ajax来操作。
②适合前后端分离开发,服务端提供http接口,前端请求http接口获取数据,使用JS进行客户端渲染。
1.Vue.js 路由需要载入 vue-router 库
//方式1: 本地导入
<script src="vue-router.min.js">script>
//方式2: CDN
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
2.使用步骤
①定义路由所需的组件
②定义路由 每个路由都由两部分 path (路径) 和component (组件)
③创建router路由器实例 ,管理路由
④创建Vue实例, 注入路由对象, 使用$mount() 指定挂载点
Vue 的$mount()为手动挂载,在项目中可用于延时挂载(例如在挂载之前要进行一些其他操作、判断等),
之后要手动挂载上。new Vue时,el和$mount并没有本质上的不同。
3.HTM代码
<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>
4.JS代码
<script src="./vue.min.js">script>
<script src="./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.创建router路由器实例,对路由对象routes进行管理.
const router = new VueRouter({
routes: routes,
});
//4.创建Vue实例, 调用挂载mount函数,让整个应用都有路由功能
const VM = new Vue({
router,
}).$mount("#app"); //$mount是手动挂载代替el
script>