初识Vue2.0 组件

Vue.component (组件名称,组件对象) 这一步叫做注册组件
全局注册组件后,就可以在整个应用中使用这个组件

注册全局组件

创建组件的方法:

  1. 第一种方式
    全局注册一个组件 Vue.component(组件名称,组件对象),全局注册后,就可以在整个应用中使用这个组件,使用方式是在body里面<my-component></my-component>
var myComponent = Vue.extend({
    template : "<h1>第一个 Vue 组件</h1>"
  });
Vue.component("my-component",myComponent);

  1. 第二种方式:直接写 ,简化,使用方式,也是在body里面写一个标签<my-component2></my-component2>,
vue.component ("my-component2",{
  template :"<h1>第二个 Vue 组件</h1>"
})

这种方式创建的是全局组件,接下来的方式是创建局部组件.配置子组件

局部组件注册

  1. 类似methods配置项的方式,配置子组件
var vm = new Vue ({
  el : "#box", //指定挂载元素
  data : {
     msg : "this is father's msg", 
   },
  components : {//配置子组件
      "my-component3" : {
         template : "<h1>第三个 Vue 组件</h1>",
      },
  },
  })
  1. 第四种方式:先声明一个模板对象,
var m4 = {
  template: "<h1>第4个组件</h1>"
}

在Vue实例 的 组件配置里面 ,写一个键值对

var vm = new Vue ({
     el : "#box", //指定挂载元素
     data : { 
            },
      components : {
                "my-component4" : m4,// 把变量赋值给 组件4
      }
   })

以上就是第四种组件的声明方式

父向子传递值

注意:
1, vue的子集无法直接访问到父集的属性和变量,这是单项绑定,在Vue 中,组件的作用域,默认是隔离的,如果,子组件想访问到父集的数据,则需要父集显示的向下传递,如何显示的向下传递呢? 用props
props 可以是数组形式接收属性,也可以是对象形式,,对象类型的也可以自定义验证,用validator

   <div id="box">
    <my-component4 :msg="msg" 
            :a="age" 
            :b="price"
            :i="isShow"></my-component4>父向子传值
            <!--v-bind:msg 普通传递传递的是一个字符串,用v-bind:绑定一下 对应的将会是一个变量-->
        </div>
    </body>
    <script src="vue2.0.js"></script>
    <script>
        var m4 = Vue.extend({
            template : `
                <div>
                    <h1>第四个 Vue 组件</h1>
                    <h1>{{ msg }}</h1>
                    <h1>{{ a }}-{{ i }}-{{ b }}</h1>
                </div>
                `,//在template后面补一个配置项
            // props : ["msg","a","is"],//数组模式 //通过props达到父组件向子集传值的目的
            props : {//对象模式
                msg : null,
                // msg : String,
                // a : Number,
                a : {
                    type : Number,
                    required : true,//必须传入
                },
                b : {
                    validator : function(val){
                        return val>10;
                    }
                },
                i : Boolean,
            }
        })
        var vm = new Vue ({
            el : "#box", //指定挂载元素
            data : {
                msg : "this is father's msg",
                age : 7,
                isShow : true,
                price : 11,
            },
            components : {//配置子组件
                "my-component4" : m4,// 把变量赋值给 组件4
            }
        })
    </script>

子向父传递值

绑定事件,发送$emit 事件

<div id="box">
            {{ num }}--{{ msg }}
            <my-component @pfun="fun"></my-component>
        </div>
    </body>
     <script src="vue2.0.js"></script>
     <script>
         var vm = new Vue({
             el : "#box",
             data : {
                 msg: "hell china!!!",
                 num : 0,
             },
             components : {
                 "my-component" : {
                     template : `
                     <div>
                        <h1> 组件</h1>
                        <button @click='cfun'>呼唤父</button>
                     </div>
                     `,
                     data : function(){
                         return {
                             num : 0,
                         }
                 },
                 methods : {
                     cfun : function(){
                         console.log("子准备呼喊");
                         this.$emit("pfun",1000);
                     }
                 },
                 computed : {},
             },
             "other-component" : {}
         },
         methods : {
            fun : function(money){
                    console.log("收到来自子的呼唤",money);
                    this.num = money;
                },
         }
    })
     </script>

---------------------分割线-------------------------------

data数据声明和 $refs 和 ref

组件内部的data ,必须是一个function,并且function必须返回一个val

  1. 为了解决地址传递的问题,在组件中声明 data 必须为函数
  2. 在组件中声明data.必须是一个函数,堆栈图,data是一个地址,指向了一个仓库,
  3. 如果需要获取 DOM 元素,可将元素以 ref='name' 进行标识
    可以通过 this.$refs.name 得到对应 name 的 DOM元素, 少用,
 <script>
        var  d = { num :0 };
        var vm = new Vue({
            el : "#box",
            data : {
                msg : "Hello Vue!!!",
                num : 0,
            },
            components : {
                "my-component" : {
                    template : `
                    <div>
                        <h1 @click="say">子组件</h1>
                         {{ num }}
                        <button @click="num=num+1">{{ num }}</button>
                        <input type='text' value='123' ref='mi'/>
                    </div>
                    `,
                    data : function(){
//引用类型  js数据类型,基础数据类型,引用数据类型,地址引用,不是值传递
//且返回一个新对象,这样每一个组件用到的 data 是一块新的内存地址  组件中互不影响.
                        return {
                            num : 0
                        }
                    },
                    // data : function(){
                    //     return d;
                    // },
                    methods : {
                        say : function(){

  //如果需要获取 DOM 元素,可将元素以 ref='name' 进行标识
 //可以通过 this.$refs.name 得到对应 name 的 DOM  少用,
                            this.$refs.mi.focus();
                            console.log("hello china",this.num)
                        }
                    }
                },
            },
            methods : {},
            computed : {},
        })
    </script>

componnet 可以作为一个vue使用,他是一个完整的组件,可以有data,也可以有methods.computed,
全局vue 中,也可以有这些.
在使用组件的时候,
$emit () this.$emit()触发什么事件,在jquery中,用trigger 去触发自定义事件,
在Vue中,用 $emit() 去触发自定义事件,

动态组件

组件可以根据动态组件的切换渲染页面

在body里面写一个标签 <componnet></component>
给标签绑定一个属性,<componnet :is=""></component> 这个属性是固定的,就是 :is 这就是绑定动态属性
绑定一个 currentView <componnet :is="currentView"></component> 然后可以通过切换,@click="currentView=''home""或者""cart""或者"mine切换页面"

angular 用ui-view ,vue用 currentView
is所绑定的值,必须在component 被注册

插槽

slot
mine 想套小组件的时候,要使用插槽,使用方法
插槽其实也叫内容分发,
具名插槽,含有 name 属性的 slot 标签,
在组件渲染模板时,会抛弃标签内的原始内容,为了保留原始内容,
可以在模板内通过slot 标签预留插槽位
原始内容,(不含 slot 属性的) 会默认放到匿名插槽内
含有 slot 属性的,会去查找对应的插槽,未找到,将抛弃内容,

<div id="box">
          <my-main>
              <!--组件在渲染的时候会丢掉所有的原始内容-->
                <my-header slot="h"></my-header>
                <p>这是原始的p 无指定插槽  匿名插槽 具名插槽 
                   
  </p>
  <my-footer slot="f"></my-footer>
          </my-main>
        </div>
    </body>
     <script src="vue2.0.js"></script>
     <script>
         //动态组件
         var vm = new Vue({
             el : "#box",
             data : { 
             },
             components : {
                  "my-header" : {
                      template : `<h1>this is header</h1>`,  
                  },
                  "my-footer" : {
                      template : `<h1>这是footer</h1>`,
                  },
                  "my-main" : {
                      template : `
                      <div>
                        <slot name = 'h'></slot>
                        <h1>this is main</h1>
                        <slot></slot>
                        <slot name = 'f'></slot>
                      </div>
                      `,
                  },           
            },
            methods : {},
            computed : {},
        })
     </script>

组件渲染的时候会丢弃组件内部的原始内容,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,040评论 0 29
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,183评论 0 6
  • 此文基于官方文档,里面部分例子有改动,加上了一些自己的理解 什么是组件? 组件(Component)是 Vue.j...
    陆志均阅读 3,794评论 5 14
  • 下载安装搭建环境 可以选npm安装,或者简单下载一个开发版的vue.js文件 浏览器打开加载有vue的文档时,控制...
    冥冥2017阅读 6,015评论 0 42
  • 写给兄弟的一封信 亲爱的弟弟: 你好吗?希望你一切都好,我不知道你在哪里,今在何方,也不知道你过得怎么样,手机又打...
    秭归秀才9条命儿阅读 9,607评论 0 2