最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vue详解 mixins & slots

    正文概述 掘金(IMT_frog)   2021-06-17   501

    好久没写文章了,鸽了时间有点久~ 那么最近在忙啥呢?嘿嘿,我先不说。

    今天给大家开一个新坑,讲一讲跟Vue相关的知识点。此坑不深,纯属入门~

    什么是 mixins

    讲之前呢,先看下官方解释:“混合”。晦涩难懂。什么是混合?混合啥?一头雾水。

    既然这玩意说的深奥,那就练练呗,看看这个混合到底是个啥。

    这里卖个关子,先不说,这个东西到底是什么。看完咋直接来一个轻描淡写的总结。

    话不多说,走起~

    先来看个栗子:(这个栗子的前提,是你在知道 vue 的组件实现的前提下。不过不了解,也没关系。影响也不是很大,后面再补吧)

    ``` vue 组件 
    
        Vue.component('tishi',{
            template `
                <div>
                <div @mouseenter = 'func1' @mouseleave = 'fnc2'>提示</div>
                <div v-if='flag'>
                我是一个hover的小可爱~
                </div>
                </div>
            `,
            data : function(){
                    return {
                        flag:false
                    }
            },
            methods : {
                func1(){
                    this.flag = true
                },
                func2(){
                    this.flag = false
                },
            }
        
        })
        
        Vue.component('toogle',{
            template `
                <div>
                <button @click='func3'>显示/隐藏</button>
                <div @click='fnc4'>关闭</div>
                <div v-if='flag'>
                我是一个可显示可隐藏的小可爱~
                </div>
                </div>
            `,
            data : function(){
                return {
                    flag:false
                }
            },
            methods : {
                func3(){
                    this.flag = !this.flag
                },
                fnc4(){
                    this.flag = false
                }
            }
        })
        
        new Vue({
            el:'#app',
            data:{
            
            }
        })
    

    要是知道组件的同学,肯定能看出来,这边是分别实现了两个组件,一个对外组件是:<tishi></tishi>,另一个是 <toogle></toogle>

    先来解释一下,这两个是分别干嘛的,第一个 tishi 就是说,你的鼠标事件进出的时候,会触发不同的时间,来控制hover小可爱的展示与否,那么第二个,就是点击来隐藏 可显可隐的小可爱。

    那么这两个组件有没有什么共同点呢?聪明的同学可能已经看到了

    这两个对外的组件,都分别有自己的属性:flag,以及一个 hide 方法,不是吗。这... 对于程序员来讲,是无法忍受的。同样一个方法,要写两遍,简直头都大了。

    这个时候,就会潜意识的想到,怎么能够偷懒呢?

    好了,当你想到这个问题的时候,重点就来了,这就是mixins了。来看下怎么用

    栗子改一改,加上 mixins:

    ``` vue 组件 
    
        const common ={
            data : function(){
                    return {
                        flag:false
                    }
            },
            methods : {
                func1(){
                    this.flag = true
                },
                func2(){
                    this.flag = false
                },
                func3(){
                    this.flag = !this.flag
                },
            }
        }
    
        Vue.component('tishi',{
            template `
                <div>
                <div @mouseenter = 'func1' @mouseleave = 'fnc2'>提示</div>
                <div v-if='flag'>
                我是一个hover的小可爱~
                </div>
                </div>
            `,
            mixins:[common]
        
        })
        
        Vue.component('toogle',{
            template `
                <div>
                <button @click='func3'>显示/隐藏</button>
                <div @click='fnc2'>关闭</div>
                <div v-if='flag'>
                我是一个可显示可隐藏的小可爱~
                </div>
                </div>
            `,
            mixins:[common]
        })
        
        new Vue({
            el:'#app',
            data:{
            
            }
        })
    

    改好了,大家看看有什么区别。

    是不是一眼就能看出来了,我们就是吧这两个组件用到的共同的属性,方法,都提取出来,放到了一个对象下面。然后在各自的组件中引入就可以了,mixins:[common] 。接着就是只要把 fnc4 改成 fnc2 就行了啊,方法是一模一样啊。

    简直快乐。这样,就算后面还有其他组件需要创建一些共同属性也好,方法也好。都只要在common 中去实现,组件中调用就可以了啊,方便,程序看起来也很舒服。

    而这边的mixins 在组件中,会通当前所调用的组件进行合并。就是说,你那个组件中引入,那么data以及methods就直接被 引入的组件来实例使用。

    当然,这里小伙伴可能会问,要是我在组件中,需要自定义其他的一些属性或者方法怎么办?

    简单!就直接在你想加入自定义的组件中,去写自己的data,或者 mothods 就好了。这个时候,就算引入了 mixins 也会被当前自身的覆盖。优先级权重,组件本身是大于common的。

    好了,说完了,这个时候,就可以回到开始卖的关子了:到底什么是混合?相信大家已经有自己的答案了。其实这个混合就是:多组件中,重复方法,或者重复属性的 一个 容器 罢了。容器这个词,大家要区别学术上所谓的容器哦~

    好啦,mixins,讲完,我们接着看 slots

    什么是 slots

    老规矩,依然看一下,官方定义: 插槽。emmm。是不是又懵了,什么玩意啊,刚来个混合,现在又来个插槽?这明显是搞事情啊。

    哈哈哈,别急,刚刚混合,都被搞明白是怎么回事了,还怕这一个插槽吗?

    再走一个。咱就不信邪不是。

    依然是 举个栗子( 展示一下组件的另一种写法,详细的要去看组件那块咯,要是有需求,评论留言,我就开新坑 )

    ``` vue 组件 
    // page
    
       <div id='app'>
           <card></card>
       </div>
       
       ---------------------------------------------------------
       
    // js
    
       <template id='zujian'>
           <div>
               <div>title</div>
               <div>content</div>
               <div>desc</div>
           </div>
       </template>
        
        Vue.component('card',{
            template : '#zujian'
        })
        
        new Vue({
            el:'#app',
            data:{
            
            }
        })
    

    好了,这个组件已经写完了,有部分同学,可能看不懂写的是什么,其实这边想表达的是一个卡片组件。

    那么我这个写的是个啥玩意?emmm,就是卡片组件啊。那就讲讲,写这个的目的,就比方说,在之后的开发过程中,可能需要用到一套卡片组件,那么是不是就可以 同以上的方法一样,去写一个了。

    那么如果在一个项目中,需要用到多个卡片,并且需要内容文本,不能够一直是:title,content,desc,那同学们想想,是去再写一个组件引入,还是怎么做?

    那我们就给这个组件改改吗。

    栗子 改一改 1.0

    ``` vue 组件 
    // page
    
       <div id='app'>
           <card>666啊</card>
       </div>
       
       ---------------------------------------------------------
       
    // js
    
       <template id='zujian'>
           <div>
               <div>title</div>
               <div><slot></slot></div>
               <div>desc</div>
           </div>
       </template>
        
        Vue.component('card',{
            template : '#zujian'
        })
        
        new Vue({
            el:'#app',
            data:{
            
            }
        })
    

    改完了,这个时候,会发生什么?同学们猜一猜。哈哈哈,是不是很明显了,这个就变成动态的了啊。

    在没改之前,我们引入 card 组件,永远都只能是 title,content,desc,现在我们可以动弹了啊。我们可以在引用card的时候,就去制定内容,来替换content啊。

    这多么完美的解决了动态引入卡片组件不能定制化的问题。

    那这样就可以了吗?这也只能改一个啊。我要是想改多个怎么办?嘤嘤嘤。

    不信邪,再来

    栗子 改一改 2.0

    ``` vue 组件 
    // page
    
       <div id='app'>
           <card>
               <div slot = 'title'>嗨呀,我是头啊<div>
               <div slot = 'content'>嗨呀,我是身体啊<div>
               <div slot = 'desc'>嗨呀,我是描述啊<div>
           </card>
       </div>
       
       ---------------------------------------------------------
       
    // js
    
       <template id='zujian'>
           <div>
               <div><slot name='title'></slot></div>
               <div><slot name='content'></slot></div>
               <div><slot name='desc'></slot></div>
           </div>
       </template>
        
        Vue.component('card',{
            template : '#zujian'
        })
        
        new Vue({
            el:'#app',
            data:{
            
            }
        })
    

    这个时候,会发生什么。大胆一点,说出你们的答案。

    是不是,我只要定义一个卡片组件,就可以引入多需求啊,不管业务方说要我引入多少,我都照做。这还不简单吗?

    slot 说到这,相信大家肯定也已经知道这是干嘛用的了。这个定义是插槽,怪叫人难受的。但是通过这个例子,大家肯定知道这个是干嘛用的,总结的话,都在评论下面,大胆发挥。

    最终总结

    说完以上两点,其实只是通过简单的组件引用,来描述这两个功能可以怎么用,并且是干嘛的。但其实,这两个怎么在项目中,合适的使用,用的恰到好处,其实,还是看各位小伙伴 去结合本身业务需求了。

    写在最后

    本来这一节准备顺带聊聊 vuex 和 vue-router,但是感觉,这两个好像都各自需要一个篇幅去讲解。后面有时间再去开新坑,给大家聊一聊这两个。

    还有,最近我在忙啥,哈哈哈哈,学习剪视频去了,准备转型做个阿婆主了~,一键三连~

    好了,今天差不都就讲完了,要是觉得不错就点个赞吧。拜拜~


    起源地下载网 » Vue详解 mixins & slots

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元