Vue——初始Vue & Vue的響應(yīng)式原理 & Vue常用指令 & 條件渲染和列表渲染

一仙蚜、初始Vue

1耀找、準備一個容器

    <div id="app">
        <h2>姓名:{{name}}</h2>
        <h2>年齡:{{age}}</h2>
        <!-- v-on:指令用于綁定事件 -->
        <button v-on:click="updateName">修改姓名</button>
        <button v-on:click="updateAge">修改年齡</button>
    </div>

2翔悠、引入vue.js文件

方式(1)引入本地vue.js文件

vue.js文件官網(wǎng)下載

    <!-- 開發(fā)版本 -->
    <script src="../js/vue.js"></script>
    <!-- 生產(chǎn)版本(打包上線時使用) -->
    <!-- <script src="../js/vue.min.js"></script> -->

方式(2)通過CDN引入

   <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js"></script>
   <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>

3业崖、創(chuàng)建一個Vue對象

注意:初次使用vue,控制臺會有兩條提示蓄愁。

如果想去掉這兩條信息双炕,可以選擇安裝vue-devtools,引入生產(chǎn)版本的vue.js撮抓。
也可以使用以下代碼消除:

  // 不允許 vue-devtools 檢查代碼
  Vue.config.devtools = false
  // vue 在啟動時不顯示生產(chǎn)提示
  Vue.config.productionTip = false

創(chuàng)建一個Vue對象

        let vm = new Vue({
            //指定當(dāng)前Vue對象操作的DOM容器
            el:'#app',
            //定義當(dāng)前Vue對象管理的數(shù)據(jù)
            data:{
                name:'張三',
                age:20
            },
            //定義當(dāng)前Vue對象管理的方法
            methods: {
                //修改姓名的方法
                updateName(){
                    this.name = '李四'
                },
                //修改年齡的方法
                updateAge(){
                    this.age = 30
                }
            },
        })

4妇斤、效果

點擊修改按鈕

二、Vue的響應(yīng)式原理

1丹拯、代理對象的基本理解

        // (1)定義源對象obj1
        let obj1 = {
            name:'張三',
            age:20
        }
        // (2)定義代理對象obj2站超,代理源對象obj1
        let obj2 = obj1
        console.log('obj2:',obj2);
        // 代理對象修改了源對象的數(shù)據(jù)
        obj2.name = '李四'
        obj2.age = 30
        console.log(obj1);  // {name: "李四", age: 30}

2、vue的data和_data

        // (1)定義源對象
        let myData = {
            name: '張三',
            age: 20
        }
        let vm = new Vue({
            // (2)將源對象傳遞給Vue的data乖酬,背后做了兩件事
             // ① 設(shè)置Vue實例的_data屬性顷编,作為當(dāng)前源對象的代理對象。(響應(yīng)式的核心)
             // ② 將_data里面代理的所有數(shù)據(jù)剑刑,再添加到當(dāng)前Vue實例身上媳纬,也就是vm身上。(方便直接調(diào)用數(shù)據(jù))
             data:myData
        })
        // 通過改變vue實例的屬性可以改變源對象的屬性值
        vm.name = '王五'
        vm.age = 40
        console.log(myData);  // {name: "王五", age: 40}

3施掏、給對象添加屬性的幾種方式

方式(1)使用點 .

        let obj3 = {}
        obj3.name = '張三'

方式(2)使用中括號 [ ]

        obj3['age'] = 20

方式(3)defineProperty方法

通過Object對象的defineProperty方法钮惠,給指定的對象添加指定的屬性。
使用這種方式七芭,給對象添加的屬性素挽,默認不可被枚舉,不能被刪除狸驳;對屬性的保護措施更加嚴謹预明。

   Object.defineProperty(obj3,'sex',{
       // 屬性值
       value:'男',
       // 允許被枚舉(默認不允許)
       enumerable:true,
       // 允許被刪除(默認不允許)
       configurable:true
   })
   // 枚舉出對象的所有屬性(其實就遍歷出對象的所有屬性名)
   // 如果sex屬性沒有設(shè)置允許被枚舉,就不能被枚舉
   for(let key in obj3){
       console.log(key);
   }
   // 通過delete關(guān)鍵耙箍,可以刪除對象身上的指定屬性
   delete obj3.name
   delete obj3.sex   // 如果sex屬性沒有設(shè)置允許被刪除撰糠,就不能被刪除

4、Vue響應(yīng)式的原理

    <div>
        <h2>姓名:<span id="name"></span></h2>
        <h2>年齡:<span id="age"></span></h2>
    </div>
        // (1)定義一個源對象
        let data = {
            name:'張三',
            age:20
        }
        //在頁面中辩昆,顯示姓名和年齡
        document.querySelector('#name').innerHTML = data.name
        document.querySelector('#age').innerHTML = data.age

        // (2)定義一個代理對象(使用_data 去代理 data)
        let _data = {}
        // (3)使用Object.defineProperty給代理對象添加屬性
        Object.defineProperty(_data,'name',{
            // get方法阅酪,用于返回屬性的值(當(dāng)我們調(diào)用name屬性獲取值時,會調(diào)用get方法)
            get(){
                // console.log('get方法執(zhí)行了');
                return data.name
            },
            // set方法汁针,用于設(shè)置屬性的值(當(dāng)我們調(diào)用name屬性設(shè)置值時术辐,會調(diào)用set方法)
            set(val){
                // console.log('set方法執(zhí)行了');
                data.name = val
                // 當(dāng)代理對象,監(jiān)聽到數(shù)據(jù)發(fā)生變化了施无,就會重新渲染頁面
                document.querySelector('#name').innerHTML = data.name
            }
        })
        Object.defineProperty(_data,'age',{
            get(){
                return data.age
            },
            set(val){
                data.age = val
                // 當(dāng)代理對象辉词,監(jiān)聽到數(shù)據(jù)發(fā)生變化了,就會重新渲染頁面
                document.querySelector('#age').innerHTML = data.age
            }
        })
       // 改變代理對象_data的數(shù)據(jù)猾骡,頁面會重新渲染
        _data.name = '李四'
        _data.age = 40

三瑞躺、Vue的常用指令

v-bind:用于綁定屬性敷搪,通過v-bind:綁定過的屬性,可以在屬性值可以寫表達式隘蝎。v-bind:可以用 : 簡寫购啄。
v-on:用于綁定事件,通過v-on:綁定過的事件嘱么,可以指定Vue實例定義的方法狮含。v-on:可以用 @ 簡寫。
v-model指令可以實現(xiàn)對數(shù)據(jù)的雙向綁定曼振。所謂雙向綁定指的是:數(shù)據(jù)發(fā)生變化重新渲染頁面几迄,頁面數(shù)據(jù)發(fā)生變化更新回數(shù)據(jù)。v-model指令是 v-bind:value 和 v-on:input 的簡寫冰评。

實現(xiàn)數(shù)據(jù)改變時映胁,文本框的值會隨之改變;輸入框文本改變時甲雅,數(shù)據(jù)也會隨之更改解孙。

 <div id="app">
    <div>
        <span>姓名:</span>
        <input type="text" v-bind:value="name" v-on:input="updateName">{{name}}
    </div>
    <div>
        <span>年齡:</span>
        <!-- 如果事件方法的代碼不是很多,可以寫在行內(nèi)抛人。注意:這里不能寫this弛姜,返回的就是事件對象。 -->
        <input type="text" :value="age" @input="age = $event.target.value">{{age}}
    </div>
    <div>
        <span>工作:</span>
        <input type="text" v-model="job">{{job}}
    </div>
</div>
 <script>
        let vm = new Vue({
            el: '#app',
            //數(shù)據(jù)
            data: {
                name: '張三',
                age: 20,
                job:'程序員'
            },
            methods: {
                updateName(e){
                    //獲取文本框里面的內(nèi)容妖枚,更新數(shù)據(jù)
                    this.name = e.target.value
                }
            }
        })
 </script>

四廷臼、條件渲染和列表渲染

1、條件渲染

可以使用v-if 或者v-show實現(xiàn)條件渲染绝页。
★ v-if 和 v-show 如何選擇
① 如果頁面需要反復(fù)切換顯示和隱藏荠商,用v-show。
② 如果頁面中有很多模塊需要隱藏续誉,用戶可能只對其中的某個模塊感興趣莱没,用v-if。所有的模塊首屏加載時屈芜,全部都不渲染郊愧,當(dāng)用戶選擇指定的模塊后,再渲染指定的模塊井佑。

    <div id="app">
        <!-- 根據(jù)成績,顯示下面的等級 -->
        <h2 v-if="score>=90">優(yōu)秀</h2>
        <h2 v-else-if="score>=80">良好</h2>
        <h2 v-else-if="score>=70">中等</h2>
        <h2 v-else-if="score>=60">合格</h2>
        <h2 v-else>差</h2>
        <hr>
        <button @click="isShow=!isShow">顯示/隱藏</button>
        <!-- 每次要根據(jù)isShow的值眠寿,確定是否渲染頁面 -->
        <div v-if="isShow">
            <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F201804%2F28%2F20180428174908_sgsyj.thumb.1000_0.jpg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1640144539&t=de45197a8aa3bf884b08b791723e7ed0">
        </div>
        <hr>
        <!-- 模板已經(jīng)渲染成功躬翁,通過樣式控制顯示隱藏 -->
        <div v-show="isShow">
            <img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic40.nipic.com%2F20140428%2F9081536_114914525167_2.jpg&refer=http%3A%2F%2Fpic40.nipic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1640144712&t=1261090ac684bf8e3c83f61ed012a2a7">
        </div>
    </div>
    <script>
        new Vue({
            el:'#app',
            //定義數(shù)據(jù)
            data:{
                score:55,
                isShow:false
            }
        })
    </script>

2、列表渲染

v-for指令:用于列表渲染盯拱;列表渲染時盒发,通常都要綁定key例嘱,key的作用是提高渲染性能。
注意:key必須是唯一宁舰,暫時可以將列表的索引作為key值去使用拼卵。

    <div id="app">
        <ul>
            <li v-for="(item,index) in foods" :key="index">{{index}}--{{item.name}}--{{item.price}}</li>
        </ul>
    </div>
    <script>
        new Vue({
            el:'#app',
            //定義數(shù)據(jù)
            data:{
                foods:[
                    {
                        id:1,
                        name:'薯片',
                        price:7.9
                    },
                    {
                        id:2,
                        name:'餅干',
                        price:3.9
                    },
                    {
                        id:3,
                        name:'面包',
                        price:9.9
                    },
                    {
                        id:4,
                        name:'蛋糕',
                        price:16.9
                    }
                ]
            }
        })
    </script>

五、小練習(xí)之輪播圖

    <div id="app">
        <img :src="imgs[showActive]" >
    </div>
    <script>
        new Vue({
            el:'#app',
            data:{
                //顯示的下標
                showActive:0,
                //圖片數(shù)組
                imgs:["http://p1.music.126.net/7zAkp74zoKd0LuEuEP6dOg==/109951166645160829.jpg?imageView&quality=89",
                    "http://p1.music.126.net/pkXsmqmFQOehNkJYmehkng==/109951166646695577.jpg?imageView&quality=89",
                    "http://p1.music.126.net/c1olbeIgiVsj9I39fCUXkQ==/109951166644891380.jpg?imageView&quality=89",
                    "http://p1.music.126.net/JMYet32O1mi6-YZ1GGSYcQ==/109951166646419732.jpg?imageView&quality=89",
                    "http://p1.music.126.net/WCX5Cq1z17Du2z0QBEcEaA==/109951166645933077.jpg?imageView&quality=89"]
            },
            // 生命周期函數(shù)(表示頁面掛載完成)
            mounted() {
                setInterval(() => {
                    this.showActive++
                    //如果下標越界蛮艰,重新從0開始
                    if(this.showActive>=5) this.showActive = 0
                }, 3000);
            },
        })
    </script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腋腮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子壤蚜,更是在濱河造成了極大的恐慌即寡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袜刷,死亡現(xiàn)場離奇詭異聪富,居然都是意外死亡,警方通過查閱死者的電腦和手機著蟹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門墩蔓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萧豆,你說我怎么就攤上這事奸披。” “怎么了炕横?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵源内,是天一觀的道長。 經(jīng)常有香客問我份殿,道長膜钓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任卿嘲,我火速辦了婚禮颂斜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拾枣。我一直安慰自己沃疮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布梅肤。 她就那樣靜靜地躺著司蔬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姨蝴。 梳的紋絲不亂的頭發(fā)上俊啼,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音左医,去河邊找鬼授帕。 笑死同木,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的跛十。 我是一名探鬼主播彤路,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芥映!你這毒婦竟也來了洲尊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤屏轰,失蹤者是張志新(化名)和其女友劉穎颊郎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霎苗,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡姆吭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唁盏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片内狸。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖厘擂,靈堂內(nèi)的尸體忽然破棺而出昆淡,到底是詐尸還是另有隱情,我是刑警寧澤刽严,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布昂灵,位于F島的核電站,受9級特大地震影響舞萄,放射性物質(zhì)發(fā)生泄漏眨补。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一倒脓、第九天 我趴在偏房一處隱蔽的房頂上張望撑螺。 院中可真熱鬧,春花似錦崎弃、人聲如沸甘晤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽线婚。三九已至,卻和暖如春盆均,著一層夾襖步出監(jiān)牢的瞬間酌伊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工缀踪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留居砖,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓驴娃,卻偏偏與公主長得像奏候,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唇敞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

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