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

造轮子-tab组件(中)

作者: Ories | 来源:发表于2020-01-27 23:05 被阅读0次

1. 如果给一个标签一个class,标签本身又有class,vue是默认会合并的。只有两个属性是这样一个是class,一个是style。这样就比较好改样式。

    <g-tabs-head class="red"></g-tabs>

2. 组件的结构以及selected的传递过程,见下图。

  • 没有点击的图


    没点击.png
  • 发生了点击操作的图,两个item兄弟之间是没有关系的,发生了点击操作之后要做下图中的五件事情。
    1. 亮自己
    2. 熄兄弟
    3. 亮pane
    4. 熄pane
    5. 触发事件 update:selected -> item2


      点击.png

3. 接下去考虑代码的实现,有两种方案

  1. 第一种爷爷爸爸儿子之前互相通信
  2. 用事件中心EventHub或者叫EventBus发布订阅模式实现,这种简单


    发布订阅.png

4. 下划线开头的属性不要用是私有属性给vue用的,$开头的属性是专门可以用的

5. 在爷爷tabs组件上面加了privide后代都可以用,其他的属性只提供给儿子不提供给孙子,只有provide是任何后代都可以访问的。

    // tabs.vue这样就有了eventBus   
   data(){
      return {
        eventBus: new Vue()
      }
    },
    provide(){
      return {
        eventBus:this.eventBus
      }
    },
    created(){
      console.log('爷爷的eventBus')
      console.log(this.eventBus)
      // this.$emit('update:selected','xxx')
    }

    // tabs-head.vie儿子就有了eventBus,其他组件同理
    inject: ['eventBus'],
    created(){
      console.log('爷爷给爸爸的eventBus')
      console.log(this.eventBus)
    }
下图橙色字的地方就是provide
provide.png

6.取函数名字的时候先取一个必须要改的名字,之后再改

    created(){
      this.eventBus.$on('update:selected',(name)=>{
        console.log(name)
      })
      // 这句话的意思是监听selected被更新了,并且执行一个回调,这里监听的可能是其它的组件
    },
    methods: {
      xxx(){
        this.eventBus.$emit('update:selected',this.name)
        // 这句话的意思是大声喊出来selected更新了
      }
    }

7.index.html中,在g-tabs中监听update:selected事件,不会触发yyy,vue的事件是不会冒泡的,在哪里触发就在哪里,但是这个问题不是冒泡问题

  // 我们的eventBus是g-tabs生成的new Vue(),而app.js监听的g-tabs,是一个vue组件,
  // 也就是vue组件的事件,而不是new Vue()
  <g-tabs :selected.sync="selectedTab" @update:selected="yyy"></g-tabs>
    methods: {
        yyy(data){
            console.log('yyy')
            console.log(data)
        }
    }

    // 那么组件怎么触发呢
    // tabs.vue
    created(){
        this.$emit('update:selected', '这是 this $emit 出来的数据') // 这样写可以触发外面,这里的this
        就是当前组件
        this.eventBus.$emit('update:selected', '这是 this event $emit 出来的数据') // 这样写不可以触发外面
    }
    // app.js
    <g-tabs :selected.sync="selectedTab" @update:selected="yyy"></g-tabs>
    methods: {
        yyy(data){
            console.log('yyy')
            console.log(data)
        }
    }
  • 总结:事件要看在哪个对象上触发的,你需要知道你触发的事件是在哪个对象上触发的,一个是在this上面,一个是在this的eventBus上面,每个对象都可以触发不同事件。

8. 如果在tabs-header上不会触发

    // tabs-head
    created(){
      this.$emit('update:selected', '这是 tabs-head 抛出来的数据') 
      // 这样写不可以触发外面是因为vue的事件系统是不会冒泡的,
      //如果g-tabs-head标签是一个div那么是可以触发到g-tabs的因为div是可以冒泡的
    }
    // index.html
     <g-tabs :selected.sync="selectedTab" @update:selected="yyy">
        <g-tabs-head class="red">
            <template slot="actions">
                <button>设置</button>
            </template>
        </g-tabs-head>
    </g-tabs>

9.关于Vue的事件要注意点

  • 事件是在哪个对象上调用的,在哪个对象上调用就只能在那个对象上监听
  • 事件不会冒泡,子标签触发的事件不会自动传到父标签

相关文章

  • 造轮子-tab组件(中)

    1. 如果给一个标签一个class,标签本身又有class,vue是默认会合并的。只有两个属性是这样一个是clas...

  • 造轮子-tab组件(上)

    1. 如何解决之前遗留的bug 根据错误提示大概确定原因,toast.test.js .style 造成。 用二分...

  • Vue造轮子-tab组件(下)

    1. 为什么一个 new Vue 可以构造出一个 eventBus 2. 开始写 CSS 样式 3.激活属性 ac...

  • 造轮子-nav组件

    补充知识:如果你需要相对引用你得加一个./否则会被认为你是在引用一个第三方库比如: 首先我们需要三个组件分别是na...

  • 造轮子-sticky组件

    最初的api设计 上面的api就是接受一个distance参数,意思是距离顶部多少距离的时候固定住 当需要通过滚动...

  • 2019-05-31 程序员修仙进阶标准,你到哪个阶段了?

    闭门造轮子 > 使用别人的轮子 > 开门造轮子 > 分享轮子

  • 移动端的一些组件

    最近整理了一些移动端常用的组件,自己造轮子中,你可能会好奇为啥要自己造,github上面的的东西不是更成熟吗?一,...

  • 还在重复造轮子?提高生产效率!3个常用的开源工具库分享

    我们实际项目开发中是比较忌讳造轮子的,但是,自己在学习过程中造轮子绝对是对自己百利而无一害的!造轮子是一种特别能够...

  • 造轮子之仿射变换

    有人说,我们不应该再造轮子;也有人说,学习怎么造轮子可以带来更深的理解。我说,用轮子有用轮子的乐趣,造轮子有造轮子...

  • 第2章 组件化选型

    1、组件化选型结论 方案是Arouter+auto-register+自己造轮子补充原因:arouter使用简单,...

网友评论

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

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