您好,登錄后才能下訂單哦!
這篇文章主要介紹了vue輪播組件怎么實現$children和$parent的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇vue輪播組件怎么實現$children和$parent文章都會有所收獲,下面我們一起來看看吧。
1、vue組件化開發
2、vue組件嵌套組,就是兩個組件相互耦合,然后必須配合使用的那種。參考elementUI里面的表單組件(分為from組件,item組件)或者輪播組件。
vue的 $children和 $parent
3、css動畫和形變
1、先寫你的框,主組件
這個是容器,負責組件定位和組件的整體運作的
html部分
<div @mouseenter.stop="handleMouseEnter" @mouseleave.stop="handleMouseLeave" class="dht-swiper-side" : > <slot></slot> </div>
主要兩個鼠標事件: mouseenter和 mouseleave
第一個就是鼠標在元素上負責停止定時器,第二個就是鼠標離開重啟定時器
對應的props和監聽
props: { // 時間間隔 interval: { type: Number, default: 8000 }, //是否自動播放 autoplay: { type: Boolean, default: true }, zIndex: { type: Number, default: 2000 }, // x軸變化 axisx: { type: Number, default: 1000 } }, watch: { autoplay(val) { val ? this.startTimer() : this.stopTimer(); } }, data() { return { // 計時器 timer: "", //子元素 items: [], // 當前顯示的元素 active: 0 }; },
看看就好,沒啥多說的,我感覺挺清晰的
2、寫你的子組件
這里必須跳躍一下,為什么呢?
因為:主組件主要負責動畫運作和容器的作用。定義好你要的參數之后,其實主組件你直接看代碼是不不符合編寫邏輯的
有了主組件之后,我需要有子元素才能動起來,所以先把子元素加載進來
html部分
<div class="dht-swiper-side-item" :> <slot></slot> </div>
js核心部分
created() { //元素創建和需要更新父元素屬性 this.$parent && this.$parent.updateItems(); }, beforeMount() {}, mounted() {}, destroyed() { //元素銷毀和需要更新父元素屬性 this.$parent && this.$parent.updateItems(); },
這里主要是創建元素的時候需要把元素加入主組件的items中,銷毀的時候同樣進行更新
主組件的更新代碼
// 更新元素 updateItems() { this.items = this.$children.filter( // 更新元素需要確認為指定的子元素 child => child.$options.name === "dhtSwiperSideItem" ); },
css核心部分
css部分主要是定義動畫效果,和基礎css,主要是看動畫部分
.dht-swiper-side-item { position: absolute; transition: all 1s ease; transform: translateX(1000px); // 抖動動畫 @keyframes mymove { 0% { left: 0; } 50% { left: 15px; } 100% { left: 0; } } }
3、一般彈窗動畫之類的編寫原理講解
1、不能用display:none,因為那樣元素是直接顯示出來的,動畫是無法有的。
2、舉例:下方彈窗劃出
其實在寫這些彈窗的時候元素已經在頁面上面加載好了,只是被我們隱藏到顯示器之外了。
所以我們要做的是在點擊顯示的時候把元素位移回來
3、所以其實頁面上基本的動畫都是先放在你看不到的地方,然后再通過 transform
形變css給移動回來的。我這次的組件也是一樣的。
4、主組件操作
1、回顧一下,剛才我們先寫了主組件,主組件加載子組件,子組件會調用主組件函數,讓主組件去更新自己的items,提前存好。方便使用
2、既然我們主組件拿到了子組件了,那么就可以直接操作子組件進行操作,其實核心原理在于主組件之間操作子組件。(我看了elementUI源碼的走馬燈部分,寫的比我復雜。)
3、定時器部分
//開始計時器 startTimer() { //預先執行一次,保證不會出現第一次運行延遲雙倍實際 this.play(); // 攔截處理 if (this.interval <= 0 || !this.autoplay || this.timer) return; this.timer = setInterval(() => { this.play(); }, this.interval); },
這塊其實沒啥,除了預先的攔截剩下的就是啟動定時器,然后運行動畫播放函數
4、核心播放函數部分
//播放實際運行函數 play() { let len = this.items.length - 1; let now = this.active > len ? 0 : this.active; let old = this.active - 1 < 0 ? 0 : this.active - 1; //console.log("當前", now, "老的", old); //關閉老元素 this.items[old].show = false; this.items[old].itemStyle = { transition: "all 1.5s ease", transform: `translateX(${this.axisx}px)` }; //顯示新元素 this.items[now].show = true; this.items[now].itemStyle = { transition: "all 1.5s ease", transform: "translateX(0)", animation: "mymove 1.5s 2" }; //記錄數據 this.active = now + 1; }
這個其實很簡單,每次運行的時候處理一下數據,拿到當前要運行的子元素id和老的元素,當前的展示,老的移動回去。最后記錄一下新的id
這里有一個坑點:就是animation部分,記得運行2次,不然只是一次會導致下面的元素看不到抖動效果。原因是在移動的時候就抖動完畢了。
5、主組件css部分
.dht-swiper-side { position: absolute; z-index: 2000; right: 0; display: flex; flex-flow: row; width: 100%; }
dht-swiper-side | 側邊輪播組件 | interval | Number | 5000 | 時間間隔,默認5秒轉換一次 | 必須給該組件指定寬度,否則無法正常顯示。 | 內部子元素展示做最側位置主要由該組件的寬度定義 |
autoplay | Boolean | TRUE | 是否自動播放,咱不支持false | ||||
zIndex | Number | 2000 | 組件層級 | ||||
axisx | Number | 1000 | 隱藏的子元素位置,px單位,默認1000。當內部元素寬度過大時可以調節該參數 | ||||
dht-swiper-side-item | dht-swiper-side | dht-swiper-side的子組件,用于存放內容 |
<dht-swiper-side class="main"> <dht-swiper-side-item> <div class="item">我是組件1</div> </dht-swiper-side-item> <dht-swiper-side-item> <div class="item">我是組件2</div> </dht-swiper-side-item> <dht-swiper-side-item> <div class="item">我是組件3</div> </dht-swiper-side-item> <dht-swiper-side-item> <div class="item">我是組件4</div> </dht-swiper-side-item> </dht-swiper-side> .main { width: 500px; .item { width: 100px; height: 100px; background: #009966; border: #409eff 1px solid; text-align: center; line-height: 100px; } }
主組件全部代碼
<template> <div @mouseenter.stop="handleMouseEnter" @mouseleave.stop="handleMouseLeave" class="dht-swiper-side" : > <slot></slot> </div> </template> <script> export default { name: "dhtSwiperSide", props: { // 時間間隔 interval: { type: Number, default: 8000 }, //是否自動播放 autoplay: { type: Boolean, default: true }, zIndex: { type: Number, default: 2000 }, // x軸變化 axisx: { type: Number, default: 1000 } }, watch: { autoplay(val) { val ? this.startTimer() : this.stopTimer(); } }, data() { return { // 計時器 timer: "", //子元素 items: [], // 當前顯示的元素 active: 0 }; }, beforeCreate() {}, created() { this.$nextTick(() => { this.updateItems(); this.startTimer(); this.$children[0].show = true; }); }, beforeMount() {}, mounted() {}, destroyed() { clearInterval(this.timer); }, methods: { handleMouseEnter() { this.stopTimer(); }, handleMouseLeave() { this.startTimer(); }, //開始計時器 startTimer() { //預先執行一次,保證不會出現第一次運行延遲雙倍實際 this.play(); // 攔截處理 if (this.interval <= 0 || !this.autoplay || this.timer) return; this.timer = setInterval(() => { this.play(); }, this.interval); }, // 停止計時器 stopTimer() { clearInterval(this.timer); }, // 更新元素 updateItems() { this.items = this.$children.filter( // 更新元素需要確認為指定的子元素 child => child.$options.name === "dhtSwiperSideItem" ); }, //播放實際運行函數 play() { let len = this.items.length - 1; let now = this.active > len ? 0 : this.active; let old = this.active - 1 < 0 ? 0 : this.active - 1; //console.log("當前", now, "老的", old); //關閉老元素 this.items[old].show = false; this.items[old].itemStyle = { transition: "all 1.5s ease", transform: `translateX(${this.axisx}px)` }; //顯示新元素 this.items[now].show = true; this.items[now].itemStyle = { transition: "all 1.5s ease", transform: "translateX(0)", animation: "mymove 1.5s 2" }; //記錄數據 this.active = now + 1; } } }; </script> <style lang="scss"> .dht-swiper-side { position: absolute; z-index: 2000; right: 0; display: flex; flex-flow: row; width: 100%; } </style>
子組件全部代碼
<template> <div class="dht-swiper-side-item" :> <slot></slot> </div> </template> <script> export default { name: "dhtSwiperSideItem", data() { return { show: false, defaultStyle: {}, itemStyle: {} }; }, watch: {}, beforeCreate() {}, created() { //元素創建和需要更新父元素屬性 this.$parent && this.$parent.updateItems(); }, beforeMount() {}, mounted() {}, destroyed() { //元素銷毀和需要更新父元素屬性 this.$parent && this.$parent.updateItems(); }, methods: {} }; </script> <style lang="scss"> .dht-swiper-side-item { position: absolute; transition: all 1s ease; transform: translateX(1000px); // 抖動動畫 @keyframes mymove { 0% { left: 0; } 50% { left: 15px; } 100% { left: 0; } } } </style>
關于“vue輪播組件怎么實現$children和$parent”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“vue輪播組件怎么實現$children和$parent”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。