Swiper /React -解决swiper 处理动态数据出现样式紊乱、抖动问题
First of all ,检查自己在push 数据前是否先清空了数组:
- 若已清空,请直接往下看👁👁哦;
- 若未清空,请先清空数组(可查看我的另外一篇文章),再继续往下看👁👁哦~
一、开门见山 ??
图1:【正确样式】?
图2:【紊乱样式】?
- 🎀 需求 —— 弹幕式轮播(如上 图1):
- 1、分为上下两部分,且交错展示;
- 2、轮播同时开始、速度匀速,且无限循环,即 跑马灯效果🧃;
- 3、后端每次返的数据是随机的;
- 🎀 实现方法 ——
swiper :
- 1、上下两部分 -> 采用两个
swiper ,交错展示 -> 给下swiper 的swiper-container 加上padding-left 值:
- 基于
react 的swiper 可以查看我的另外两篇文章喔:🌹
- 2、轮播同时开始、速度匀速,且无限循环 -> 跑马灯效果🧃,可以查看我的另外一篇文章喔:🌹
- 3、由于是动态数据,出现
bug 描述如下:💥
- 当进入弹窗/其他页面后,再次返回页面时,这两个
swiper 会先抖动一下,然后出现样式紊乱问题(如上 图2):
二、亡羊补牢 ??
Taking into account what we have discussed above, we may safely arrive at a conclusion that 依据我们在上文中讨论的内容,我们可以得出一个结论:
So what do we do?
在组件卸载及销毁之前 清空掉两个swiper 里的数据。
三、柳暗花明又一村 ??
哒哒哒~🌈 最终没有bug 的效果如下动图啦:
四、小试牛刀 ??
react -swiper6
1、安装swiper6
npm i swiper@6
或者
yarn add swiper@6
2、部分代码
home.jsx
import React from 'react';
import store from '@src/store';
import { Swiper, SwiperSlide } from "swiper/react";
import 'style-loader!css-loader!swiper/swiper-bundle.css';
import './home.less';
class Home extends React.Component {
async componentDidMount() {
await store.getHomeData();
}
componentWillUnmount() {
store.setCarouselInfo1([]);
store.setCarouselInfo2([]);
}
render() {
const { carouselInfo1, carouselInfo2 } = store;
return (
<div className="home">
{}
<div className="blessing swiper-no-swiping">
{}
{
carouselInfo1?.length > 0 &&
<Swiper
className="blessingItems blessingTop"
slidesPerView={1.25}
speed={3000}
freeMode={true}
loop={true}
autoplay={{
delay: 0,
}}
>
{
carouselInfo1?.map((item, index) => {
return (
<SwiperSlide className="item" key={index}>
{}
<span className="item_bg i-blessing_bg"></span>
{}
<div className="item_texts">
{}
<span className="user_name text-hidden-ellipsis">工行粉丝</span>
{}
<div className="content text-hidden-ellipsis">送出祝福:{item.prizeName}</div>
</div>
</SwiperSlide>
)
})
}
</Swiper>
}
{}
{
carouselInfo2?.length > 0 &&
<Swiper
className="blessingItems blessingBottom"
slidesPerView={0.85}
speed={3000}
freeMode={true}
loop={true}
autoplay={{
delay: 0,
}}
>
{
carouselInfo2?.map((item, index) => {
return (
<SwiperSlide className="item" key={index}>
{}
<span className="item_bg i-blessing_bg"></span>
{}
<div className="item_texts">
{}
<span className="user_name text-hidden-ellipsis">工行粉丝</span>
{}
<div className="content text-hidden-ellipsis">送出祝福:{item.prizeName}</div>
</div>
</SwiperSlide>
)
})
}
</Swiper>
}
</div>
</div>
);
}
}
export default Home;
home.less
.swiper-container>.swiper-wrapper {
-webkit-transition-timing-function: linear;
-moz-transition-timing-function: linear;
-ms-transition-timing-function: linear;
-o-transition-timing-function: linear;
transition-timing-function: linear;
margin: 0 auto;
}
store/index.js
import { makeAutoObservable } from 'mobx';
import API from '../api/index';
const store = makeAutoObservable({
carouselInfo1: [],
setCarouselInfo1(data) {
this.carouselInfo1 = data;
},
carouselInfo2: [],
setCarouselInfo2(data) {
this.carouselInfo2 = data;
},
async getHomeData() {
const { data, success } = await API.getHomeData();
if (data && success) {
this.setCarouselInfo1([]);
this.setCarouselInfo2([]);
const { carouselInfo } = data;
carouselInfo?.length > 0 &&
carouselInfo?.forEach((item, index) => {
if (index % 2 == 0) {
this.carouselInfo1.push(item);
} else {
this.carouselInfo2.push(item);
}
})
}
}
},
})
export default store
|