前端最基础的就是 HTML+CSS+Javascript
。掌握了这三门技术就算入门,但也仅仅是入门,如今前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS
),本着提高技术水平,打牢基础知识的中心思想,咱们开课啦(每周四)。html
组件开发在 Vue 使用中很常见,好处有不少 解耦、并行开发、复用 等等。前端
使用上也很简单,咱们能够对比一下 elementUI 的 el-input 和 原生的 input。vue
<el-input v-model="val"> <input v-model="val">
组件能够理解为可复用的 Vue 实例,因此与 new Vue
接收相同的选项,例如 data
、computed
、watch
、methods
以及生命周期钩子等。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> ` } })
父组件:app
<v-avatar avatar="https://www.lilnong.top/favicon.ico"></v-avatar>
子组件:函数
Vue.component('v-avatar', { props: ['avatar'], template: '<img :src="avatar">' })
测试地址: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
的方式更经常使用
<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')
的模式触发事件取而代之。