2022-10-27 工作记录--Swiper/React-解决swiper处理动态数据出现样式紊乱、抖动问题

news2024/11/15 21:36:20

Swiper/React-解决swiper处理动态数据出现样式紊乱、抖动问题

First of all,检查自己在push数据前是否先清空了数组:

  • 已清空,请直接往下看👁👁哦;
  • 未清空,请先清空数组(可查看我的另外一篇文章),再继续往下看👁👁哦~

一、开门见山 ⭐️

图1:【正确样式】✅

在这里插入图片描述

图2:【紊乱样式】❌

在这里插入图片描述

  • 🎀 需求 —— 弹幕式轮播(如上 图1):
    • 1、分为上下两部分,且交错展示;
    • 2、轮播同时开始、速度匀速,且无限循环,即 跑马灯效果🧃;
    • 3、后端每次返的数据是随机的;
  • 🎀 实现方法 —— swiper
    • 1、上下两部分 -> 采用两个swiper,交错展示 -> 给下swiperswiper-container加上padding-left值:
      • 基于reactswiper可以查看我的另外两篇文章喔:🌹
        • swiper3 -> react-swiper3的运用;
        • swiper6 -> react-swiper6的使用;
    • 2、轮播同时开始、速度匀速,且无限循环 -> 跑马灯效果🧃,可以查看我的另外一篇文章喔:🌹
      • swiper-实现跑马灯效果(swiper6的实现方式与其相同,只是写法不同,具体用法,请往下看哦☺️,我会以swiper6写个案例);
    • 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"; // 引入swiper,实现轮播
import 'style-loader!css-loader!swiper/swiper-bundle.css'; // 引入swiper的css

import './home.less';

class Home extends React.Component {

  async componentDidMount() {
    await store.getHomeData(); // 调用接口-首页
  }
  
  // 在组件卸载及销毁之前 清空掉两个`swiper`里的数据。
  componentWillUnmount() {
    store.setCarouselInfo1([]);
    store.setCarouselInfo2([]);
  }

  render() {
    // carouselInfo1: 上swiper数据, carouselInfo2: 下swiper数据
    const { carouselInfo1, carouselInfo2 } = store;

    return (
      <div className="home">
        {/* 祝福弹幕【swiper-no-swiping: 禁止手动滑动】*/}
        <div className="blessing swiper-no-swiping">
        
          {/* 上swiper */}
          {
            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>
          }
          
          {/* 下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;    /*之前是ease-out*/
      -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 

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记:支持向量机SVM

1 一些概念 1.1 线性可分 在二维空间上&#xff0c;两类点被一条直线完全分开叫做线性可分。严谨的说法是&#xff1a; D0和 D1 是 n 维欧氏空间中的两个点集。如果存在 n 维向量 w 和实数 b&#xff0c;使得所有属于 D0 的点 xi 都有 wxib>0 &#xff0c;而对于所有属于 …

【面试题】 ES6知识点详细解析

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 &#x1f354;let const 其他知识点补充 块级作用域的补充 const 不可以在循环体里面声明变量给大家推荐一个实用面试…

从零备战蓝桥杯——动态规划(背包dp篇)

双非刷leetcode备战2023年蓝桥杯&#xff0c;qwq加油吧&#xff0c;无论结果如何总会有收获&#xff01;一起加油,我是跟着英雄哥的那个思维导图刷leetcode的&#xff0c;大家也可以看看所有涉及到的题目用leetcode搜索就可以哦&#xff0c;因为避让添加外链&#xff0c;一起加…

【JavaWeb】之Tomcat介绍、安装与使用

【JavaWeb】Tomcat前言一、Tomcat简介1.什么是Tomcat2.其他常用Web服务器二、Tomcat安装1.下载Tomcat2.配置环境变量三、Tomcat使用1.启动与关闭Tomcat2.修改Tomcat的端口号和主机名称3.使用IDEA搭建Web开发环境4.在Tomcat中部署web项目四、Web项目目录结构五、网站访问流程后记…

【Linux】yum vim 基础工具的使用

文章目录1. Linux环境下的软件包管理器---- yum1.2 什么是软件包1.3 yum源镜像配置1.4 yum查看软件包1.5 yum 如何安装软件1.6 yum 如何卸载软件2. Linux编辑器--vim2.1 vim 简介2.2 . vim的基本操作2.3 vim命令模式下的命令集2.3.1 光标移动2.3.2 编辑2.4 vim末行模式下的命令…

Python入门自学进阶-Web框架——24、DjangoAdmin项目应用-定制页面2

这里要实现点击对应的表名称&#xff0c;显示具体表的详细内容&#xff0c;大致的流程是&#xff1a; 前端显示各个表名&#xff0c;如下&#xff1a; <tbody>{% for table_name,admin in app_tables.items %}<tr class"border-bottom"><td style&…

彻底理解Java并发:volatile关键字

本篇内容包括&#xff1a;volatile 关键字简介、volatile 保证可见性&#xff08;包括&#xff1a;关乎不可见性问题描述、JMM内存模型和不可见性的解决方案&#xff09;以及 volatile 其他特性&#xff08;包括&#xff1a;volatile 不保证原子性、volatile 原子性的保证操作、…

mysql-高级命令(1)和一些函数(悟已往之不谏,知来者之可追)

一、高级命令 1.查询某个字段和多个字段 select 某个字段&#xff08;或者多个字段&#xff0c;中间以逗号间隔&#xff09;from 表名&#xff1b; 2. 去除字段的重复值 3.and 表示&#xff08;两个条件都需要满足&#xff09; 4.or &#xff08;两个条件满足一点&#xff09;…

【Linux】软件包管理器 yum 与编辑器 vim 的基本使用

文章目录一、yum 背景知识1、商业生态2、开源生态3、软件生态本土化二、yum 的基本使用1、查看软件包2、安装软件3、卸载软件三、vim 的基本使用1、vim 的基本概念2、vim 的基本操作2.1 模式间切换2.2 光标定位2.3 文本复制2.4 文本编辑2.5 底行模式的操作四、简单 vim 配置2、…

SpringBoot+SpringCloud+Nutty打造分布式在线消息推送服务(实例)

文章目录前言技术架构效果图后端项目消息数据定义存储结构消息状态Nutty消息服务项目结构改动消息bean消息处理器消息转换pojo工具审核消息处理controller实现类服务调用前端连接代码初始化接受消息消息的展示效果总结前言 其实关于这个的话&#xff0c;我先前的几篇博文&…

css选择器

碎碎念&#xff1a;都是一些自己在学习过程中的一点体会&#xff0c;如果有什么不对的感谢大家指正一起学习&#xff01; css选择器一、常用选择器二、属性选择器三、其他五、栗子1. * 通配符2. 空格 div p3. > 子选择器4. ~ 通用兄弟选择器5. 相邻兄弟选择器6. , 选择器分…

使用 Vercel 快速部署前端项目

Vercel&#xff1a;一键部署前端项目。 前端项目部署的问题 先来说下前端项目的部署&#xff0c;一般来说有以下几个步骤&#xff1a; 项目打包上传到服务器域名解析SSL 证书申请Nginx 配置CDN 加速 如果是公司的项目&#xff0c;打包之后的步骤一般有专门的运维人员负责&am…

C++:多态

文章目录一、多态的概念二、多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写(覆盖)2.4 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比三、抽象类四、继承和多态常见的面试问题1.2.总结一、多态的概念 多态按字面的意思就是多种形态。当类之间存在…

瞪羚优化算法(Gazelle Optimization Algorithm,GOA)

瞪羚优化算法&#xff08;Gazelle Optimization Algorithm&#xff0c;GOA&#xff09;由Agushaka等人于2022年提出&#xff0c;该算法模拟了瞪羚逃避捕食者的行为&#xff0c;思路新颖&#xff0c;性能高效。 瞪羚的身高60-110厘米&#xff0c;体重13-29千克。该属物种有像小鹿…

【Linux】基本指令(上)

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;操作系统&…

Linux - 第2节 - Linux环境基础开发工具使用

1.Linux 软件包管理器 yum centos 7中安装软件的方式&#xff1a; &#xff08;1&#xff09;源码安装 &#xff08;2&#xff09;rpm包安装 &#xff08;3&#xff09;yum安装 yum安装的好处&#xff1a; &#xff08;1&#xff09;不用编译源码 &#xff08;2&#xff09;不用…

赶紧进来看看---C语言实现学生信息管理系统(2.0动态内存版)

本文介绍了将学生信息管理系统静态版本改造为动态内存版本,主要涉及改造思路,枚举类型的使用,动态内存函数和柔性数组的使用,动手写程序才能使基础知识更为牢固…(文章最后有源码展示) 学生信息管理系统1.0静态版->学生信息管理系统2.0动态内存版 c语言实现学生信息管理系统…

在python中使用ggplot2

python的ggplot2库:plotnine > 一.安装方法&#xff1a; pip install plotnine使用的编译器&#xff1a;pycharm 二.plotnine绘图 1.第一个图形 除了导包的操作不一致&#xff0c;其他类似 from plotnine import ggplot, geom_point, aes, stat_smooth, facet_wrap fr…

70.【JavaScript 6.0】

前端三要素1.前端三要素2.引入JavaScript3.JavaScript基本语法入门4.数据类型5.严格检查模式( use strict)6.Map和Set7.函数的定义和参数获取8.变量的作用域(局部 全局)-------> 和Java一样9.全局规范:10.方法的定义和调用11.内部对象1.Date--------->日期2.JSON--------…

自定义mybatis插件实现sql日志打印

自定义mybatis插件实现sql日志打印 mysql插件实现原理 官网的关键信息 参考文档 https://mybatis.org/mybatis-3/zh/configuration.html#plugins 官方文档 MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下&#xff0c;MyBatis 允许使用插件来拦截的方…