Vue框架

第1章 Vue基礎(chǔ)語法

創(chuàng)建一個Vue實例

把vue.js放在head標簽里用script標簽引入相味,避免放在body里引起抖屏丰涉。

1552395200.jpg

引入vue.js庫一死,用new Vue()函數(shù)創(chuàng)建一個實例
- el:讓vue實例去接管頁面上哪一個元素
- data:vue實例的數(shù)據(jù)放在這里面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue入門</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="root">{{msg}}</div>

    <script>
        new Vue({
            el:"#root",
            data:{
                msg:'hello world'
            }
        })
    </script>
</body>
</html>

掛載點摘符,模板與實例

  • 掛載點
    掛載點就是vue里的el屬性對應的dom節(jié)點逛裤。
    div標簽稱為vue實例的掛載點带族,因為el正好和div標簽的id對上蟀给,vue只會處理掛載點下面的內(nèi)容。
  • 模板
    掛載點內(nèi)部的內(nèi)容都叫模板內(nèi)容恬总。
    <div id="root">
        <h1>hello {{msg}}</h1>//模板內(nèi)容
    </div>

模板除了可以放在掛載點后面寫之外肚邢,還可以放在vue實例里面寫:

    <script>
        new Vue({
            el:"#root",
            template:'<h1>hello {{msg}}</h1>',//模板內(nèi)容
            data:{
                msg:'world'
            }
        })
    </script>

Vue實例中的數(shù)據(jù)骡湖,事件與方法

  • 插值表達式
<h1>hello {{msg}}</h1>
{{mynumber}}//插值表達式
  • v-text(會進行一次轉(zhuǎn)義輸出純文本)
    語法:v-text=""谆焊,雙引號是劃定界限的符號浦夷。
<h1 v-text="mynumber"> </h1>

h1的內(nèi)容由mynumber這個變量決定,v-text是vue的一個指令
劈狐,告訴h1要顯示的就是mynumber這個變量懈息。

    <div v-text='msg'></div>

    </div>
    <script>
        new Vue({
            el:"#root",
            data:{
            msg:"<h1>hello</h1>"
v-text顯示內(nèi)容
  • v-html(不會轉(zhuǎn)義)
    語法:v-html=""辫继,雙引號是劃定界限的符號姑宽。
    <div id="root">
        <h1 v-text="msg"></h1>
    </div>
    
    <script>
        new Vue({
            el:"#root",
            data:{
                msg:"<h1>hello</h1>"
            }
        })
    </script>

顯示內(nèi)容


v-html顯示的內(nèi)容
  • v-on模板指令
    語法:v-on:事件名稱="函數(shù)(方法)",v-on:可以簡寫為@瘦穆,給模板上的標簽綁定事件赊豌。
//點擊hello,hello變成world
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue入門</title>
    <script src="./vue.js"></script>
</head>
<body>

    <div id="root">
        <h1 v-text="content" @:click="handleClick"></h1>
        /*給標簽綁定一個handleClick事件*/
    </div>
    
    <script>
        new Vue({
            el:"#root",
            data:{
                content:"hello"
            },
            methods:{//把函數(shù)定義在vue實例的methods屬性下
                handleClick: function(){
                    this.content = 'world'
                }
            }
        })
    </script>
</body>
</html>

Vue中的屬性綁定和雙向數(shù)據(jù)綁定

  • v-bind:指令簡寫為“:”熙兔,把div標簽的title屬性和title數(shù)據(jù)項綁定
    語法:v-bind:屬性="數(shù)據(jù)項"

    注意:""里面放的不再是字符串,而是JS表達式(里面可以放字符串也可放變量)住涉。
<script src="./vue.js"></script>
</head>
<body>

    <div id="root">
        <div v-bind:title="mydata">hello world</div>
    </div>
    
    <script>
        new Vue({
            el:"#root",
            data:{
                mydata:"this is hello world",
            }
        })
    </script>
  • v-model雙向數(shù)據(jù)綁定
    語法:v-model=""
    單向綁定:數(shù)據(jù)決定頁面的顯示花沉,頁面無法決定數(shù)據(jù)里的內(nèi)容纳寂。
    雙向綁定:互相決定
    <script src="./vue.js"></script>
</head>
<body>

    <div id="root">
        <div :title="title">hello world</div>
        <input v-model="content"/>
        <div>{{content}}</div>
    </div>
    
    <script>
        new Vue({
            el:"#root",
            data:{
                title:"this is hello world",
                content:"this is a content"
            }
        })
    </script>
image.png

Vue中的計算屬性和偵聽器

  • computed計算屬性

  • watch監(jiān)聽數(shù)據(jù)變化
    監(jiān)聽數(shù)據(jù)或者屬性的變化

    <script src="./vue.js"></script>
</head>
<body>

    <div id="root">
        姓:<input v-model="firstName">
        名:<input v-model="lastName">
        <div>{{fullName}}</div>
fullName定義在Vue實例computed屬性中忽媒,是一個計算屬性腋粥,通過別的屬性
計算出來的 
好處是若計算該屬性的屬性沒有改變隘冲,每一次使用該屬性的時候展辞,會使用試一
次的緩存結(jié)果
fistName和lastName沒變罗珍,重新使用fullName的時候不會重新計算覆旱,而是
使用上一次的緩存結(jié)果
        <div>{{count}}</div>
    </div>
    
    <script>
        new Vue({
            el:"#root",
            data:{
                firstName:'',
                lastName:'',
                count:0
            },
            computed:{
                fullName:function(){
                    return this.firstName+' '+this.lastName
                }
            },
監(jiān)聽某一個數(shù)據(jù)的變化,一旦數(shù)據(jù)發(fā)生變化藕坯,就可以在
偵聽器里執(zhí)行相應的邏輯
            watch:{
                firstName:function(){
                    this.count ++
                },
                lastName:function(){
                    this.count ++
                }
            }
        })
    </script>

v-if炼彪,v-show與v-for指令

  • v-if 控制dom存在與否霹购,一次性操作選v-if
    語法:v-if="數(shù)據(jù)"
  • v-show控制dom顯示與否齐疙,多次操作選v-show贞奋,
  • v-for控制一組數(shù)據(jù)轿塔,循環(huán)顯示在頁面上
    語法:v-for=“(item,index) of items” :key="index"
    一般 js for in 是遍歷 key, 而 for of 遍歷 value勾缭。在 vue 里面應該沒區(qū)別
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-if,v-show,v-for 指令</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="root">
v-if控制div標簽刪除與否俩由,當show為true時刪除dom結(jié)構(gòu),不顯示hello
        <div v-if="show">hello world</div>
        <button @click="handleClick">tonggle</button>
        <ul>
v-for循環(huán)顯示出list列表里的值兜畸,:key值能更好的渲染咬摇,每次的key
值不能相同
<li v-for="(item,index) of list" :key="index">{{item}}</li>
        </ul>
    </div>
    <script>
        new Vue({
            el:"#root",
            data:{
                show: false,
                list:[1,2,3]
            },
            methods:{
                handleClick:function(){
                    this.show = !this.show;
                }
            }
        })
    </script>
</body>
</html>

第1章總結(jié)

Vue模板指令 語法 用處
v-text v-text=" "肛鹏,雙引號是劃定界限的符號 把數(shù)據(jù)作為文本輸出
v-html v-html=" " 不轉(zhuǎn)義數(shù)據(jù)并輸出
v-on v-on:事件名稱="函數(shù)(方法)"龄坪,v-on:可以簡寫為@, 給模板上的標簽綁定事件
v-bind v-bind:屬性="數(shù)據(jù)項"佛纫,簡寫為“:” 進行屬性綁定
v-model v-model="" 雙向數(shù)據(jù)綁定
v-if v-if="數(shù)據(jù)" 控制dom存在與否总放,一次性操作選v-if
v-show v-show="數(shù)據(jù)" 控制dom顯示與否胆建,多次操作選v-show炬搭,
v-for v-for=“(item,index) of items” :key="index" js for in 是遍歷 key, 而 for of遍歷value。在 vue 里面應該沒區(qū)別 控制一組數(shù)據(jù)享完,循環(huán)顯示在頁面上

Vue屬性 格式 用處
el el: 指定掛載點
data data:{} 存放vue實例的數(shù)據(jù)
methods methods:{} 定義函數(shù)般又,它需要手動調(diào)用才能執(zhí)行茴迁,而不像computed那樣萤衰,可以自動執(zhí)行預先定義的函
computed computed:{} 計算屬性是以Vue的依賴追蹤機制為基礎(chǔ)的堕义,其試圖處理這樣的一件事情:當某一個數(shù)據(jù)(依賴數(shù)據(jù))發(fā)生變化的時候,所有依賴這個數(shù)據(jù)的相關(guān)數(shù)據(jù)會自動發(fā)生變化腻菇,也就是自動調(diào)用相關(guān)的函數(shù)去實現(xiàn)數(shù)據(jù)的變動
watch watch:{} 監(jiān)聽數(shù)據(jù)或者屬性的變化

第2章胳螟、Vue中的組件

TodoList功能開發(fā)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="root">
        <div>
            <input v-model="inputValue" />
            <button @click="handleSubmit">提交</button>
        </div>
        <ul>
            <li v-for="(item,index) of list" :key="index">
            {{item}}
            </li>
        </ul>
    </div>

    <script>
        new Vue({
            el:"#root",
            data:{
                inputValue:'',
                list:[]
            },
            methods:{
                handleSubmit: function(){
調(diào)用push方法讓list中增加一個數(shù)據(jù)
                    this.list.push(this.inputValue)
                    this.inputValue=""
                }
            }
        })
    </script>
</body>
</html>
image.png

TodoList中的組件拆分

  • 組件:頁面中的某一部分
  • 創(chuàng)建全局組件
    把<li>標簽拆分成組件進行管理
  1. 通過Vue.component創(chuàng)建的組件叫做全局組件。在任何地方的模板里都可以使用
  2. 調(diào)用全局組件的時候可以通過屬性傳參筹吐,屬性的名字可以隨便取糖耸,不一定非得叫content,此處的屬性等于循環(huán)的每一項內(nèi)容item丘薛,通過此法嘉竟,可以把content傳給todoitem組件希坚,傳了之后不能直接使用个束,子組件必須先接受,用props接受從外部傳進來的屬性阱表。如下:
<todo-item v-for="(item,index) of list" :key="index" :content="item"></todo-item>
        <ul>
            <todo-item></todo-item>//在此用組件
        </ul>
    Vue.component('todo-item',{
        props:['content'],
        template:'<li>{{content}}</li>'
    })
  • 創(chuàng)建局部組件
    不能直接在父組件的模板里調(diào)用,必須在Vue實例中通過components先聲明
//var TodoItem里有個對象,對象里有個模板胯努。
    var TodoItem={
        template:'<li>item</li>'
    }
new Vue({
            el:"#root",
            components:{
                'todo-item':TodoItem
            },
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="root">
        <div>
            <input v-model="inputValue" />
            <button @click="handleSubmit">提交</button>
        </div>
        <ul>
            <todo-item 
                v-for="(item ,ndex) of list" 
                :key="index"
                :content="item"
                ><!-- //父組件通過屬性的形式給子組件todo-item傳參 -->
            </todo-item>
        </ul>
    </div>

    <script>

//創(chuàng)建組件的方法灰署,通過Vue.component定義的組件叫做全局組件,
//在任何地方模板里都可以使用
        Vue.component("todo-item", {
            props: ['content'],
//組件接受從外部傳進來的一個叫content的屬性
            template: '<li>{{content}}</li>'
//定義一個組件叫todo-item肴茄,其內(nèi)容是item
        })


//局部組件,如果想在Vue實例模板里調(diào)用棋凳,需要在最外層的Vue
//實例里通過components聲明
        // var TodoItem = {
        //  template: "<li>item</li>"
        // }



        new Vue({
            el:"#root",
            // components:{
            //  'todo-item':TodoItem
            // },
            data:{
                inputValue:'',
                list:[]
            },
            methods:{
                handleSubmit: function(){
                    // 調(diào)用push方法讓list中增加一個數(shù)據(jù)
                    this.list.push(this.inputValue)
                    this.inputValue=""
                }
            }
        })
    </script>
</body>
</html>

組件與實例的關(guān)系

每一個vue的組件又是一個Vue的實例,組件就是實例,實例就是組件。所以任何一個Vue項目都是由千千萬萬個Vue實例組成的

     Vue.component('todo-item',{
        props:['content'],
         template:'<li @click="handleClick">{{content}}</li>',
         methods:{
            handleClick:function(){
                alert('clicked')
            }
         }
     })

實現(xiàn)效果:


1552570175(1).jpg

每一個組件里可以寫methods等尾组,證明每一個組件都是vue的實例

實現(xiàn)TodoList的刪除功能

在Vue中父組件向子組件傳值是通過屬性進行的呵萨。要實現(xiàn)子組件的刪除囱皿,必須在父組件里,把子組件對應的數(shù)據(jù)刪除。vue里通過發(fā)布訂閱模式實現(xiàn)子組件和父組件的通信分苇。
父組件循環(huán)顯示子組件的時候掏颊,可以額外在加一個參數(shù)等于循環(huán)的下標

<todo-item v-for="(item,index) of list" 
:key="index" 
:content="item" 
:myindex="index"></todo-item>

子組件在content之后再加一個myindex盆偿,意思是除了從父組件接受到content之外還可以接受到下標求橄。

Vue.component('todo-item',{
        props:['content','myindex'],
         template:'<li @click="handleClick">{{content}}</li>',
         methods:{
            handleClick:function(){
                            }
         }
     })

當子組件被點擊的時候,通知父組件,通過調(diào)用this.$emit(' ')方法拆内,觸發(fā)一個自定義的delete事件,事件中攜帶了下標值。

         methods:{
            handleClick:function(){
            this.$emit('delete',this.myindex)
            }
         }

父組件監(jiān)聽子組件向外觸發(fā)的事件采够,監(jiān)聽到之后,執(zhí)行handleDelete函數(shù),函數(shù)中可以接收到一個傳遞過來的參數(shù)子組件傳遞過來的下標,在父組件中寫一個handleDelete函數(shù)虏肾,把父組件list對應的下標內(nèi)容刪除吹埠,通過this.list.splice(myindex,1)從對應下標位置刪除掉一項。

        new Vue({
            el:"#root",
            data:{
                inputValue:'',
                list:[]
            },
            methods:{
                handleSubmit:function(){
                    this.list.push(this.inputValue),
                    this.inputValue=''
                },
                handleDelete:function(myindex){
                    this.list.splice(myindex,1)
                }
            }
        })

全代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Todolist</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="root">
        <div>
            <input v-model="inputValue"/>
            <button @click="handleSubmit">提交</button>
        </div>
        <ul>
            <todo-item v-for="(item,index) of list" 
            :key="index" 
            :content="item" 
            :myindex="index"
            @delete="handleDelete"
            ></todo-item>
        </ul>
    </div>
    <script>



     Vue.component('todo-item',{
        props:['content','myindex'],
         template:'<li @click="handleClick">{{content}}</li>',
         methods:{
            handleClick:function(){
            this.$emit('delete',this.myindex)
            }
         }
     })

        new Vue({
            el:"#root",
            data:{
                inputValue:'',
                list:[]
            },
            methods:{
                handleSubmit:function(){
                    this.list.push(this.inputValue),
                    this.inputValue=''
                },
                handleDelete:function(myindex){
                    this.list.splice(myindex,1)
                }
            }
        })
    </script>
</body>
</html>

總結(jié)

父組件通過屬性的方式向子組件傳遞參數(shù)鸽心;子組件通過發(fā)布訂閱模式的方式向父組件傳遞參數(shù)太闺。##

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兰吟,更是在濱河造成了極大的恐慌珊燎,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷盔,死亡現(xiàn)場離奇詭異溺拱,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門擂啥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人离赫,你說我怎么就攤上這事台妆“萌保” “怎么了遗座?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長涕刚,這世上最難降的妖魔是什么盼樟? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮砚婆,結(jié)果婚禮上验夯,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好幌衣,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布断部。 她就那樣靜靜地躺著蔑祟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肃叶,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天激率,我揣著相機與錄音曹货,去河邊找鬼。 笑死纳胧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的综苔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼捉撮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起献丑,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤鬼店,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拉盾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡脱羡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了下面。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沥割。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堵未,到底是詐尸還是另有隱情刨沦,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站轻要,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冲泥。R本人自食惡果不足惜赢底,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幸冻,春花似錦粹庞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碑定,卻和暖如春流码,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背延刘。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工漫试, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碘赖。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓驾荣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親普泡。 傳聞我的和親對象是個殘疾皇子播掷,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 這里有基類Animal和子類Dog,現(xiàn)在執(zhí)行下列代碼: 在這種情況下撼班,a是無法直接訪問color字段的歧匈,而d1可以...
    Rimson閱讀 113評論 0 0
  • “哎你怎么在這里?”就像被打翻了五味瓶一樣砰嘁,其實我更想說“你特么為什么當初不告而別你知道我多傷心嗎你大爺?shù)亩俗拥?..
    夢若塵閱讀 357評論 1 0