2.2 Vue 组件化的深入

组件化
组件是Vue.js最强大的功能之一
  • 可以扩展HTML元素,封装可重用代码。
  • 在较高层面上是自定义的元素,Vue.js的编译器为它添加特殊功能。
  • 在有些情况下也可以是原生HTML元素的形式,以is特性扩展。
组件创建
  1. 调用 Vue.extend(),创建名为myComp的组件, template定义模板的标签,模板的内容需写在该标签下。
    var myComp = Vue.extend({
       template: '<div>只是我的组件</div>'
    })
    
  2. <template>标签创建,需要加上id属性。
    <template id="myComp">
        <div>这是template标签构建的组件</div>
    </template>
    
  3. <script>标签创建,需加id属性,同时还得加type="text/x-template"不执行编译里面的代码
    <script type="text/x-template" id="myComl">
        <div>这是script标签构建的组件</div>
    </script>
    
组件注册
  • 全局注册
    1.调用Vue.extend(), 创建名为myComp的组件全局注册
    Vue.component('my-comp',myComp)
    
    2.template及script标签构建的组件全局注册
    Vue.component('my-comp',{
        template: '#myComp'
    })
    
  • 局部注册
    1.调用Vue.extend(), 创建名为myComp的组件局部注册(只能在注册该组件的实例中使用,一处注册,一处使用)
    var app = new Vue({
        el: '#app',
        components: {
            'my-comp': myComp
        }
    })
    
    2.template及script标签构建的组件局部注册。
     var app = new Vue({
         el: '#app',
         components: {
             'my-comp': {
                 template: '#myComp'
             }
         }
     })
    
处理边界情况
  1. 访问根实例
    // 获取根组件的数据
    this.$root.foo
    
    // 写入根组件的数据
    this.$root.foo = 2
    
  2. 访问父级组件实例
    <google-map>
        <google-map-region v-bind:shape="cityBoundaries">
            <google-map-markers v-bind:places="iceCreamShops">
            </google-map-markers>
        </google-map-region>
    </google-map>
    
    this.$parent.XXX
    
  3. 访问子组件实例或子元素
    // 通过ref特性为这个子组件赋予一个ID引用
    <base-input ref="usernameInput"></base-input>
    
    // 访问usernameInput子组件
    this.$refs.usernameInput
    
  4. 依赖注入
    // 地图组件的完善
    provide: function () {
        return {
            getMap: this.getMap
        }
    }
    inject: ['getMap']
    
混入(mixin)
混入(mixin)基本用法

混入(mixin)提供了一种非常灵活的方式,来分发Vue组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

// 定义一个混入对象
var myMixin = {
    created:function () {
        this.hello()
    },
    methods: {
        hello:function () {
            console.log('hello from mixin!')
        }
    }
}
// 定义一个使用混入对象的组件
var Component = Vue.extend({
    mixins:[myMixin]
})
var component = new Component() // => "hello from mixin!"
mixin全局混入

混入也可以进行全局注册。使用时格外小心! 一旦使用全局混入,它将影响每一个之后创建的Vue实例。使用恰当时, 这可以用来为自定义选项注入处理逻辑。

// 为自定义的选项‘myOption’注入一个处理器
Vue.mixin({
    created: function () {
        var myOption = this.$options.myOption
        if(myOption) {
            console.log(myOption)
        }
    }
})

new Vue({
    myOption: 'hello!'
})
// => "hello!"
mixin选项合并

当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”。

var mixin = {
    data: function () {
        return {message:'hello',foo:'abc'}
    }
}
new Vue({
    mixins: [mixin],
    data: function () {
        return {message:'goodbye',bar:'def'}
    },
    created: function () {
        console.log(this.$data)
        // => {message:"goodbye",foo:"abc",bar:"def"}
    }
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

痴心的萝卜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值