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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM