組件化開發的思想在Vue中非常重要。有時候,有一個功能在項目的很多地方都需要用到.這個時候可以考慮封裝一個公共組件,在需要用到的地方引入。這樣的好處是減少代碼的冗余度,重復利用,提高效率。
這次要簡單封裝一個鼠標經過時,顯示懸浮框的公共組件,完成效果如下
公共組件可以放在components文件夾下,views下是一些普通的組件。
首先,我們在components下定義一個叫做myToolTip的Vue公共組件,在view下定義一個叫做tooltip的組件,myToolTip需要在tooltip中引入,因此可以看作是tooltip的子組件。
先來簡單編寫一下myToolTip組件的代碼。首先是定義了底下文字的插槽,我們需要什么文字進行替換即可。下方是定義了動態的style樣式,我們引入的時候可以傳入需要的屬性值。具名插槽就是懸浮框文字。
<template>
<div style="position: relative">
<div class="main">
<slot></slot>
</div>
<div class="tip" :style="{width: width + 'px'}" v-show="isShow">
<div class="arrow"></div>
<slot name="content"></slot>
</div>
</div>
</template>
既然是二者是父子組件的關系,那么就需要在myToolTip這個子組件里面定義props屬性
props: { width: { type: Number }, isShow: { type: Boolean, } }
myToolTip的完整代碼如下
<template> <div style="position: relative"> <div class="main"> <slot></slot> </div> <div class="tip" :style="{width: width + 'px'}" v-show="isShow"> <div class="arrow"></div> <slot name="content"></slot> </div> </div> </template> <script> export default { name: "myToolTip", data() { return { } }, props: { width: { type: Number }, isShow: { type: Boolean, } } } </script> <style scoped> .main { position: absolute; left: 50%; } .tip { position: absolute; left: 41%; width: 30px; height: 50px; top: -60px; background: gray; } .arrow{ width: 0; height: 0; border: 10px solid; border-color: transparent transparent rgba(0, 0, 0, 0.5); transform: rotate(180deg); -webkit-transform:rotate(180deg); position: absolute; bottom: -20px; left: 46%; } </style>
接下來,在我們需要用到這個組件的時候,引入即可。
tooltip.vue的完整代碼
<template> <div> <myToolTip style="margin-top: 100px" :width='toolWidth' @sonToFather="test" :isShow="isShow1"> <span @mouseenter="setShow()" @mouseleave="removeShow()">{{mainName}}</span> <div slot="content" style="color: white;line-height: 50px;text-align: center"> {{toolName}} </div> </myToolTip> </div> </template> <script> import myToolTip from '../components/myToolTip.vue' export default { name: "tooltip", components: { myToolTip, }, data() { return { toolWidth: 300, toolName: 'hhh', mainName: 'test', isShow1: false } }, methods: { test(e) { this.toolName = e }, setShow() { this.isShow1 = true }, removeShow() { this.isShow1 = false } } } </script> <style scoped> </style>