前端培训-中级阶段(36)- vue 2.x 组件定义和使用、组件间的通讯

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,如今前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提高技术水平,打牢基础知识的中心思想,咱们开课啦(每周四)。html

Vue 组件

组件开发在 Vue 使用中很常见,好处有不少 解耦、并行开发、复用 等等。前端

使用上也很简单,咱们能够对比一下 elementUI 的 el-input原生的 inputvue

<el-input v-model="val">
<input v-model="val">

注册组件

组件能够理解为可复用的 Vue 实例,因此与 new Vue 接收相同的选项,例如 datacomputedwatchmethods 以及生命周期钩子等。vuex

全局注册组件

经过 Vue.component 进行全局注册,注册以后能够用任何地方,包括组件树中的全部子组件的模板中。segmentfault

// 定义一个名为 v-input 的全局组件
Vue.component('v-input', {
  data: function () {
    // data 必须是一个函数
    // 这样才能在多个位置使用时,多个组件不存在引用关系
    return {
      val: ''
    }
  },
  // template 必须有一个根节点。
  // 每一个组件必须只有一个根元素(every component must have a single root element )
  template: `
      <div>
        <input v-model="val">
        val: {{val}}.
      </div>
  `
})

局部注册组件

局部注册就是在 components 里面写,只能用在当前组件模板中。微信

new Vue({
    el: '#app',
    components: {
        'v-input': {
          data: function () {
            // data 必须是一个函数
            // 这样才能在多个位置使用时,多个组件不存在引用关系
            return {
              val: ''
            }
          },
          // template 必须有一个根节点。
          template: `
              <div>
                <input v-model="val">
                val: {{val}}.
              </div>
          `
        }
})

组件通讯

父子组件

父组件向子组件传值 props

父组件:app

<v-avatar avatar="https://www.lilnong.top/favicon.ico"></v-avatar>

子组件:函数

Vue.component('v-avatar', {
  props: ['avatar'],
  template: '<img :src="avatar">'
})
子组件向父组件传值 $emit

测试地址:https://www.lilnong.top/static/html/sf-a-1190000022616927-vue-emit.html
父组件:测试

<v-input :value="val" @input="val = $event"></v-input>

子组件:this

Vue.component('v-input', {
    props: ['val'],
    template: '<input :value="val" @input="emitInput">',
    methods:{
        emitInput(e){
            this.$emit('input', e.target.value)
        }
    }
})
使用 v-model

通常在咱们使用中 v-model 的方式更经常使用

<input v-model="val">
<el-input v-model="val"></el-input>

那么 v-model 是如何实现父子组件通讯的呢?

原生 DOM
<input v-model="val">
等价于
<input v-bind:value="val" v-on:input="val = $event.target.value" >

自定义组件
<v-input v-model="val"></v-input>
等价于
<v-input :value="val" @input="val = $event"></v-input>

从上面咱们能够看到, v-model 相似于语法糖,本质上是经过绑定 value 和 input。

使用 .sync 修饰符

<text-document v-bind:title.sync="doc.title"></text-document>

等价于

<text-document v-bind:title="doc.title" v-on:update:title="doc.title = $event" ></text-document>

子组件中更新时: this.$emit('update:title', newTitle)

在有些状况下,咱们须要对一个 prop 进行“双向绑定”。
不幸的是,真正的双向绑定会带来维护上的问题,由于子组件能够变动父组件,且在 父组件和子组件都没有明显的变动来源
推荐以 this.$emit('update:myPropName') 的模式触发事件取而代之。

跨层级

  1. vuex
  2. eventBus

微信公众号:前端linong

clipboard.png

参考文献

  1. 前端培训目录、前端培训规划、前端培训计划
相关文章
相关标签/搜索