Vue起步
Vue起步
Vue.js是什么
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式javascript框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。Vue官方视频介绍推荐观看。
起步
首先创建一个.html文件,然后通过以下方式引入Vue:
<!-- 开发环境版本,包含了用帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
或者
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
声明式渲染
Vue的核心就是通过简洁的模板语法来声明式地将数据渲染到DOM的系统中:
<div id="app">
<h2>{{ books }}</h2>
</div>
const app = new Vue({
el:'#app',
data:{
books:'《Vue》',
}
});
《Vue》
我们已经成功创建了第一个Vue应用!看起来这跟字符串模板非常类似。现在数据和DOM已经建立了关联,所有的东西都是响应式的。打开浏览器的 JavaScript 控制台,并修改 app.books 的值,你将看到上例相应地更新。
绑定元素特性
除了文本值的插入,我们还可以像这样来绑定元素特性:
<div id="app">
<span v-bind:title='time'>
鼠标悬停,显示信息
</span>
</div>
const app = new Vue({
el:'#app',
data:{
time: '页面加载于' + new Date().toLocaleString(),
}
})
v-bind:被称为指令,指令带有v-前缀,以表示他们是vue提供的特殊特性。v-bind:的意思是将这个元素的属性(title)特性和Vue实例time属性保持一致。
条件判断
控制切换一个元素是否显示也相当简单:
<div id="app">
<div id='block' v-if="seen" style="width: 200px;height: 200px;background-color: orange">
</div>
<button v-on:click="isShow">显示/隐藏</button>
</div>
var app = new Vue({
el : "#app",
data:{
seen:true,
},
methods:{
isShow:function() {
this.seen = !this.seen;
}
}
});
通过该示例,我们不仅可以把数据绑定到DOM元素的文本和属性,还可以绑定到DOM的结构
循环
<div id="app">
<ul>
<li v-for="book in books">
{{ book }}
</li>
</ul>
<hr>
<ul>
<li v-for="(todo,index) in todos">
{{ index+1 }} - {{ todo.text }}
</li>
</ul>
</div>
var app = new Vue({
el:"#app",
data:{
books:["python","java","c++","c#","c"],
todos:[
{ text: '学习 JavaScript' },
{ text: '学习 Vue' },
{ text: '整个牛项目' }
]
}
});
通过v-for,我们可以绑定数据数据来渲染一个项目的列表。
事件监听
通过v-on来实现用户和应用的交互。
<div id="app">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">逆转消息</button>
</div>
const app = new Vue({
el : "#app",
data:{
message:"Hello Vue",
},
methods:{
reverseMessage:function (argument) {
this.message = this.message.split('').reverse().join('');
}
}
});
在reverseMessage方法中,我们更新了应用的状态,但没有触碰DOM---所有的DOM操作都有Vue去处理,我们只需要关注逻辑层面即可
处理用户输入
<div id="app">
<p>{{ message }}</p>
<input v-model="message">
</div>
const app = new Vue({
el : "#app",
data:{
message:"Hello Vue",
},
});
总结
模板语法
- 文本-数据绑定 {{ message }}
- JavaScript 表达式 {{ 1+1 }}/{{ ok ? 'YES' : 'NO' }}
- 元素属性绑定 v-bind 缩写一个冒号:
- 事件监听 v-on 缩写@
- Focusing on what is best for the community
- Showing empathy towards other community members
附赠小案例
轮播图
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>轮播图</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://unpkg.com/vue"></script>
<style type="text/css">
*{
background-color: #ccc;
}
#app{
width: 100%;
margin: 0 auto;
}
.red{
color: red;
}
</style>
</head>
<body>
<div id="app">
<img :src="nowImg" width="280px" height="165px" style="border-radius: 10px;">
<ul>
<li :class="{ red:index==count }" v-for="(img,index) in images" @click="changeImg(index)">
{{ index+1 }}
</li>
</ul>
</div>
</body>
<script type="text/javascript">
const app = new Vue({
el:"#app",
data:{
isActive:true,
count:0,
nowImg:'img/google.png',
images:[
{img:'img/google.png'},
{img:'img/facebook.png'},
{img:'img/youtube.png'},
{img:'img/gmail_custom.png'},
]
},
methods:{
changeImg:function (index) {
this.count = index;
this.nowImg = this.images[index].img;
},
}
});
</script>
</html>
仿新浪导航条
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://unpkg.com/vue"></script>
<link rel="stylesheet" type="text/css" href="lib/font-awesome-4.7.0/css/font-awesome.min.css">
<style>
*{
margin: 0;
padding: 0;
}
.orange{
color: orange;
}
.header{
width: 1000px;
margin: 0 auto;
height: 40px;
border-bottom: 1px solid #ccc;
}
.header-left{
list-style: none;
position: relative;
}
.header-left .li-left{
text-align: center;
font-size: 12px;
line-height: 40px;
float: left;
margin-right: 20px;
}
.header a{
display: block;
color: #333;
text-decoration: none;
width: 100%;
height: 40px;
padding: 0px 5px;
}
.header a:hover{
background-color: #eee;
color: orange;
}
.header .phone-client{
position: relative;
text-align: center;
font-size: 12px;
line-height: 40px;
float: left;
margin-right: 20px;
}
ul{
list-style: none;
}
.phone-client-menu li a{
padding: 0px 4px;
border: 1px solid #ddd;
border-top: none;
}
.phone-client-menu li{
text-align: center;
}
.isHidden{
display: none;
}
.header-right{
float: right;
margin-right: 0px;
}
.header-right{
list-style: none;
}
.header-right .li-left{
text-align: center;
font-size: 12px;
line-height: 40px;
float: left;
margin-right: 20px;
}
.weibo{
position: relative;
}
.weibo .weibo-menu{
padding: 0;
margin:0;
position: absolute;
width: 70px;
text-align: center;
}
.weibo .weibo-menu a{
padding: 0px 4px;
border: 1px solid #ddd;
border-top: none;
}
.blog{
position: relative;
}
.blog .blog-menu{
padding: 0;
margin:0;
position: absolute;
width: 70px;
text-align: center;
}
.blog .blog-menu a{
padding: 0px 4px;
border: 1px solid #ddd;
border-top: none;
}
.email{
position: relative;
}
.email .email-menu{
padding: 0;
margin:0;
position: absolute;
width: 70px;
text-align: center;
}
.email .email-menu a{
padding: 0px 4px;
border: 1px solid #ddd;
border-top: none;
}
</style>
</head>
<body>
<div class="header" id="header">
<ul class="header-left">
<li class="li-left"><a href="#">设置为首页</a></li>
<li class="li-left"><a href="#">手机新浪网</a></li>
<li class="phone-client" @mouseover="showElement('phone')" @mouseout="hiddenElement('phone')" ><a href="#">移动客户端 <i class="fa fa-angle-down orange" @mouseout="hiddenElement('phone')"></i></a>
<div class="phone-client-menu" v-show="phone" >
<ul>
<li><a href="">新浪微博</a></li>
<li><a href="">新浪新闻</a></li>
<li><a href="">新浪体育</a></li>
<li><a href="">新浪娱乐</a></li>
</ul>
</div>
</li></ul>
<ul class="header-right">
<li class="li-left"><a href="#">登陆</a></li>
<li class="li-left weibo" @mouseover="showElement('weibo')" @mouseout="hiddenElement('weibo')"><a href="#">微博 <i class="fa fa-angle-down orange"></i></a>
<div class="weibo-menu" @mouseover="showElement('weibo')" v-show="weibo" @mouseout="hiddenElement('weibo')">
<ul>
<li><a href="">私信</a></li>
<li><a href="">评论</a></li>
<li><a href="">@我</a></li>
</ul>
</div>
</li>
<li class="li-left blog" @mouseover="showElement('blog')" @mouseout="hiddenElement('blog')"><a href="#">博客 <i class="fa fa-angle-down orange"></i></a>
<div class="blog-menu" @mouseover="showElement('blog')" v-show="blog" @mouseout="hiddenElement('blog')">
<ul>
<li><a href="">博客评论</a></li>
<li><a href="">博客提醒</a></li>
</ul>
</div>
</li>
<li class="li-left email" @mouseover="showElement('email')" @mouseout="hiddenElement('email')"><a href="#">邮箱 <i class="fa fa-angle-down orange"></i></a>
<div class="email-menu" @mouseover="showElement('email')" v-show="email" @mouseout="hiddenElement('email')">
<ul>
<li><a href="">免费邮箱</a></li>
<li><a href="">VIP邮箱</a></li>
<li><a href="">企业邮箱</a></li>
</ul>
</div>
</li>
<li class="li-left"><a href="">网站导航</a></li>
</ul>
</div>
</body>
<script type="text/javascript">
const app = new Vue({
el :'#header',
data:{
isHidden:false,
phone:false,
weibo:false,
blog:false,
email:false,
},
methods:{
showElement:function(argument) {
switch(argument){
case 'phone':this.phone = true;
break;
case 'weibo':this.weibo = true;
break;
case 'blog':this.blog = true;
break;
case 'email':this.email = true;
break;
}
},
hiddenElement:function (argument) {
switch(argument){
case 'phone':this.phone = false;
break;
case 'weibo':this.weibo = false;
break;
case 'blog':this.blog = false;
break;
case 'email':this.email = false;
break;
}
}
}
});
</script>
</html>
仿新浪tab选项卡
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>组件</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://unpkg.com/vue"></script>
<link rel="stylesheet" type="text/css" href="tab.css">
</head>
<body>
<div id="app">
<div class="header">
<ul>
<li v-for="(item,index) in items" @mouseover="showContent(index)">
<a href="">{{ item.item }}</a>
</li>
</ul>
</div>
<div class="content">
{{ content }}
</div>
</div>
</body>
<script>
var app = new Vue({
el:"#app",
data:{
content:"图片",
items:[
{item:'图片'},
{item:'专栏'},
{item:'热点'},
],
},
methods:{
showContent:function(index) {
switch(index){
case 0:
this.content = "图片"
break;
case 1:
this.content = "专栏"
break;
case 2:
this.content = "热点"
break;
}
}
}
})
</script>
</html>