• 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=" 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{
    			 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{
    			 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;
    			 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;
    			 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;
    			 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;
    			 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="#">移动客户端&nbsp;&nbsp;<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="#">微博&nbsp;&nbsp;<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="#">博客&nbsp;&nbsp;<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="#">邮箱&nbsp;&nbsp;<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>
    
  • 相关阅读:
    Ubuntu下安装、激活并配置Pycharm
    高分辨率下firefox字体和界面自动放大的问题
    Java如何根据IP获取当前定位
    WebSocket介绍和一个简单的聊天室
    java注解处理
    TCP/IP协议三次握手与四次握手流程解析
    mybatis如何做分页处理
    xshell学习笔记
    正交表生成工具 PICT 成对组合覆盖 收藏
    Ready api groovy script 参数化
  • 原文地址:https://www.cnblogs.com/weihengblog/p/9219830.html
Copyright © 2020-2023  润新知