美文网首页
Vue造轮子-tab组件(下)

Vue造轮子-tab组件(下)

作者: Ories | 来源:发表于2020-01-28 13:12 被阅读0次

    1. 为什么一个 new Vue 可以构造出一个 eventBus

    // 当我们定义了new Vue之后,可以这样用
    var app = new Vue({
        created(){
            this.$emit()
            this.$on()
        }
    })
    
    // 也可以这样用
    app.$emit()
    app.$on()
    app.$off()
    
    // 那么归根结底,只要满足能触发一个事件,监听一个事件,和取消监听一个事件,那么它就是一个事件中心
    eventBus
    eventBus.$emit() // 触发一个事件
    eventBus.$on() // 监听一个事件
    eventBus.$off() // 取消监听一个事件
    
    // 而我们的app 正好全部满足,而app就是 new Vue,new Vue就有这三个接口,所以new Vue就是一个eventHub。
    // 因为它正好有这个三个接口,它的行为完全一样,这就叫基于行为的开发
    
    

    2. 开始写 CSS 样式

    <!-- tabs-head.vue -->
    <style lang="scss" scoped>
      $tab-height: 40px;
      .tabs-head {
        display: flex;
        height: $tab-height;
        justify-content: flex-start;
        align-items: center;
        border: 1px solid red;
        > .actions-wrapper {
          margin-left: auto; // 这样写可以让按钮靠右,不要问为什么就是可以
        }
      }
    </style>
    
    <!-- tabs-item.vue -->
    <style lang="scss" scoped>
      .tabs-item {
        flex-shrink: 0;
        padding: 0 2em; // 用em是因为只关心两个栏之间的间距
      }
    </style>
    

    3.激活属性 active 应该放在 data,还是放在 props

    • 如果需要用户传值,就放到 props 里面,因为 props 是你的输入参数,
    • data 不需要用户传值,自身维护值
        // 抽象的讲,就像写一个函数,prop是外部传递的参数,data相当于局部变量,组件就是一个函数
        function fn(prop1,prop2){
            var data1
            var data2
        }
        // 我们在设计api的时候,没有需要用户传递data,我们是让用户把name传进来,实际上是tabs传递来的
        // tabs传也是传,硬要用props也可以
    

    4.在 mounted 里测试开送事件,不能用 created,因为需要确认元素已经挂载好了

      // app.js的new Vue
      data: {
        selectedTab: 'sports'
      }
    
      // index.html
      <g-tabs :selected.sync="selectedTab" @update:selected="yyy">
        <g-tabs-head>
          <g-tabs-item name="woman">
            <g-icon name="setting"></g-icon>美女
          </g-tabs-item>
        </g-tabs-head>
      </g-tabs>
    
      // tabs.vue发布
        mounted(){
          this.eventBus.$emit('update:selected', this.selected) // 这样写不可以触发外面
        }
    
      // tabs-item监听
        created(){
          this.eventBus.$on('update:selected',(name)=>{
            if(name === this.name){
              console.log(`我${this.name}被选中了`)
            }else{
              console.log(`我${this.name}没被选中了`)
            }
          })
        },
    
      // tabs-pane同理,选中了就把自己变成active
    

    5. 加 class 写成计算属性

      // tabs-item.vue
        <div class="tabs-item" @click="xxx" :class="classes"></div>
        computed: {
          classes() { // classes是一个计算属性
            return {
              active: this.active
            }
          }
        },
        created() {
          this.eventBus.$on('update:selected', (name) => {
            this.active = name === this.name;
          })
        },
    
        // tabs-pane,同理,但是要多加一个v-if="active" 用于控制切换隐藏
        <div class="tabs-pane" :class="classes" v-if="active">
            <slot></slot>
        </div>
    

    6. 组件不能改自己的 props

        // 相当于
        function fn(obj){
            obj.a = '1'
            return obj
        }
        // 没多大问题,但是我们一般不要改参数传来的东西,vue也一样,如果硬要改
        function fn(obj,n){
            obj.a = '1'
            n = 2
            var number = n
            number = 2
            return obj
        }
    

    7. 框架主要的目的

        // 使得团队的傻逼也写不出垃圾代码以保证代码的平均质量
        function fn(obj){
            obj.a = '1' // bad
            return obj
        }
        function fn(obj,n){
            obj.a = '1'
            n = 2
            var number = n // good
            number = 2
            return obj
        }
    
    

    最后:个人微信,欢迎交流!

    <img src="https://i.loli.net/2020/01/27/gS4ZwP6zfAvULYT.jpg" alt="微信" width="400" height="400" align="bottom" />

    相关文章

      网友评论

          本文标题:Vue造轮子-tab组件(下)

          本文链接:https://www.haomeiwen.com/subject/ugnpthtx.html