Vue之非單文件組件(定義組件步驟及注意點)


Vue中使用組件的三大步驟:

                    一、定義組件(創建組件)
                    二、注冊組件
                    三、使用組件(寫組件標簽)

 

            一、如何定義一個組件?
                        使用Vue.extend(options)創建,其中options和new Vue(options)時傳入的那個options幾乎一樣,但也有點區別;
                        區別如下:
                                1.el不要寫,為什么? ——— 最終所有的組件都要經過一個vm的管理,由vm中的el決定服務哪個容器。
                                2.data必須寫成函數,為什么? ———— 避免組件被復用時,數據存在引用關系。
                        備注:使用template可以配置組件結構。

 

            二、如何注冊組件?
                            1.局部注冊:靠new Vue的時候傳入components選項
                            2.全局注冊:靠Vue.component('組件名',組件)

 

            三、編寫組件標簽:
                            <school></school>
 
幾個注意點:
                    1.關於組件名:
                                一個單詞組成:
                                            第一種寫法(首字母小寫):school
                                            第二種寫法(首字母大寫):School
                                多個單詞組成:
                                            第一種寫法(kebab-case命名):my-school
                                            第二種寫法(CamelCase命名):MySchool (需要Vue腳手架支持)
                                備注:
                                        (1).組件名盡可能回避HTML中已有的元素名稱,例如:h2、H2都不行。
                                        (2).可以使用name配置項指定組件在開發者工具中呈現的名字。

                    2.關於組件標簽:
                                第一種寫法:<school></school>
                                第二種寫法:<school/>
                                備注:不用使用腳手架時,<school/>會導致后續組件不能渲染。

                    3.一個簡寫方式:
                                const school = Vue.extend(options) 可簡寫為:const school = options

非單文件組件(了解):一個文件包含n個組件

  1. 模板編寫沒有提示
  2. 沒有構建過程, 無法將 ES6 轉換成 ES5
  3. 不支持組件的 CSS
  4. 真正開發中幾乎不用

代碼舉例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>基本使用</title>
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <!-- 准備好一個容器-->
        <div id="root">
            <hello></hello>
            <hr>
            <h1>{{msg}}</h1>
            <hr>
            <!-- 第三步:編寫組件標簽 -->
            <school></school>
            <hr>
            <!-- 第三步:編寫組件標簽 -->
            <student></student>
        </div>

        <div id="root2">
            <hello></hello>
        </div>
    </body>

    <script type="text/javascript">
        Vue.config.productionTip = false

        //第一步:創建school組件
        const school = Vue.extend({
            template:`
                <div class="demo">
                    <h2>學校名稱:{{schoolName}}</h2>
                    <h2>學校地址:{{address}}</h2>
                    <button @click="showName">點我提示學校名</button>    
                </div>
            `,
            // el:'#root', //組件定義時,一定不要寫el配置項,因為最終所有的組件都要被一個vm管理,由vm決定服務於哪個容器。
            data(){
                return {
                    schoolName:'西華大學',
                    address:'成都郫縣'
                }
            },
            methods: {
                showName(){
                    alert(this.schoolName)
                }
            },
        })

        //第一步:創建student組件
        const student = Vue.extend({
            template:`
                <div>
                    <h2>學生姓名:{{studentName}}</h2>
                    <h2>學生年齡:{{age}}</h2>
                </div>
            `,
            data(){
                return {
                    studentName:'wangxq',
                    age:22
                }
            }
        })
        
        //第一步:創建hello組件
        const hello = Vue.extend({
            template:`
                <div>    
                    <h2>你好啊!{{name}}</h2>
                </div>
            `,
            data(){
                return {
                    name:'tanglb'
                }
            }
        })
        
        //第二步:全局注冊組件
        Vue.component('hello',hello)

        //創建vm
        new Vue({
            el:'#root',
            data:{
                msg:'你好啊!'
            },
            //第二步:注冊組件(局部注冊)
            components:{
                school,
                student
            }
        })

        new Vue({
            el:'#root2',
        })
    </script>
</html>

運行結果:hello是全局組件,分別使用2個vm實例展示hello組件,來區分全局組件和局部組件的使用,局部組件作用於定義的該局部組件的vm實例,而全局組件,所有vm實例都可以使用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM