React Swiper轮播图(二)

摘要:
:QueryType;开关导航?:(navInfo:NavImgType)=˃无效;}函数NavSwiper(props:IProps):JSX。元素{const[swiper,setSwiper]=useState(null);const[activeIndex,setActiveIndex]=useState(0);const[hasInit,setHasInit]=useState(false);const{by,option}=props?。查询||{};letnavImgs:NavImgType[]=[];switch(by){caseNavType.categy:navImgs=navStyleImgs.contat(navCategoryImgs);break;caseNavType.style:默认值:navImgs=navCategory IMgs.concat(navStylIMgs),break;}//上一个屏幕函数slideToNext(){wiper?.slideNext();}//下一屏幕函数slideToRev(){wiper?.slidePrev();}//单击类别函数switchNav(navInfo:NavImgType){props?.onSwitchNav&&props.onSwitchNav(navInfo);}return(<SwiperclassName={styles.navSwiper}loopbloopedSlides={5}slidesPerView={3}slides PerGroup={4}spaceBetween={16}onSlideChange={(swiper)=>setActiveIndex(swiper?.activeIndex)}onSwiper={(swipper)=>set swiper(swiper)}onInit={)==>setHasInit(true)}>{!hasInit?(<LazyImageclassName={styles.nawLoading}/>):(<React.Frage>{navImgs.map((img,key)=˃{return(˂imgsrc={img?

目录

需求

  • 实现React可切换轮播图
  • 效果预览
    React Swiper轮播图(二)第1张

使用库

实现方法

/** 导航 */
import React, { useState } from "react";
import SwiperCore, { Navigation, Pagination, Autoplay, Thumbs } from "swiper";
import { Swiper, SwiperSlide } from "swiper/react";
import Icon from "./component/icon";
import LazyImage from "./component/lazyImage";
import { navCategoryImgs, navStyleImgs } from "./imgs";

import {
  NavType,
  NavImgType,
  QueryType,
} from "./types";

import styles from "./index.less";
import "swiper/swiper-bundle.css";

SwiperCore.use([Navigation, Pagination, Autoplay, Thumbs]);

interface IProps {
  query?: QueryType;
  onSwitchNav?: (navInfo: NavImgType) => void;
}
function NavSwiper(props: IProps): JSX.Element {
  const [swiper, setSwiper] = useState<SwiperCore | null>(null);
  const [activeIndex, setActiveIndex] = useState<number>(0);
  const [hasInit, setHasInit] = useState<boolean>(false);

  const { by, option } = props?.query || {};
  let navImgs: NavImgType[] = [];
  switch (by) {
    case NavType.category:
      navImgs = navStyleImgs.concat(navCategoryImgs);
      break;
    case NavType.style:
    default:
      navImgs = navCategoryImgs.concat(navStyleImgs);
      break;
  }

  // 上一屏
  function slideToNext() {
    swiper?.slideNext();
  }

  // 下一屏
  function slideToPrev() {
    swiper?.slidePrev();
  }

  // 点击类目
  function switchNav(navInfo: NavImgType) {
    props?.onSwitchNav && props.onSwitchNav(navInfo);
  }

  return (
    <Swiper
      className={styles.navSwiper}
      loop
      loopedSlides={5}
      slidesPerView={5}
      slidesPerGroup={5}
      spaceBetween={16}
      onSlideChange={(swiper) => setActiveIndex(swiper?.activeIndex)}
      onSwiper={(swiper) => setSwiper(swiper)}
      onInit={() => setHasInit(true)}
    >
      {!hasInit ? (
        <LazyImage className={styles.navLoading} />
      ) : (
        <React.Fragment>
          {navImgs.map((img, key) => {
            return (
              <SwiperSlide key={key} className={styles.navSlide}>
                <img
                  src={img?.src}
                  onClick={() => {
                    switchNav(img);
                  }}
                />
              </SwiperSlide>
            );
          })}
        </React.Fragment>
      )}
      {hasInit && (
        <React.Fragment>
          <span
            slot="container-start"
            className={styles.navPrev}
            onClick={slideToPrev}
          >
            <Icon name="ArrowLeft" />
          </span>
          <span
            slot="container-end"
            className={styles.navNext}
            onClick={slideToNext}
          >
            <Icon name="ArrowRight" />
          </span>
        </React.Fragment>
      )}
    </Swiper>
  );
}

export default NavSwiper;
.navSwiper {
  user-select: none;
  .navLoading {
     100%;
    height: 160px;
  }
  .navSlide {
     227px;
    height: 160px;
    display: flex;
    justify-content: center;
    align-items: center;
    cursor: pointer;
    &:hover {
      opacity: 0.9;
    }
  }
  .navPrev,
  .navNext {
    position: absolute;
    top: 56px;
     24px;
    height: 48px;
    text-align: center;
    font-size: 24px;
    line-height: 46px;
    color: #aaaaaa;
    background: rgba(0, 0, 0, 0.2);
    z-index: 2;
    cursor: pointer;
    &:hover {
      opacity: 0.9;
    }
  }
  .navPrev {
    left: 0;
  }
  .navNext {
    right: 0;
  }
}

免责声明:文章转载自《React Swiper轮播图(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇802.11 绿野模式使用go自带的http包搭建一个的web服务器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

react源码解析7.Fiber架构

react源码解析7.Fiber架构 视频课程(高效学习):进入课程 课程目录: 1.开篇介绍和面试题 2.react的设计理念 3.react源码架构 4.源码目录结构和调试 5.jsx&核心api 6.legacy和concurrent模式入口函数 7.Fiber架构 8.render阶段 9.diff算法 10.commit阶段 11.生命...

问题:Swiper父容器隐藏时实例化组件,组件滑动失效

解决办法:初始化组件时,配置 observe true、observeParents true。 observe参数 启动动态检查器(OB/观众/观看者),当改变swiper的样式(例如隐藏/显示)或者修改swiper的子元素时,自动初始化swiper。 observeParents参数 将observe应用于Swiper的父元素。当Swiper的父...

vite支持optionalChaining可选链判断运算符和nullishCoalescingOperator

装置 babel 可选链判断运算符,空值合并运算符 兼容依赖 yarn add @babel/plugin-proposal-optional-chaining --dev yarn add @babel/plugin-proposal-nullish-coalescing-operator -dev react中: vite.config.ts增加...

webpack踩坑之路 (2)——图片的路径与打包

刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里(bundle)。下面我们就来分析下在webpack项目中图片的应用场景。 在实际生产中有以下几种图片的引用方式: 1. HTML文件中img标签的src属性引用或者内嵌样式引用 <img src="photo.jpg" /&g...

Echarts学习之路3(在react中使用)

安装: npm install echarts --save demo import React, { Component } from 'react'; // 引入 ECharts 主模块 import echarts from 'echarts/lib/echarts'; // 引入柱状图 import 'echarts/lib/chart/bar'...

webpack学习笔记--按需加载

为什么需要按需加载 随着互联网的发展,一个网页需要承载的功能越来越多。 对于采用单页应用作为前端架构的网站来说,会面临着一个网页需要加载的代码量很大的问题,因为许多功能都集中的做到了一个 HTML 里。 这会导致网页加载缓慢、交互卡顿,用户体验将非常糟糕。 导致这个问题的根本原因在于一次性的加载所有功能对应的代码,但其实用户每一阶段只可能使用其中一部分功...