站長資訊網
        最全最豐富的資訊網站

        組件是vue的特性嗎

        組件是vue的特性,它是Vue最強大的功能之一。在Vue中,組件可以擴展HTML元素,封裝可重用的代碼;在較高層面上,組件是自定義元素,Vue的編譯器為它添加特殊功能;在有些情況下,組件也可以是原生HTML元素的形式,以is特性擴展。

        組件是vue的特性嗎

        本教程操作環境:windows7系統、vue3版,DELL G3電腦。

        Vue.js 是一個優秀的前端界面開發 JavaScript 庫,它之所以非?;穑且驗橛斜姸嗤怀龅奶攸c,其中主要的特點有以下幾個。

        1) 輕量級的框架

        Vue.js 能夠自動追蹤依賴的模板表達式和計算屬性,提供 MVVM 數據綁定和一個可組合的組件系統,具有簡單、靈活的 API,使讀者更加容易理解,能夠更快上手。

        2) 雙向數據綁定

        聲明式渲染是數據雙向綁定的主要體現,同樣也是 Vue.js 的核心,它允許采用簡潔的模板語法將數據聲明式渲染整合進 DOM。

        3) 指令

        Vue.js 與頁面進行交互,主要就是通過內置指令來完成的,指令的作用是當其表達式的值改變時相應地將某些行為應用到 DOM 上。

        4) 組件化

        組件(Component)是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以是原生 HTML 元素的形式,以 is 特性擴展。

        在 Vue 中,父子組件通過 props 傳遞通信,從父向子單向傳遞。子組件與父組件通信,通過觸發事件通知父組件改變數據。這樣就形成了一個基本的父子通信模式。

        在開發中組件和 HTML、JavaScript 等有非常緊密的關系時,可以根據實際的需要自定義組件,使開發變得更加便利,可大量減少代碼編寫量。

        組件還支持熱重載(hotreload)。當我們做了修改時,不會刷新頁面,只是對組件本身進行立刻重載,不會影響整個應用當前的狀態。CSS 也支持熱重載。

        組件的優勢:

        • 降低整個系統的耦合度,在保持接口不變的情況下,我們可以替換不同的組件快速完成需求,例如輸入框,可以替換為日歷、時間、范圍等組件作具體的實現

        • 調試方便,由于整個系統是通過組件組合起來的,在出現問題的時候,可以用排除法直接移除組件,或者根據報錯的組件快速定位問題,之所以能夠快速定位,是因為每個組件之間低耦合,職責單一,所以邏輯會比分析整個系統要簡單

        • 提高可維護性,由于每個組件的職責單一,并且組件在系統中是被復用的,所以對代碼進行優化可獲得系統的整體升級

        5) 客戶端路由

        Vue-router 是 Vue.js 官方的路由插件,與 Vue.js 深度集成,用于構建單頁面應用。Vue 單頁面應用是基于路由和組件的,路由用于設定訪問路徑,并將路徑和組件映射起來,傳統的頁面是通過超鏈接實現頁面的切換和跳轉的。

        6) 狀態管理

        狀態管理實際就是一個單向的數據流,State 驅動 View 的渲染,而用戶對 View 進行操作產生 Action,使 State 產生變化,從而使 View 重新渲染,形成一個單獨的組件。

        初識VUE組件應用

        實例化多個vue對象

        用new創建多個vue對象并命名,可以通過變量相互訪問

        例子:對象2修改對象1的name變量

        <!-- 第一個根元素 --> <div id="vue-app-one">這里是:{{name}}</div>   <!-- 第二個根元素 --> <div id="vue-app-two">     <p>這里是:{{name}}</p><br>     <button @click="changeName">change-one-name</button>     <!-- 點擊后修改vue-app-one的name值--> </div>
         // 第一個vue對象 var one = new Vue({     el:"#vue-app-one",     data:{         "name":"ccy1"     } })   // 第二個vue對象 var two = new Vue({     el:"#vue-app-two",     data:{         "name":"ccy2"     },     methods:{         // 修改vue-app-one的name為'ccy333'         changeName:function(){             one.name = 'ccy333'         }     } })

        效果:點擊后修改”ccy1“為”ccy333“

        組件是vue的特性嗎

        全局組件

        定義與使用

        • 定義全局組件,需給組件一個名字,調用時,將組件名當作標簽名使用;相當于自定義標簽,該標簽下可以包含很多子html標簽;
        • 這些子html標簽定義在組件的template屬性中,每次調用該組件,都渲染template里的標簽
        • template里必須只有一個根元素
        • 在組件中,data是函數,將數據return回去
        • 依然可以用this來調用data中定義的數據

        例子:

        定義組件:

        ① 定義一個組件,命名為my-component
        ② 其中包含數據:name和方法:changeName
        ③ 渲染出的html效果有一個p標簽,包含一個按鈕,點擊按鈕時,修改name
        ④ 命名規范:camelCase (駝峰命名法) 與kebab-case (短橫線分隔命名)

        • 當寫成標簽時,遇到有大寫字母的命名,需要改成小寫并用橫桿鏈接前后兩個部分,如定義組件時命名為myComponent,寫成標簽時應寫成<my-component>;
        • 組件定義時也可以用橫桿法命名;
        • 如果定義時用myComponent,標簽用<my-component>是OK的,系統自動識別
        // 自定義的全局組件my-component // template中只有一個根元素p標簽,里面包含一個button按鈕 Vue.component('my-component',{     template:`<p>         我的名字是:{{name}}         <button @click='changeName()'>btn</button>         </p>`,     data(){         return {             name:'ccy'         }     },     methods:{         changeName:function(){             this.name = '安之'         }     } }) // vue對象1 new Vue({     el:"#vue-app-one", }) // vue對象2 new Vue({     el:"#vue-app-two", })

        使用組件:

        ① 在vue對象對應的根元素(el指定標簽)下使用
        ② 由于定義的是全局組件,所以可以在任意的vue對象下使用
        ③ 組件可復用,在一個vue對象下可以使用多次,且組件間互相獨立

        <div id="vue-app-one">     <my-component></my-component>     <my-component></my-component> </div>   <div id="vue-app-two">     <my-component></my-component> </div>

        效果:

        組件是vue的特性嗎

        data是一個函數

        在vue對象中,data屬性值是一個對象,比如這樣的:

        組件是vue的特性嗎

        但是在全局組件中,同一份data可能被多個vue對象使用,每個對象不單獨維護一份data時,如果某一個vue對象修改了data中的一個變量,其他vue對象獲取data時就會被影響;

        如果用上面的例子做案例,若組件中的data是對象(引用),其他地方均不改變,兩個vue對象便共享同一個name變量;當我通過其中一個vue對象改變name數據時(即點擊任一個btn按鈕),另一個對象獲得的name也發生了改變(其他按鈕處的’ccy’也都被改成了’安之’)

        因此,為保證數據的獨立性,即每個實例可以維護一份被返回對象的獨立的拷貝,data為每個實例都return一份新創建的數據,不同的vue對象獲取的data均互不影響

        在vscode中不允許組件中的data是對象,會報錯:

        [Vue warn]: The “data” option should be a function that returns a per-instance value in component definitions.

        局部組件

        • 局部組件注冊在某個vue對象中,
        • 只有注冊過該局部組件的vue對象才能使用這個局部組件

        例子:

        局部組件定義:

        // template僅一個根元素:ul var msgComponent = { 	// 數據是自身提供的 (hobbies)     template:`<ul><li v-for='hobby in hobbies' v-bind:key='hobby.id'>{{hobby}}</li></ul>`,     data(){         return {             hobbies:['看劇','看動漫','吃好吃的']         }     } }

        注冊局部組件:

        // 僅由注冊過該局部組件的vue對象才能使用,此處為div#vue-app-one // 注意命名規范,components中對象的key將會被作為標簽名,多個單詞拼接的命名需使用橫桿法 // 可以寫成msg-component,此處直接簡化了命名為msg, new Vue({     el:"#vue-app-one",     components:{         "msg": msgComponent     } })

        html文件中使用<msg></msg>

        <div id="vue-app-one">     <p>這里是vue-app-one</p>     <mycomponent></mycomponent>     <mycomponent></mycomponent>     <p>我的愛好:</p>     <msg></msg> <!--使用局部組件--> </div>

        效果: 紅框圈出的部分就是局部組件渲染出來的

        組件是vue的特性嗎

        父向子傳值/傳引用:prop

        靜態傳值

        創建子組件:

        var titleComponent = {     props:["title"],     template:`<p>{{title}}</p>`     // 所需要的數據title由父組件提供 }

        在父組件的components屬性中注冊子組件:

        new Vue({     el:"#vue-app-one",     components:{         "msg": msgComponent,         "titleComponent":titleComponent     }, })

        在父組件上使用子組件:

        <!-- div#vue-app-one為父組件 --> <div id="vue-app-one">     <p>這里是vue-app-one</p>     <mycomponent></mycomponent>     <mycomponent></mycomponent> 	<!--使用子組件title-component,并傳值"我的愛好:"給子組件-->     <title-component title="我的愛好:"></title-component>     <msg></msg> </div>

        效果:紅框標記處就是父向子傳值并展示

        組件是vue的特性嗎

        動態傳值:v-bind

        定義子組件:

        var titleComponent = {     props:["title"],     template:`<p>{{title}}</p>` }

        在父組件的components屬性中注冊子組件:

        new Vue({     el:"#vue-app-one",     components:{         "msg": msgComponent,         "titleComponent":titleComponent     },     data(){         return {             title:"my hobbies are ",         }     } })

        使用子組件,通過綁定父組件data中的變量title來實現動態傳值:

        <!-- div#vue-app-one為父組件 --> <div id="vue-app-one">     <p>這里是vue-app-one</p>     <mycomponent></mycomponent>     <mycomponent></mycomponent>     <!-- 動態綁定title -->     <title-component v-bind:title="title"></title-component>     <msg></msg> </div>

        效果:紅框處就是動態綁定獲取數據的展示

        組件是vue的特性嗎

        傳遞數組等復雜數據時,也可以使用v-bind來動態傳值,如:
        需要向子級傳遞hobbies數組,在vue實例對象(父)中創建數據hobbies

        new Vue({     el:"#vue-app-one",     components:{         "msg": msgComponent,         "titleComponent":titleComponent     },     data:{         title:"my hobbies are ",         hobbies:['看劇','看動漫','吃好吃的'], //需要向子組件傳遞的數據     } })

        定義子組件

        var msgComponent = {     template:`             <p>{{hobby}}</p>             `,     props:["hobby"],     data(){         return {            }     } }

        使用子組件

        <!-- div#vue-app-one為父組件 --> <div id="vue-app-one">     <p>這里是vue-app-one</p>     <mycomponent name="ccy"></mycomponent>     <mycomponent name="ccy"></mycomponent>     <title-component v-bind:title="title"></title-component>     <!-- 動態傳值:hobbies -->     <msg v-for="hobby in hobbies" v-bind:hobby="hobby" v-bind:key="hobby.id"></msg> </div>

        效果:

        組件是vue的特性嗎

        跳回“一點想法”處

        子向父:事件傳值$emit

        子組件不能通過prop向父組件傳遞數據,需要使用事件向父組件拋出一個值,告知父組件我需要實現一個功能,由父組件處理這個事件

        例子:點擊按鈕,改變名稱chinesename
        (由于data變量名不支持chinese-name形式,花括號里不支持chineseName形式,所以這里我都用了小寫,此處記錄一下,日后學到了新知再來填坑)

        先在父組件的data中定義chinesename的初始值:

        new Vue({     el:"#vue-app-one",     data:{          chinesename:"anzhi" // chinesename初始值     } })

        創建子組件,并注冊事件change-name(就像click事件一樣,需要讓系統能夠辨認這是一個事件并監聽,當事件被觸發時,執行某項約定好的操作):

          Vue.component('blog-post', {     props: ['chinesename'],     template: `       <div class="blog-post">         <h4>{{ chinesename }}</h4>         <button v-on:click='$emit("change-name","ruosu")'>             修改名字         </button>       </div>     `     // blog-post組件包含一個h4,顯示chinesename,和一個按鈕     // 點擊這個按鈕,觸發change-name事件,將"ruosu"作為參數傳遞給指定的處理函數onChangeName   })

        在父組件中使用子組件,定義change-name的處理函數為onChangeName:

        <div id="vue-app-one">     <p>這里是vue-app-one</p> 	<!-- v-bind:通過prop給子組件傳遞chinesename的初始值 --> 	<!-- v-on:子組件通過$emit給父組件傳遞新的chinesename的值 --> 	<div id="blog-posts-events-demo"> 	      <blog-post 	        v-bind:chinesename='chinesename' 	        v-on:change-name = "onChangeName" 	      ></blog-post> 	</div> </div>

        在父組件處定義事件處理函數onChangeName:

        new Vue({     el:"#vue-app-one",     data:{           chinesename:"anzhi"     },     methods:{         onChangeName:function(value){         	// 將chinesename換成傳遞過來的數據             this.chinesename=value         }     } })

        效果:

        組件是vue的特性嗎

        一點想法

        關于父子組件的區分,在此寫一點總結,還是日后學了新知識再來填坑

        官網中沒有很明確指明兩者的定義和區別,在網上搜了一圈,覺得比較多人認可并且好理解的是:

        • el指定的根元素為父組件(使用之處為父組件)
        • vue實例對象也可看做組件

        在前面這些父子傳值的例子中,我們可以看到,對于局部組件,我們會在某個html根元素中注冊并使用,所以此時el指定的根元素在html文件中是這個局部組件的父組件,局部組件在html使用時便是這個父組件的一份子,承擔數據傳輸的責任
        跳轉到父向子動態傳值案例

        組件是vue的特性嗎

        組件是vue的特性嗎

        再用繞口令說一波,即:title-component組件定義處與使用處,兩者身份是不一樣的,在定義處,它是局部組件,也是子組件,需注冊才能使用;在使用處,它是根元素的包含一部分,根元素為父組件,而“它”,承擔著父組件與子組件數據溝通的重任

        這個總結在全局組件情況下也適用,使用該全局組件的根元素是父組件,如上面的子向父傳值的案例,p#vue-app-one是父組件,<blog-post></blog-post>作為父子組件溝通的橋梁,全局組件blog-post為子組件

        圖示:

        組件是vue的特性嗎

        如果是子組件又嵌套了子組件,被嵌套的組件是子子組件,以此類推

        【相關視頻教程推薦:vue視頻教程、web前端入門】

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久99精品国产99久久| 欧美精品一区二区三区视频| 精品福利视频一区二区三区| 国产精品成人免费观看| 日韩精品无码熟人妻视频| 国产精品国产AV片国产| 国产日韩精品欧美一区| 天天视频国产精品| 一区二区三区四区精品视频| 精品午夜福利在线观看| 亚洲综合国产精品第一页| 国产乱人伦偷精品视频不卡| 国产精品视频一区二区三区| 日韩精品久久久肉伦网站| 精品成人一区二区三区四区| 麻豆精品成人免费国产片| 69堂国产成人精品视频不卡| 日韩精品亚洲人成在线观看| 久久久久久噜噜精品免费直播| 91午夜精品亚洲一区二区三区| 精品国产午夜理论片不卡| 亚洲国产精品国产自在在线 | 亚洲精品国产av成拍色拍| 成人一区二区三区精品| 97精品久久天干天天天按摩| 综合国产精品第一页| 久久久久99精品成人片三人毛片| 中国精品videossex中国高清| 2021精品国产综合久久| 精品久久久久久无码专区| 无码人妻精品中文字幕| 亚洲av无码成人精品国产| 久久九九久精品国产| 国产精品一区二区三区99| 97视频在线精品国自产拍 | 国产麻豆精品入口在线观看 | 精品人妻人人做人人爽| 亚洲AV无码久久精品成人| 日韩精品一区二区午夜成人版| 国产一区二区三区在线观看精品| 高清日韩精品一区二区三区|