Vue组件学习笔记

组件用法

  1. 全局注册

    Vue.component('my-component', {
        //选项
    })
    

    缺点:权限太大,容错率低

  2. 局部注册

    new Vue({
        el: '#app',
        components: {
            'my-component': {
                //选项
            }
        }
    })
    

注意事项

html不分大小写,js区分大小写
自定义标签名称推荐小写和减号分割的形式书写
template的DOM结构必须被元素包裹,纯文本无法渲染
组件有时会受html的限制。像table内规定只允许<tr>,<td>,<th>,可以使用特殊的'is'属性来挂载。
<tbody is='my-component'></my-component>
组件跟实例一样带有data, methods, computed等属性
组件的data属性必须是函数, rutrun出数据(这样组件间的数据就是独立的)

使用props传递数据

在组件中,使用选项 props 来声明需要从父级接收的数据, props 的值可以是两种, 一种是字
符串数组,一种是对象 。

props 中声明的数据与组件 data 函数 return 的数据主要区别就是 props 的来自父级,而 data 中
的是组件自己的数据,作用域是组件本身,这两种数据都可以在模板 template及计算属性 computed
和方法 methods 中使用。

有时候,传递的数据并不是直接写死的,而是来自父级的动态数据,这时可以使用指令 v-bind
来动态绑定 props 的值,当父组件的数据变化时,也会传递给子组件。

<div id="app">
  <input type="text" v-model="parentmessage">
  <my-component :message="parentmessage"></my-component>
</div>
<script>
  var app = new Vue({
  el: '#app',
  data: {
    parentmessage: ''
  },
  components: {
    'my-component': {
      template: '<div>{{ message }}</div>',
      props: ['message']
    }
  }
})
</script>

注意:如果你要直接传递数字、布尔值、数组、对象,而且不使用 v-bind,传递的仅仅是字符串

单向数据流

Vue2.x 通过 props 传递数据是单向的了。这样的设计目的是尽可能将父子组件解稿,避免子组件无意中修改了父组件的状态。

父组件数据通过props传进来。子组件可以用data和computed维护一份相联系的数据而不必修改父数据

数据验证

props选项除了数组外,还可以是对象

props: {
    //选项有type(定义多个用数组)、defalut、required(布尔值)、验证函数
    propA: {
        type: [Number, String],
        defalut: true,
        required: true
    },
    propB: {
        validator: function(value){
            return value > 10
        }
    }
}

组件通信

组件关系可以分为父子、兄弟、跨级组件通信

子组件像父组件传递数据:

示例

  1. 使用自定义事件
    子组件用$emit()来触发事件,父组件用$on()来监听子组件的事件

  2. 使用v-model

实现这样一个具有双向绑定的 v-model组件要满足下面两个要求:

  • 接收一个 value属性

  • 在有新的 value 时触发 input事件。

非父子组件通信

在Vue. 2.x中, 推荐使用一个空的Vue实例作为中央事件总线(bus),也就是一个中介.(发布、订阅模式)

比如你需要租房子, 你可能会找房产中介来登记你的需求 , 然后中介把你的信息发给满足要求的出租者,出租者再把报价和看房时间告诉中介,由中介再转达给你,整个过程中 , 买家和卖家 并没有任何交流,都是通过中间人来传话的 。

或者你最近可能要换房了 , 你会找房产中介登记你的信息 , 订阅与你找房需求相关的资讯, 一旦有符合你 的房子出现时,中介会通知 你 ,并传达你房子 的具体信息 。

这两个例子中 , 你和出租者担任的就是两个跨级的组件,而房产中介就是这个中央事件总线 (bus) 。

示例

父链

在子组件中,使用this.$parent可以直接访问该组件的父实例或组件,父组件也可以通过this.$children访问它的所有子组件,而且可以递归向上或向下访问。

尽管Vue允许这样操作,但在业务中,子组件应该尽可能避免依赖父组件的数据。更不该主动修改它的数据。这样父子组件是紧耦合的。

理想状况下,只有组件能修改它的状态。父子组件最好还是通过props$emit$来通信

子组件索引

Vue提供了子组件索引的方法,用特殊的属性ref来为子组件指定一个索引名称

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

推荐阅读更多精彩内容