zoukankan      html  css  js  c++  java
  • 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实例都可以使用

  • 相关阅读:
    vue五十:Vue美团项目之商家详情-查看商品详情
    vue四十九:Vue美团项目之商家详情-tabbar状态切换和导航返回
    vue四十八:Vue美团项目之商家详情-左右联动之商品分类跟随商品列表滚动
    vue四十七:Vue美团项目之商家详情-左右联动之选中商品分类跳转到对应商品列表
    vue四十六:Vue美团项目之商家详情-商品滚动完成
    vue四十五:Vue美团项目之商家详情-商品分类滚动完成
    vue四十四:Vue美团项目之商家详情-导航栏和header布局
    vue四十三:Vue美团项目之首页-tabbar搭建
    vue四十二:Vue美团项目之首页-商家列表
    Ugly Number
  • 原文地址:https://www.cnblogs.com/ftx3q/p/15324419.html
Copyright © 2011-2022 走看看