Vue.js基础语法(一)

vue学习的一系列,全部来自于表哥---表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206

前言:

前端解析数据更好,因为更灵活,且用户体验更好,还能节省服务器资源。

“指哪打哪”,用到了才去取,有点类似分片加载。

但是也有不好的地方,如果是稍微大一点复杂一点的项目,开发的压力较大,更麻烦,像表单验证这种。还有路由,放在前端会更复杂,但是省资源。

原生js就能做到前端渲染,但是开发成本太高。而vue可以低成本的实现。

Vue的特点:数据双向绑定,当数据发生改变时,自动更新视图。

 

1 vue安装

cdnwww.bootcdn.cn

  

找到vue.js可以下载下来放到项目中

  

注意不用min版本的,因为没有报错信息

  

2基本语法实例

2.1实例1

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<p>你的名字是:{{name}}</p>
		</div>
	</body>
	<script src="js/vue.js"></script>
	<script>
		var app=new Vue({
			el:'#app',
			data:{
				name:'小美女'
			}
		})
	</script>
</html>

说明:

var app=new Vue({}),建了一个vue的对象,对象中需要一些配置:

el:意思是element,用来告诉vue,这个对象和哪个元素绑定,也就是生成的对象会产生一个域,这个域是作用在哪个元素上的,例如作用在idapp的元素,就写成el’#app’

<div id="app">

<span>你的名字是:{{name}}</span>

</div>

vue会解析这种两个大括号的语法,里面的内容会当作类似js的语句来解析,例如:{{1+1}}结果是2{{typeof 1}}的结果是number,但是太复杂的解析不了,例如if语句,就会报错。

{{name}中的name就会去vue对象中的data属性中找,在vue中,所有的数据全放在data的属性中。

上面示例代码的效果:

 

两个name是怎么对应起来的,这就是vue背后的默认机制,data中所有的属性都是直接绑定到app下的,感觉就像是同步一样,再多加一些数据:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<p>你的名字是:{{name}}</p>
			<p>你的年龄是:{{age}}</p>
			<p>你的性别是:{{sex}}</p>
		</div>
	</body>
	<script src="js/vue.js"></script>
	<script>
		var app=new Vue({
			el:'#app',
			data:{
				name:'小美女',
				age:18,
				sex:null
			}
		})
	</script>
</html>

在console中直接改变数据:

  

输入app.sex='',回车,可以看到数据直接改变了:

 

这就说明,vue里面的内容是直接和内存中的数据绑定的,而不用像原来js那样,必须调用浏览器的domapi,让显示的内容改变。而vue会自动改变,这样可以极大的提高开发效率,和程序的运行性能。

2.2实例2-直接用input改变

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div id="app">
			<p><input type="text" v-model="name"> 你的名字是:{{name}}</p>
			<p><input type="text" v-model="age"> 你的年龄是:{{age}}</p>
			<p><input type="text" v-model="sex"> 你的性别是:{{sex}}</p>
		</div>
	</body>
	<script src="js/vue.js"></script>
	<script>
		var app=new Vue({
			el:'#app',
			data:{
				name:'小美女',
				age:18,
				sex:null
			}
		})
	</script>
</html>

v-modelvue定义的属性,在vue中叫“指令”,也可以自定义指令,v-model作用是把当前input中的值指到哪里,改变input的值,那么后面跟着的文字也会相应的改变

 

想实现:当没有输入值(值为null)时,后面的文字不显示,

两种方式:

<span v-show="sex">你的性别是:{{sex}}</span>

<span v-if="sex">你的性别是:{{sex}}</span>

Showif的区别:

v-if是动态的向DOM树内添加或者删除DOM元素;v-show是通过设置DOM元素的display样式属性控制显隐

完整示例代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <p><input type="text" v-model="name"> <span v-if="name">你的名字是:{{name}}</span></p>
            <p><input type="text" v-model="age"> <span v-if="age">你的年龄是:{{age}}</span></p>
            <p><input type="text" v-model="sex"> <span v-if="sex">你的性别是:{{sex}}</span></p>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                name:null,
                age:null,
                sex:null
            }
        })
    </script>
</html>

3 v-for指令

专门用于迭代的指令,例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <ul>
                <li v-for="food in foodList">{{food.name}}:¥{{food.discount?food.price * food.discount:food.price}}</li>
            </ul>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                foodList:[
                    {
                        name:'香蕉',
                        price:3,
                        discount:0.5 //折扣
                    },
                    {
                        name:'苹果',
                        price:5,
                        discount:0.7
                    },
                    {
                        name:'草莓',
                        price:10                        
                    }
                ]
            }
        })
    </script>
</html>

 

v-for="food in foodList"food是每一项,任意定义,相当于一个变量,foodList是迭代的目标,在data中定义的。

4 v-bind指令

用于绑定数据和元素属性的,格式:v-bind:属性名="变量",变量是定义在data中的

示例,可以绑定链接、图片urlclass都可以

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-bind</title>
        <style>
            .myclass{background: hotpink;color: #fff;text-decoration: none;}
        </style>
    </head>
    <body>
        <div id="app">
            <p><a v-bind:class="linkclass" v-bind:href="url">点击</a></p>
            <img v-bind:src="img">    
            
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                url:'https://hao.360.cn/?installer',
                img:'index-2.png',
                linkclass:'myclass'
                
            }
        })
    </script>
</html>

想实现某个class在特定情况才起作用:

v-bind:class="{myclass:isActive}"

大括号中:键名是要添加的类,值是条件(什么情况下加载这个类)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-bind</title>
        <style>
            .myclass{background: hotpink;color: #fff;text-decoration: none;}
        </style>
    </head>
    <body>
        <div id="app">
            <p><a v-bind:class="linkclass" v-bind:href="url">点击</a></p>
            <img v-bind:src="img">    
            <p><span v-bind:class="{myclass:isActive}">动态的class</span></p>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                url:'https://hao.360.cn/?installer',
                img:'index-2.png',
                linkclass:'myclass',
                isActive:true
            }
        })
    </script>
</html>

 

当设成:isActive:false时:

 

通常,v-bind可以省略,只写一个冒号就可以:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-bind</title>
        <style>
            .myclass{background: hotpink;color: #fff;text-decoration: none;}
        </style>
    </head>
    <body>
        <div id="app">
            <p><a :class="linkclass" :href="url">点击</a></p>
            <img :src="img">    
            <p><span :class="{myclass:isActive}">动态的class</span></p>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                url:'https://hao.360.cn/?installer',
                img:'index-2.png',
                linkclass:'myclass',
                isActive:true
            }
        })
    </script>
</html>

5 v-on指令

用于绑定事件,例如点击事件,v-on:click="onClick"onClick是自定义的一个方法,如果有参数可以写成v-on:click="onClick(参数,参数...)",方法要定义在methods中,例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-on</title>
    </head>
    <body>
        <div id="app">
            <button v-on:click="onClick">点击</button>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                
            },
            methods:{
                onClick:function(){
                    console.log("点击了")
                }
            }
        })
    </script>
</html>

可以给一个元素绑定多个事件,那么v-on就可以定义一个对象,键是事件名称,值是方法名称,但是注意,方法必须在methods中定义了,不然会报错,例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-on</title>
    </head>
    <body>
        <div id="app">
            <button v-on:click="onClick">点击</button>
            <button v-on="{mouseenter:onEnter,mouseleave:onOut}">鼠标移入移出</button>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                
            },
            methods:{
                onClick:function(){
                    console.log("点击了");
                },
                onEnter:function(){
                    console.log("鼠标移入");
                },
                onOut:function(){
                    console.log("鼠标移出");
                }
            }
        })
    </script>
</html>

表单中,

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-on</title>
    </head>
    <body>
        <div id="app">            
            <form v-on:submit="onSubmit">
                <input type="text" name="user" placeholder="输入内容">
                <input type="submit" value="提交">
            </form>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                
            },
            methods:{                
                onSubmit:function(){
                    console.log("表单提交");
                }
            }
        })
    </script>
</html>

这样会刷新页面,可以改为:

 

就不会刷新了,

这个功能vue进行了封装:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-on表单提交不刷新页面</title>
    </head>
    <body>
        <div id="app">            
            <form v-on:submit.prevent="onSubmit">
                <input type="text" name="user" placeholder="输入内容">
                <input type="submit" value="提交">
            </form>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                
            },
            methods:{                
                onSubmit:function(){                    
                    console.log("表单提交");
                }
            }
        })
    </script>
</html>

v-on:submit.stop是停止冒泡事件

键盘事件也封装了,例如v-on:keyup.enter,是敲回车,

v-on:也是可以省略的,只写一个@就可以,

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-on表单提交不刷新页面</title>
    </head>
    <body>
        <div id="app">            
            <form @submit.prevent="onSubmit" @keyup.enter="onEnter">
                <input type="text" name="user" placeholder="输入内容">
                <input type="submit" value="提交">
            </form>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                
            },
            methods:{                
                onSubmit:function(){                    
                    console.log("表单提交");
                },
                onEnter:function(){                    
                    console.log("回车");
                },
            }
        })
    </script>
</html>

6 v-model指令

6.1 v-model修饰符

常用,基本上所有用户的输入都要通过v-model,好用、安全、功能强大

1)lazy惰性更新

在文本框输入时,不会更新,只有失去焦点时,才更新,这样会稍微提高一点性能。实际上是触发了一个change事件。

这个的好处是,只有当用户输入结束了,才绑定,才会显示表单验证的结果;用户输入过程中,不去打扰用户,这样用户体验更好

2)trim

将用户输入的值,前后空格全部去掉,用户名可以用,密码不要用,有时用户可能就用空格做密码

3number

数字类型。之前表单输入,无论输什么,得到的都是字符串,用到数字的地方需要转换,加了number就会自动转换成number类型了

tips:同时绑定多个修饰符,用链式写法就可以

例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-mode</title>
    </head>
    <body>
        <div id="app">
            <p>1.lazy示例(失去焦点时才显示信息):<input type="text" v-model.lazy="name"> 提示:{{name}}</p>
            <div>2.trim去掉两端空格:<input type="text" v-model.trim="con"> <pre>提示:{{con}}</pre></div>
            <p>3.number示例:<input type="text" v-model.number="age" placeholder="输入年龄"> 输入的数据类型为:{{typeof age}}</p>
            <p>4.同时绑定多个修饰符:<input type="text" v-model.lazy.trim.number="num"> 输入的数据类型为:{{typeof num}},输入的值为:{{num}}</p>
            
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                name:null,
                con:null,
                age:null,
                num:null
            }
        })
    </script>
</html>

6.2 v-model在其他表单元素上的用法

1)单选按钮

把传统写法的name改成v-model

2)复选框

绑定的数据是数组。这样选中的项会自动插入到数组中

3)textareatext是一样的

4)Select

select上加v-modeldata中的值就是optionvalue,多选就是数组

例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-model</title>
        <style>
            .box{border-bottom: 1px solid #ccc;}
        </style>
    </head>
    <body>
        <div id="app">
            <div class="box">
                <p>
                    <label><input type="radio" value="male" v-model="sex"></label>
                    <label><input type="radio" value="female" v-model="sex"></label>
                </p>
                <p>{{sex}}</p>
            </div>
            <div class="box">
                <p>
                    <label><input type="checkbox" value="male" v-model="orientation"></label>
                    <label><input type="checkbox" value="female" v-model="orientation"></label>
                </p>
                <p>{{orientation}}</p>
            </div>
            <div class="box">
                <p>来自哪里:
                    <select v-model="froms">
                        <option value ="1">地球</option>
                        <option value ="2">火星</option>
                    </select>
                </p>
                <p>{{froms}}</p>
            </div>            
            <div class="box">
                <p>要去哪里:
                    <select v-model="dest" multiple>
                        <option value ="1">地球</option>
                        <option value ="2">火星</option>
                        <option value ="3">月球</option>
                    </select>
                </p>
                <p>{{dest}}</p>
            </div>
            
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                sex:'female',
                orientation:['male'],
                froms:1,
                dest:['1']
            }
        })
    </script>
</html>

7控制流指令

ifelseelse if

很简单,就在v-if中写条件,data中控制条件

例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>v-if</title>
    </head>
    <body>
        <div id="app">
            <div v-if="role=='admin' || role=='super'">
                管理员你好
            </div>
            <div v-else-if="role=='hr'">
                HR您好
            </div>
            <div v-else>
                您没有权限访问此页面
            </div>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                role:'admin'
            }
        })
    </script>
</html>

role改成super,效果一样;

改成hr

 

改成其他值,

 

8计算属性

把计算的过程存到计算属性computed里,computed里面属性的值全是function

计算当然也可以写在methods里,但是写在computed的好处是会缓存下来,所以这种涉及到计算的就单独写computed里。

例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>计算</title>
        <style type="text/css">
            table{border-collapse: collapse;}
            td,th{border: 1px solid #ccc;padding: 10px;}
        </style>
    </head>
    <body>
        <div id="app">
            <table>
                <tr>
                    <th>学科</th>
                    <th>分数</th>
                </tr>
                <tr>
                    <td>数学</td>
                    <td><input type="text" v-model.number="math"></td>
                </tr>
                <tr>
                    <td>语文</td>
                    <td><input type="text" v-model.number="chinese"></td>
                </tr>
                <tr>
                    <td>英语</td>
                    <td><input type="text" v-model.number="english"></td>
                </tr>
                <tr>
                    <td>总分</td>
                    <td>{{sum}}</td>
                </tr>
                <tr>
                    <td>平均分</td>
                    <td>{{average}}</td>
                </tr>
            </table>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var app=new Vue({
            el:'#app',
            data:{
                math:0,
                chinese:0,
                english:0
            },
            computed:{
                sum:function(){
                    return this.math+this.chinese+this.english;
                },
                average:function(){
                    return Math.round(this.sum/3);
                }
            }
        })
    </script>
</html>

原文地址:https://www.cnblogs.com/hzhjxx/p/10723763.html