组件

一、作用

提高代码的复用性

二、注册

1、全局注册

Vue.component('my-component',{
    template: '<div>我是组件内容</div>'
})

优点: 所有vue实例都可以使用

缺点: 权取太大,容错率降低

2、局部注册

var app = new Vue({
    el: '#app',
    components:{//切记component后边要加s
        'my-component':{
            template:'<div>我是局部注册的一个组件</div>'
        }
    }
}}

3、 vue 组件模板受html限制

在某些情况下会受到html标签的限制

比如直接在table中使用组件是无效的,可以使用 is属性来挂载组件

//html
<div id="app">
  <my-component>我是组件内容</my-component>
  
  <table>
     <my-component>我是组件内容</my-component>
  </table>
  // 无效是因为table 中 只能有 tr,td,tbody这些元素,改成用is属性即可
  
  <table>
    <tbody is="my-component"></tbody>
  </table>
  
</div>

//js
...
Vue.component('my-component',{
    template:'<div>我是组件内容</div>'
})

var app = new Vue({
    el: '#app'
}

三、技巧

1、必须用小写字母命名(child、mycomponent 命名组件)

2、template 中的内容必须是被一个DOM 元素包括,也可以嵌套

3、在组件定义中,除了template外,其他选项也可以用(data、computed、methods)

4、data 必须是一个方法

// html
<div id="app">
 <btn-component></btn-component>
<div>

//js
...
components:{
  'btn-component':{
      template: '<button @click="count++">{{count}}</button>',
      data:function(){ //切记data必须是一个方法
          return{ //每次return 返回的是不同的 data对象
                  count:0
          }
       }
    }
 }
  

【Demo实例 https://jsbin.com/fucotab/edit?html,output

四、props传递数据 父传子

1、在组件中使用props 从父组件接收参数,注:在props中定义的属性,都可在组件中直接使用

2、props 来自 父级的数据 ,而组件中data return的数据是组件自已的数据,两种情况作用域就是组件本身,可在template、computed、methods中直接使用

//html
<div id="app">
    <h5>我是父组件</h5>//1、父组件通过msg给子组件传递消息:在子组件subcomponent上写上msg 等于一个内容
    <subcomponent msg="我是父组件传递的内容"></subcomponent>
</div> //2、子组件要用到父组件传过来的消息

//js
...
components:{
    subcomponent:{
        props: ['msg'], //数据来自父组件 2.1 props定义msg (以字符串数组形式)
        template:'<div>{{msg}}</div>' // 2.2 模板 template 就可以直接用了
    }     
}   


3、props的值有两种: 一种是字符串数组(上述小例子就是),另一种是对象

4、可以用v-bind动态绑定父组件来的内容

//html
....
<subcomponent msg="我是来自父组件的内容"></subcomponent>
<input type="text" v-model="parentMsg"> // 1、input v-model绑定的数据是父组件data 中的数据
{{ parentMsg}} 
//2、把绑定的数据同时传递给子组件: 通过v-bind绑定属性msg,把属性msg用props进行接收
<bindcomponent v-bind:msg="parentMsg"></bindcomponent>

//js
...
data:{
  parentMsg: '开始啦'      
}
components:{
    'bindcomponent':{
        props: ['msg'],
        template: '<div>{{msg}}</div>'//3、就可以在template中直接使用
    }     
}

【Demo实例 https://jsbin.com/jodaxer/1/edit?html,output

参考 https://cn.vuejs.org/v2/guide/components-props.html

五、单向数据流props使用场景

1、 第一种:

​ a、父组件:传递初始值

​ b、子组件:将它作为初始值保存起来,在自已的作用域下,可随意使用或修改

​ 这种情况,可以在组件 data 内再声明一个数据,引用父组件的 props

//html  
<div id="app"> //2.1 将父组件的数据传递进来
   <my-component msg="父组件传递的消息"></my-component>
</div>

//js
var app = new Vue({
   el: '#app',
   components:{ // 1、注册组件
       'my-component':{
           props: ['msg'],//2.2 在子组件中用props接收数据
           template: '<div>{{count}}</div>',
           data:function(){
             return{ //将传递进来的数据用初始值保存起来
               count: this.msg//props中的值可以通过this.xxx直接来进行获取
             } 
           }
       }
   }
})
   
分三步曲完成:
1、 注册组件
2、将父组件的数据传递进来,并在子组件中用props接收
3、将传递进来的数据通过初始值保存起来

2、 第二种

props 作为需要被转变的原始值传入,这种情况 用 计算属性 就可以

//html
<div id="app">
 <input type="text" v-model="width">
 <my-component :width="width"></my-component>//2.1 将父组件的数据传递进来
</div>

//js
var app = new Vue({
    el: '#app',
    data:{
        width: 0
    },
    components:{//1、注册组件
        'my-component':{
            props: ['width'],//2.2 在子组件中用props接收数据
            template:'<div :style="style"></div>',
            computed:{//3、将传递进来的数据,通过计算属性重新计算工
                style:function(){
                    return{
                        width: this.width+'px',
                        background:'green',
                        height:'20px'
                    }
                }
            }
        }
    }
})

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