为了账号安全,请及时绑定邮箱和手机立即绑定

Vue造轮子-tab组件(下)

标签:
Vue.js

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
    }

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消