為什麼要用Vue.js的元件化開發

前端攻城小牛發表於2018-12-31

那麼什麼是Vue元件呢?它是vue.js最強大的功能之一,是可擴充套件的html元素,是封裝可重用的程式碼,同時也是Vue例項,可以接受相同的選項物件(除了一些根級特有的選項) 並提供相同的生命週期鉤子。這麼說我相信很多人都理解了。

元件系統是Vue.js其中一個重要的概念,它提供了一種抽象,讓我們可以使用獨立可複用的小元件來構建大型應用,任意型別的應用介面都可以抽象為一個元件樹:

image.png

那麼什麼是元件呢? 元件可以擴充套件HTML元素,封裝可重用的HTML程式碼,我們可以將元件看作自定義的HTML元素。

使用元件的好處?

提高開發效率

方便重複使用

簡化除錯步驟

提升整個專案的可維護性

便於多人協同開發

如何註冊元件?

需要使用Vue.extend方法建立一個元件,然後使用Vue.component方法註冊元件。Vue.extend方法格式如下

var MyComponent = Vue.extend({
    // 選項...後面再介紹
})
複製程式碼

如果想要其他地方使用這個建立的元件,還得個元件命個名:

Vue.component('my-component', MyComponent)
複製程式碼

命名之後即可在HTML標籤中使用這個元件名稱,像使用DOM元素一樣。下面來看看一個完整的元件註冊和使用例子。

  
//html程式碼:
<div id="example">
    <my-component></my-component>
</div>
//js程式碼:
// 定義
var MyComponent = Vue.extend({
    template: '<div>A custom component!</div>'
})

// 註冊
Vue.component('my-component', MyComponent)

// 建立根例項
new Vue({
    el: '#example'
})
複製程式碼

輸出結果為:

<div id="example">
    <div>A custom component!</div>
</div
複製程式碼

元件之間的通訊 父元件要給子元件傳遞資料,

子元件需要將它內部發生的事情告訴父元件(利用事件的訂閱釋出模式)

1.給子元件的template上的元素繫結事件(如click),執行子元件的方法(如changeData),子元件的方法中發射一個事件(如s),傳一個資料(如lalala);

2.父元件中,定義一個方法(如getData)用來拿到子元件的資料。

3.在自定義的元件上繫結子元件傳過去的事件(s),執行事件(s)執行的是getData函式,getData函式中拿到資料(data,就是子元件傳過去的lalala)資料同步

<div id="app">
<parent></parent>
</div>
<template id="parent">
<div>
    <h1>父元件 <mark>{{msg.name}}</mark></h1>
    <children :n="msg"></children>
</div>
</template>
<template id="children">
    <h2 @click="changeData">子元件 {{n.name}}</h2>
</template>
<script>
    //資料同步的核心:父元件給子元件傳遞“引用資料型別的資料”;
    var app=new Vue({
        el:'#app',
        components:{
            parent:{
                template:'#parent',
                data(){
                    return {msg:{name:'hahha'}}
                },
                components:{
                    children:{
                        props:['n'],
                        template:'#children',
                        methods:{
                            changeData(){
                                this.n.name='lallala'
                            },
                        }
                    }

                }
            }
        }
    })
</script>//
複製程式碼

資料不同步(不直接使用父元件傳的值,用data屬性再自己的元件內做一箇中間變數,防止報錯)

<parent></parent>
</div>
<template id="parent">
<div>
    <h1>父元件 <mark>{{msg}}</mark></h1>
    <children :n="msg"></children>
</div>
</template>
<script>
    //資料不同步的核心:中間變數接收避免報錯;
    var app=new Vue({
        el:'#app',
        components:{
            parent:{
                template:'#parent',
                data(){
                    return {msg:'hahha'}
                },
                components:{
                    children:{
                        props:['n'],
                        template:'<h2 @click="changeData">子元件 {{b}}</h2>',
                        data(){
                            return {b:this.n}
                        },
                        methods:{
                            changeData(){
                                this.b='lallala'
                            },
                        }
                    }
                }
            }
        }
    })//歡迎加入全棧開發交流群一起學習交流:864305860
</script>
複製程式碼

元件中的data必須是函式

每個元件都是互相獨立的,如果它們共用一個物件,

在更改一個元件資料的時候,會影響其它元件,如果是函式的話,

每個元件都有都是又自己獨立的資料,互相不會影響。

受限制的元素

Vue在瀏覽器解析和標準化HTML後才能獲取模板內容, 所以有些元素限制了能被它包裹的元素。

例如:ul中只能放li;select中只能放option

某些元素中放入了自定義元素,

不符合W3C標準,最終會解析錯誤。

關於DOM模板的解析

當使用 DOM 作為模版時 (例如,將 el 選項掛載到一個已存在的元素上), 你會受到 HTML 的一些限制,因為 Vue 只有在瀏覽器解析和標準化 HTML 後才能獲取模板內容。尤其像這些元素

    ,,

相關文章