Vue基礎(chǔ)知識(shí)

Vue簡(jiǎn)介

動(dòng)態(tài)構(gòu)建用戶界面的漸進(jìn)式 JavaScript 框檐晕,遵循 MVVM 模苛败。
MVVM 是Model-View-ViewModel的簡(jiǎn)寫(xiě)娘荡,Model也就是Vue中的data茸塞,而View是視圖也就是標(biāo)簽頁(yè)面碳锈,VM就是Vue中用于關(guān)聯(lián)View與data的代碼缕碎,方法,回調(diào)等等,也就是Vue

Vue特點(diǎn) --響應(yīng)式

響應(yīng)式的原理是數(shù)據(jù)代理,可以見(jiàn)文章數(shù)據(jù)代理中會(huì)詳細(xì)說(shuō)明炒瘟。
簡(jiǎn)單說(shuō)明就是:在數(shù)據(jù)變化時(shí)可以被檢測(cè)并對(duì)這種變化做出響應(yīng)的機(jī)制,網(wǎng)頁(yè)相關(guān)聯(lián)數(shù)據(jù)數(shù)據(jù)會(huì)跟著變化

Vue 簡(jiǎn)單示例

<!DOCTYPE>
<html>
    <head>
        <title>Vue學(xué)習(xí)測(cè)試</title>
        <script src="js/v2.6.10/vue.js"></script>
    </head>
    <body>
        <div id="root">
            <p>{{tittle}}</p><br />
            <p>{{studentName}}</p><br />
            <button @click="clickButton()" >點(diǎn)擊</button>
            
        </div>
        <script>
            const vm=new Vue({
                
                el:"#root",
                data:{
                    tittle:"測(cè)試Vue插值 指令 計(jì)算屬性",
                    studentName:"點(diǎn)擊前姓名"
                },
                filters: {
                    fnName: function(value) {
                        return value;
                    }
                }
                methods:{
                    clickButton(){
                        this.studentName='點(diǎn)擊后姓名'
                    }
                    
                },
                computed: {
                    name() {
                        return this.data 
                    }
                },
                watch: {
                    data(newValue, oldValue) {
                        
                    }
                },
                
            });
            
        </script>
        
    </body>
</html>

el的兩種寫(xiě)法:

el的功能是

  • 指定一個(gè)頁(yè)面上已存在的 DOM 元素作為 Vue 實(shí)例的掛載目標(biāo)第步;
  • 也就是指定Vue中的方法和數(shù)據(jù)與哪個(gè)DOM元素進(jìn)行交互疮装。

寫(xiě)法1:

通過(guò)初始化 new Vue() 通過(guò)配置屬性el屬性通過(guò)CSS選擇器指定具體DOM元素 例如el:"#root",
在實(shí)例化的同時(shí)進(jìn)行掛載

寫(xiě)法2:

通過(guò)方法vm.$mount()進(jìn)行掛載,可以先初始化Vue實(shí)例然后選怎特定時(shí)機(jī)掛載到特定的DOM元素
示例: vm.$mount("#root"); 參數(shù)為CSS選擇器指定DOM元素

Vue中的data的兩種寫(xiě)法

  • 對(duì)象式(不推薦)
  • 函數(shù)式
    示例:
const vm= new Vue({
        data:function(){
                       return {
                     insertMessage:"1111",
                         }  
                         },  
                  });

模板語(yǔ)法

什么是模板粘都?廓推??
模板是將一個(gè)事物的結(jié)構(gòu)規(guī)律予以固定化翩隧、標(biāo)準(zhǔn)化的成果樊展,它體現(xiàn)的是結(jié)構(gòu)形式的標(biāo)準(zhǔn)化。
什么是語(yǔ)法
所謂「語(yǔ)法」堆生,就是「語(yǔ)言的規(guī)律」专缠,是觀察、分析實(shí)際語(yǔ)言現(xiàn)象之后人為總結(jié)出來(lái)的規(guī)律淑仆。而不是「語(yǔ)言的法律」涝婉,不是語(yǔ)法學(xué)家指定的普通人必須遵守的語(yǔ)言的法條。

Vue模板語(yǔ)法就是Vue規(guī)定(程序支持)用戶可以使用的基本指令糯景,就是Vue已經(jīng)寫(xiě)好可以直接使用的命令或指令

Vue模板語(yǔ)法簡(jiǎn)介:

-插值語(yǔ)法
-指令語(yǔ)法

插值語(yǔ)法說(shuō)明:

語(yǔ)法示例:

<p>{{差值表達(dá)式}}</p>

采用雙大括號(hào)的形式嘁圈,用于將內(nèi)容(js表達(dá)式)插入到標(biāo)簽體內(nèi),{{}}內(nèi)部的為JS表達(dá)式蟀淮,可以直接使用(引用)Vue實(shí)例中的屬性(data中的數(shù)據(jù))最住,方法。

指令語(yǔ)法

指令語(yǔ)法是指已V-開(kāi)頭的怠惶,Vue定制的語(yǔ)法涨缚。寫(xiě)特定語(yǔ)法,具有特定功能,該語(yǔ)法會(huì)在Vue編譯的時(shí)候轉(zhuǎn)化為特定功能的js代碼脓魏。

內(nèi)置指令:

v-text v-html文本指令語(yǔ)法

v-text 通過(guò)綁定內(nèi)容兰吟,替換標(biāo)簽的所有標(biāo)簽體(標(biāo)簽不被解析)

v-html 綁定可以解析html文件,但是容易被XXS攻擊茂翔。

v-pre指令 跳過(guò)Vue編譯指令

-可以跳過(guò)所在節(jié)點(diǎn)的Vue的編譯過(guò)程
-可以利用它跳過(guò):沒(méi)有使用指令的語(yǔ)法混蔼,沒(méi)有使用插值語(yǔ)法的節(jié)點(diǎn),會(huì)加快編譯珊燎。

v-cloak 防閃爍指令

作用就是用來(lái)解決瀏覽器在加載頁(yè)面時(shí)因存在事件差而產(chǎn)生的閃動(dòng)問(wèn)題惭嚣,她的原理是先隱藏文件掛載位置,處理渲染好后在顯示最終結(jié)果悔政。這個(gè)指令需要與css規(guī)則一起使用才可以

方法:在 html 中的加載點(diǎn)加上 v-cloak

<ul v-cloak v-for="item in obj">
 
     <li>{{ obj.name }}</li>
 
</ul>
//然后在css中添加
//解釋:包含 v-cloak 屬性的 html 標(biāo)簽在頁(yè)面初始化時(shí)會(huì)被隱藏晚吞。
<style>
[v-cloak] {
     display: none;
}
</style>

Vue條件渲染 顯示與隱藏

標(biāo)簽的顯示與隱藏

  • v-if
  • v-show

v-if

 寫(xiě)法 
1 v-if=''表達(dá)式"
2 v-else-if="表達(dá)式"
3 v-else="表達(dá)式"

適用于切換頻率低的場(chǎng)景:
特點(diǎn):不展示DOM元素直接被刪除
注意:v-if v-else-if v-else 一起組合使用。

v-show

  寫(xiě)法 v-show="表達(dá)式"
  適用于切換頻率比較高的場(chǎng)景
  特點(diǎn):不顯示DOM元素未被移除谋国,僅僅是隱藏掉槽地。

使用v-if隱藏時(shí)候無(wú)法獲取DOM元素,v-show可以芦瘾。

v-bind--數(shù)據(jù)綁定

v-bind:屬性名 (或v-model)為元素的屬性與js表達(dá)式相綁定捌蚊。
例如v-bind:scr="js表達(dá)式" 簡(jiǎn)寫(xiě)方式 :src="js表達(dá)式"

綁定class樣式:字符串寫(xiě)法

<template>
    //綁定class樣式:字符串寫(xiě)法,適用于:樣式的類名不確定,需要?jiǎng)討B(tài)指定
    <view class="basic" :class="mood" @click="changeMood">{{name}}</view>
    //綁定class樣式:數(shù)組寫(xiě)法,適用于:要綁定的樣式個(gè)數(shù)不確定旅急,名字也不確定
    <view class="basic" :class="classArr">{{name}}</view>
    //綁定class樣式:對(duì)象寫(xiě)法,適用于:要綁定的樣式個(gè)數(shù)確定逢勾,名字也確定,但要?jiǎng)討B(tài)決定用不用
    <view class="basic" :class="classObj">{{name}}</view>
</template>
<script>
export default {
    data() {
        return {
            name:"class樣式綁定",
            mood:'normal',
            classArr:["a","b","c"],//這樣寫(xiě)便于對(duì)數(shù)組的增刪改查藐吮,動(dòng)態(tài)切換
            classObj:{a:false,b:false}//這樣寫(xiě)便于動(dòng)態(tài)切換
        };
    },
    methods: {
        changeMood() {
        //定義一個(gè)數(shù)組,用來(lái)改變樣式的切換,利用數(shù)組的生成隨機(jī)數(shù)函數(shù)實(shí)現(xiàn)
        const arr = ['happy','sad','normal']逃贝;
        this.mood = arr[Math.floor(Math.random()*3)]//Math.random():0~1的隨機(jī)數(shù)谣辞,不包含1
        }
    }
}
</script>
<style>
.basic{
        width:500px;
        height:200px;
        border:1px solid black;
    }
    
.happy{
        border:5px solid red;
        background-color: rgba(255,255,0,0.644);
        background: linear-gradient(30deg,yellow,pink,orange,yellow);
    }
    
.sad{
    border:5px solid rab(2,197,2);
    background-color: gray;
    }
    
.normal{
        background: #1382f8;
    }
    
.a{
        background: #8B008B;
    }
    
.b{
        font-size:30px;
        text-shadow:2px 2px 10px red
    }
    
.c{
        border-radius:20px
    }
</style>

綁定Sytle樣式


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>綁定樣式</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
    <!--  綁定 style 樣式 數(shù)組寫(xiě)法  -->
    <div class="basic" :style="{fontSize:size+'px'}">{{name}}5</div>
    <div class="basic" :style="[styleObj,styleObj2]">你好</div>
</div>
</body>

<script type="text/javascript">
    new Vue({
        el: '#root',
        data: {
            styleObj: {
                fontSize: '40px',
                color: 'red',
            },
            styleObj2: {
                backgroundColor: 'blue'
            }
        },
    })
</script>
<style>
    .basic {
        height: 100px;
        width: 100px;
    }
</style>
</html>

全局自定義指令

以V-開(kāi)頭都是Vue給我們寫(xiě)好的指令,我們也可以自定義自己的指令沐扳,指令本質(zhì)是js代碼的合集代表泥从。
通過(guò) Vue.[directive]( id, [definition] )方式注冊(cè)全局指令。然后在入口文件中進(jìn)行 Vue.use() 調(diào)用

函數(shù)式

1.自定義指令 沪摄,在對(duì)應(yīng)方法內(nèi)寫(xiě)入原生JS代碼

<!DOCTYPE>
<html>              
    <head>
        <title> vue 自定義指令</title>
        <script src="js/v2.6.10/vue.min.js"></script>
    </head>
    <body>
        <div id="root">
            <!-- 自定義指令不能用大駝峰的命名方式躯嫉,要使用-進(jìn)行分割 -->
            <p v-myorder='msg'>123</p>
            <p v-my-text-order='msg'>123</p>
            <button @click="changeMsg">點(diǎn)擊更改msg內(nèi)容</button>
        </div>
        <script>
            const vm=new Vue({
                data() {
                    return {
                        msg: "開(kāi)始測(cè)試"
                    }
                },
                methods:{
                    changeMsg(){
                        this.msg=this.msg+"123";
                        
                    }
                },
                //自定義指令方法模式,需要以directives屬性進(jìn)行定義
                directives: {
                    //定義方法與指令對(duì)應(yīng)
                    //自定義標(biāo)簽方法在:標(biāo)簽與指令綁定的時(shí)候被調(diào)用杨拐、指令說(shuō)在模板被重新解析的時(shí)候祈餐。
                    //如果使用-分割的時(shí)候方法要使用雙引號(hào)闊
                    "my-text-order"(element,msg){
                        element.innerText=msg.value+"自定義命名方式";
                        
                    },
                    myorder(element,msg){
                        element.innerText=msg.value+"自定義指令";
                        
                    }
                    
                }
                
                
            });
            vm.$mount("#root");
            
        </script>
    </body>
</html>

對(duì)象式

<div id="root">
        <button @click="n++">點(diǎn)擊進(jìn)行自增</button>
        <input type="text" v-fbind:value="n">
        <!-- 自定義的一個(gè)fbind指令名 ,注意必須是小寫(xiě)-->
    </div>
    <script src="./vue.js"></script>
    <script>
        const vm = new Vue({
            el:"#root",
            data:{
                n:1,
            },
            directives:{
                //directives 里面可以存放自定義指
                //對(duì)象式寫(xiě)法哄陶,可以分步寫(xiě)
                fbind:{
                    //指令與元素綁定的時(shí)候(一上來(lái)時(shí)候)
                    bind(element,binding){
                        element.value = bingding.value;
                    },
                    //指令所在元素插入頁(yè)面的時(shí)候
                    inserted(element,binding){
                        element.focus()//獲取焦點(diǎn)
                    },
                    //指令所在模板被重新解析時(shí)候(data數(shù)據(jù)發(fā)生改變帆阳,則會(huì)重新解析)
                    update(element,binding){
                        element.value = binding.value;
                    }
                }
            }
        })
    </script>

v-on 事件綁定

為控件綁定事件:

1.通過(guò)v-on:XX或者@XXX 綁定事件,其中XXX為事件名稱
2.事件回調(diào)需要配置在Vue配置想的methods對(duì)象中屋吨,最后會(huì)在vm上.
3.methods中配置的函數(shù)蜒谤,不要使用箭頭函數(shù)山宾,否則this就不是vm實(shí)例了。
4.methods中配置函數(shù)鳍徽,都是被Vue管理的函數(shù)资锰,this的指向是vm或組件實(shí)例對(duì)象
5.@clik="demo"@click="demo($event)"效果一致,或者可以傳遞參數(shù)
傳參數(shù)實(shí)例:
@click="demo($event阶祭,參數(shù)1绷杜,參數(shù)2)

事件修飾符

1、prevent:阻止默認(rèn)事件

2胖翰、stop:阻止事件冒泡

3接剩、once:事件只觸發(fā)一次

5.se1f:事件觸發(fā)事件,只有event.target是元素的當(dāng)前操作:

示例:
<template>
  <div @click="clickEvent('out')">
    <button @click.stop="clickEvent('in')">點(diǎn)擊</button>
  </div>
</template>
<script lang="ts">
export default {
  methods: {
    clickEvent(e) {
      console.log(e);
        //不使用.stop萨咳,點(diǎn)擊 button 會(huì)輸出 in 和 out
        //使用.stop懊缺,點(diǎn)擊button 只會(huì)輸出 in
    },
  },
};
</script>

鍵盤(pán)事件監(jiān)聽(tīng)

基本使用方法:

鍵盤(pán)的基本事件:

  • keydown
  • keypress
  • keyup

通過(guò) v-on 在監(jiān)聽(tīng)鍵盤(pán)事件時(shí)添加按鍵修飾符

1、Vue 中的按鍵別名培他,按鍵修飾符:

回車 => enter
刪除 => delete (捕獲‘刪除’和‘退格’鍵)
退出 => esc
空格 => space
換行 => tab
上 => up
下 =>down
左 => left
右 => right

基本示例:
<input v-on:keyup.Alt="showtips" type="text">

2鹃两、Vue未提供別名的按鍵,

可以使用按鍵原始的 key 值 去綁定舀凛,但是需要注意轉(zhuǎn)換用短橫線命名(比如:鍵盤(pán)上的:CAPSLOCK 俊扳。就需要轉(zhuǎn)換為:caps-lock)

3、系統(tǒng)修飾鍵(用法特殊):ctrl猛遍、alt馋记、shift、meta(win鍵)

(1)配合keyup使用:按下修飾鍵的同時(shí)懊烤,再按下其他鍵梯醒,隨后釋放其他鍵,事件才會(huì)被觸發(fā)
(2)配合keydown使用:正常觸發(fā)事件腌紧。
系統(tǒng)修飾鍵
可以用如下修飾符來(lái)實(shí)現(xiàn)僅在按下相應(yīng)按鍵時(shí)才觸發(fā)鼠標(biāo)或鍵盤(pán)事件的監(jiān)聽(tīng)器茸习。

  • .ctrl
  • .alt
  • .shift
  • .meta
    Do something
    與按鍵別名不同的是,修飾鍵和 keyup 事件一起用時(shí)壁肋,事件引發(fā)時(shí)必須按下正常的按鍵号胚。換一種說(shuō)法:如果要引發(fā) keyup.ctrl,必須按下 ctrl 時(shí)釋放其他的按鍵浸遗;單單釋放 ctrl 不會(huì)引發(fā)事件猫胁。
<input @keyup.alt.67="clear">
 
<!-- 按下Alt + 釋放任意鍵觸發(fā) -->
<input @keyup.alt="other">
<!-- 按下Ctrl + enter時(shí)觸發(fā) -->
<input @keydown.ctrl.13="submit">

對(duì)于elementUI的input,我們需要在后面加上.native, 因?yàn)閑lementUI對(duì)input進(jìn)行了封裝乙帮,原生的事件不起作用杜漠。

<input v-model="form.name" placeholder="昵稱" @keyup.enter="submit">

<el-input v-model="form.name" placeholder="昵稱" @keyup.enter.native="submit"></el-input>

.exact修飾符

.exact 修飾符允許你控制由精確的系統(tǒng)修飾符組合觸發(fā)的事件。

<!-- 即使 Alt 或 Shift 被一同按下時(shí)也會(huì)觸發(fā) -->
<button v-on:click.ctrl="onClick">A</button>

<!-- 有且只有 Ctrl 被按下的時(shí)候才觸發(fā) -->
<button v-on:click.ctrl.exact="onCtrlClick">A</button>

<!-- 沒(méi)有任何系統(tǒng)修飾符被按下的時(shí)候才觸發(fā) -->
<button v-on:click.exact="onClick">A</button>

鼠標(biāo)按鈕修飾符

.left 
.right 
.middle

4、也可以使用 keyCode 去指定具體的按鍵(不推薦)

自定義指令

這些修飾符會(huì)限制處理函數(shù)僅響應(yīng)特定的鼠標(biāo)按鈕驾茴。


image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盼樟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锈至,更是在濱河造成了極大的恐慌晨缴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峡捡,死亡現(xiàn)場(chǎng)離奇詭異击碗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)们拙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)稍途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人砚婆,你說(shuō)我怎么就攤上這事械拍。” “怎么了装盯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵坷虑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我埂奈,道長(zhǎng)迄损,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任账磺,我火速辦了婚禮芹敌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垮抗。我一直安慰自己党窜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布借宵。 她就那樣靜靜地躺著,像睡著了一般矾削。 火紅的嫁衣襯著肌膚如雪壤玫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天哼凯,我揣著相機(jī)與錄音欲间,去河邊找鬼。 笑死断部,一個(gè)胖子當(dāng)著我的面吹牛猎贴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼她渴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼达址!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起趁耗,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沉唠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后苛败,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體满葛,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年罢屈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘀韧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缠捌,死狀恐怖锄贷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鄙币,我是刑警寧澤肃叶,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站十嘿,受9級(jí)特大地震影響因惭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绩衷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一蹦魔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咳燕,春花似錦勿决、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至曹货,卻和暖如春咆繁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顶籽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工玩般, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人礼饱。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓坏为,卻偏偏與公主長(zhǎng)得像究驴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匀伏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容