react-7 组件库 Ant Design Mobile(移动端)

news2025/2/24 7:31:28

 1.安装组件库

npm install --save antd-mobile

常用组件
tabbar 底部导航

Swiper 轮播图(走马灯)

NavBar(顶部返回累) 配合 Dialog,Toast

InfiniteScroll 无限滚动(实现下拉刷新)

Skeleton 骨架屏:用图形表示内容占位

SideBar 侧边导航

2. 按需导入
我们可以根据项目需要导入需要用到的组件, 该组件的样式会自动导入.

eg:

import { Button } from 'antd-mobile';

下载组件库,icon:特殊一点,导入使用

//下载
npm install --save antd-mobile-icons

//导入使用
import { AntOutline } from 'antd-mobile-icons'

常用组件:

封装: tabbar

import React, { Component } from 'react';
import './MyTabbar.scss'
import { Badge, TabBar } from 'antd-mobile'
import { AppOutline, AppstoreOutline, MessageFill, MessageOutline, UserOutline } from 'antd-mobile-icons'
import { withRouter } from 'react-router-dom';
interface Props {
    history:any,
    match:any,
    location:any,
}
interface State {
    tabs: Array<any>
}

class MyTabbar extends Component<Props, State> {
    constructor(props: Props) {
        super(props)
        this.state = {
            tabs: [
                {
                    key: '/index/home',
                    title: '首页',
                    icon: <AppOutline />,
                },
                {
                    key: '/index/mypage',
                    title: '分类',
                    icon: <AppstoreOutline />,
                },
                {
                    key: '/index/mycate',
                    title: '购物车',
                    icon: (active: boolean) =>
                        active ? <MessageFill /> : <MessageOutline />,
                },
                {
                    key: '/index/my',
                    title: '我的',
                    icon: <UserOutline />,
                },
            ]
        }
    }
    handleChange(key: string) {
        this.props.history.push(key)
    }
    render() {
        return (
            <TabBar className='tabbar' onChange={(key) => { this.handleChange(key) }}>
                {
                    this.state.tabs.map(item => (
                        <TabBar.Item key={item.key} icon={item.icon} title={item.title} />
                    ))
                }
            </TabBar>
        );
    }
}

export default withRouter(MyTabbar);
.tabbar{
    position: fixed;
    bottom: 0;
    .adm-tab-bar-wrap{
        width: 100%;
    }
}

 封装:swiper

拿到数据,通过组件传递给组件内数组。父向子

 接收使用

import React, { Component } from 'react';
import './index.scss'
import { Swiper } from 'antd-mobile'

interface Props {
    swiperlist: Array<any>
}
class MySwiper extends Component<Props> {
    render() {

        return (
            < Swiper className='myswiper' allowTouchMove={true} autoplay autoplayInterval={1000} loop >
                {
                    this.props.swiperlist.map((item, index) => {
                        return (
                            <Swiper.Item key={index}>
                                <img src={item.img} alt="" key={index} />
                            </Swiper.Item>
                        )
                    })
                }
            </Swiper>
        )
    }
}

export default MySwiper;
.myswiper{
    height: 200px;
    img{
        //height: 200px;
        width: 100%;
    }
}

navbar顶部返回:配合 Dialog,Toast

import React, { Component } from 'react';
import './index.scss'
import { NavBar,Dialog, Toast } from 'antd-mobile'
interface Props {
    match: any,
    location: any
}
class Detail extends Component<Props> {
    back = () =>{
        // Toast.clear();
        // Toast.show({
        //     content: '点击了返回',
        //     duration: 1000,
        // })
        Dialog.clear()    //关闭所有打开的对话框
        Dialog.confirm({
            content: '确定删除吗?',
            title:'警告',
        }).then((res)=>{
            if (res) {
                console.log('点击了确定,执行删除');
            } else {
                console.log('点击了取消');
            }
        })
    }
    render() {
        // 获取动态路由参数
        // console.log(this.props.match.params.id);
        // 获取固定路由参数,query,刷新页面参数会丢失
        // console.log(this.props.location.query.id);
        // 获取固定路由参数,state
        console.log(this.props.location.state.proid); //商品信息获取了
        return (
            <div className='detail'>
                <NavBar back='返回' onBack={() => { this.back()}}>
                    商品详情
                </NavBar>
            </div>
        );
    }
}
export default Detail;

下拉加载:无限滚动:需要放在列表下边

//下拉加载
import { InfiniteScroll } from 'antd-mobile'
//骨架屏
import { Skeleton } from 'antd-mobile'



{   // 骨架屏
    this.state.recommendlist.length == 0 &&
        <>
            <Skeleton.Title animated />
            <Skeleton.Paragraph lineCount={5} animated />
        </>
}



{/* 下拉加载:hasMore 是否有更多内容,当hasMore为true时,列表滚动到底部会自动执行loadMore对应的回调函数 */}
<InfiniteScroll loadMore={this.loadMore} hasMore={this.state.hasMore} />

loadMore是个异步函数:::

 代码如下:::

import React, { Component } from 'react';
import './index.scss'
import { pro_recommendlist } from '@/api/index'
import { withRouter } from 'react-router-dom';

// 导入 无限加载 和 骨架屏组件
import { Skeleton } from 'antd-mobile'
import { InfiniteScroll } from 'antd-mobile'
interface Props {
    history: any //表示可选的值
    match: any,
    location: any
}
interface State {
    recommendlist: Array<any>
    hasMore: any,
    count: any,
}
class List extends Component<Props, State> {
    constructor(Props: Props) {
        super(Props)
        this.state = {
            // list: []
            recommendlist: [],
            count: 0,
            hasMore: true,
        }
    }
    // async componentDidMount() {
    //     var res = await pro_recommendlist({ count: 1, limitNum: 10 })
    //     // console.log(res.data.data);
    //     if (res.data.code == 200) {
    //         this.setState({ recommendlist: res.data.data })
    //     }
    // }
    handleClick(e: any, proid: any) {
        this.props.history.push({ pathname: '/detail', state: { proid } })
        // console.log(proid);
    }
    // 滑动加载
    loadMore = async () => {
        // 请求下一条数据
        var res = await pro_recommendlist({ count: this.state.count + 1 })

        if (res.data.data.length < 12) {
            // console.log(res);
            this.setState({
                hasMore: false,//数据加载完成,设置false})
                recommendlist: [...this.state.recommendlist, ...res.data.data],
                count: this.state.count + 1
            })
        } else {
            this.setState({
                recommendlist: [...this.state.recommendlist, ...res.data.data],
                count: this.state.count + 1
            })
        }
    }
    render() {
        return (
            <ul className="list_ul">
                {
                    this.state.recommendlist.map((item, index) => {
                        return (
                            <li key={index} onClick={(e) => { this.handleClick(e, item.proid) }}>
                                <img src={item.img1} alt="" />
                                <p className='clear_ellipsis'>{item.proname}</p>
                                <p className='money'>¥<span >{item.originprice}</span></p>
                            </li>
                        )
                    })
                }
                {   // 骨架屏
                    this.state.recommendlist.length == 0 &&
                        <>
                            <Skeleton.Title animated />
                            <Skeleton.Paragraph lineCount={5} animated />
                        </>
                }
                {/* hasMore 是否有更多内容,当hasMore为true时,列表滚动到底部会自动执行loadMore对应的回调函数 */}

                <InfiniteScroll loadMore={this.loadMore} hasMore={this.state.hasMore} />
            </ul>
        );
    }
}

export default withRouter(List);

 骨架屏(两种写法)先导入,再使用

//骨架屏
import { Skeleton } from 'antd-mobile'


{
    this.state.recommendlist.length == 0 &&
    <>
        <Skeleton.Title animated />
        <Skeleton.Paragraph lineCount={5} animated />
    </>
}
                

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

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

相关文章

ROS学习第九节——服务通信

1.基本介绍 服务通信较之于话题通信更简单些&#xff0c;理论模型如下图所示&#xff0c;该模型中涉及到三个角色: ROS master(管理者)Server(服务端)Client(客户端) ROS Master 负责保管 Server 和 Client 注册的信息&#xff0c;并匹配话题相同的 Server 与 Client &#…

远程控制电脑的软件哪个比较好用

有多种软件选项可用于远程控制计算机&#xff0c;最适合您的软件选项取决于您的具体需要和要求。 以下是一些最流行的远程控制软件选项及其功能和优势&#xff1a; TeamViewer TeamViewer 是使用最广泛的远程控制软件选项之一。 它具有用户友好的界面&#xff0c;并提供文件传…

Vue核心 Vue简介 初识

Vue核心 Vue简介 初识 1.1.Vue核心 Vue简介 初识 1.1.1.Vue核心 Vue简介 初识 英文官网 中文官网 1.1.2.介绍与描述 Vue 是一套用来动态构建用户界面的渐进式JavaScript框架 构建用户界面&#xff1a;把数据通过某种办法变成用户界面渐进式&#xff1a;Vue可以自底向上逐层…

YOLO V8实战入门篇 | Anaconda3 | ultralytics

目录 一、虚拟环境1.1 Anaconda3 安装1.2 创建适用YOLO V8的虚拟环境 二、YOLO v82.1 YOLO v8简介2.2 下载YOLO v8源码2.3 安装依赖 三、运行目标检测模型 一、虚拟环境 1.1 Anaconda3 安装 https://blog.csdn.net/weixin_42855758/article/details/122795125 参考这个链接&a…

NDK OpenCV 身份证信息离线识别

NDK系列之OpenCV 身份证信息离线识别技术实战&#xff0c;本节主要是通过OpenCV C库&#xff0c;实现身份证信息识别&#xff0c;如身份证号码识别&#xff0c;本节使用到的技术点同样适用于车牌号识别、银行卡号码识别等。 实现效果&#xff1a; 本节主要内容&#xff1a; 1…

数据库底层运行原理之——事务管理器

一般所有关系型数据库内部都有自己的事务机制&#xff0c;进程是如何保证每个查询在自己的事务内执行的&#xff0c;通过这篇文章来简单介绍一下。 我们可以理解为数据库是由多种相互交互的组件构成的&#xff0c;数据库一般可以用如下图形来理解&#xff1a; 事务管理器就是今…

两种方法,计算带地形起伏的地表面积

很多同学会经常计算占地面积, 就会用到投影面积计算和椭球体面积计算; 还有一些,需要去计算表面积, 也就是带地形起伏的地表面积, 这......咋办呢? 我们来介绍两种方法, 计算下面这个区域的地表面积—— 两种方法各有优势, 大家各取所需 方法一:表面体积工具 这…

【hello Linux】进程优先级

目录 1. 基本概念 2. 查看系统进程&#xff1a;&#xff08;包括优先级&#xff09; 2.1 使用命令查看系统进程 2.2 各字段分析 2.3 优先级的修正解释 2.4 使用 top 命令修改优先级 其他概念 Linux&#x1f337; 1. 基本概念 进程的优先权&#xff08; priority&#xff09;&…

Java版企业电子招投标系统源代码之电子招投标系统建设的重点和未来趋势

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

网工神器:PNETLab模拟器踩坑过程(一)

0、前言 由于工作需要&#xff0c;想测试一下SD-WAN&#xff0c;手边既没有测试环境又没有测试设备。突然想到为什么不用模拟器测试。经过我一番操作好像发现了新大陆&#xff0c;没想到模拟器的世界发生了翻天覆地的变化。真是“一日学习一日功&#xff0c;一日不学十日空”。…

【IoT】以一款实际产品为例,来谈谈如何做商业计划分析

本篇内容以笔者早期刚转型做产品时,实际负责的一款产品为例,来谈谈如何做产品的商业计划分析。 首先简单介绍一下这款产品: 这是一款电子便签产品,目的是为了替换纸质便签,增加一些智能化的提醒控制。 该产品通过蓝牙与手机端连接,应用端配置好提醒信息后一键同步至产…

鼠标悬停发光按钮,流转边框

提示&#xff1a;css 动画实现&#xff0c;鼠标悬停发光按钮&#xff0c;流转边框。鼠标border可以旋转 前言 提示&#xff1a;以下是本篇文章的代码内容,供大家参考,相互学习 一、html代码 <!DOCTYPE html> <html><head><meta http-equiv"content…

企业信息化建设该怎么做?方向和手段都在这了

企业信息化建设该怎么做&#xff1f; 如果现在是十年前&#xff0c;我一定会说&#xff0c;做信息化需要寻找熟悉不同编程语言、有经验的程序员。 但是现在&#xff0c;如果不是特别复杂的信息化系统&#xff0c;其实公司完全可以使用零代码平台自主开发&#xff0c;不需要再…

[计算机图形学]光线追踪:加速结构(前瞻预习/复习回顾)

一、前言 上篇我们提到了&#xff0c;如果在光线追踪中&#xff0c;我们真的用每个像素发出的光线&#xff0c;以及在场景中弹射之后的光线与场景中的许多模型的上千万个三角形求交那将是一个非常慢的计算过程&#xff0c;所以&#xff0c;本篇我们将介绍一些加速结构来加速这个…

【FTP服务】

目录 一、FTP服务二、FTP服务器安装配置FTP服务的安装匿名访问开启防火墙设置本地用户修改配置文件 以图形化的格式来写入文件 三、设置白名单&#xff0c;黑名单用户 一、FTP服务 作用: 是用来传输文件的协议 端口: FTP服务器默认使用TCP协议的20、21端口与客户端进行通信 2…

OpenHarmony生态贡献获肯定,华秋践行加速硬件创业初心

4月19日,以“开源正当时,共赢新未来”为主题的开放原子开源基金会OpenHarmony开发者大会2023(以下简称“大会”)成功举办。大会现场,来自开放原子开源基金会和OpenHarmony项目的领导与专家、以及共建单位、行业伙伴和社区开发者们共聚一堂。值得信赖的电子产业一站式服务平台华…

【软件测试】四面成功上岸美团

最后&#xff0c;总结一下个人认为比较重要的知识点&#xff1a;接口自动化测试 &#xff1a;测试框架&#xff0c;多个有关联的接口的用例编写&#xff0c;用例的组织及存储&#xff0c;接口测试的覆盖率&#xff0c;RESTAssured 的封装等。UI 自动化测试 &#xff1a;iOS 和 …

二维码+互联网云技术在中建二局施工项目管理中的应用实践

中建二局&#xff08;全称&#xff1a;中国建筑第二工程局有限公司&#xff09;是世界500强企业—中国建筑股份有限公司的全资子公司&#xff0c;是集房建、基建、核电、火电、风电等多种建设和投资相融合的、国内最具综合实力的大型国有企业集团公司。中建二局具有土木建筑、设…

Jetson Orin Nano下部署 Yolo v5

在网上找了好多关于Jetson Nano部署Yolo v5的帖子&#xff0c;由于每个人的环境和版本都不同&#xff0c;过程也都有所不同&#xff0c;因此在Jetson Orin Nano CLB上安装Yolo v5也有必要记录一下过程&#xff0c;以便后续无脑重装&#xff0c;让我们开始。 由于我这个Jetson …

【IT成神路之我在起点学网络~】

什么是网络&#xff0c;一开始我以为是能刷刷剧&#xff0c;让我看到心仪idol&#xff0c;坐在家中看祖国大好河山就是网络。 长时间浸泡在网络上&#xff0c;不得不让我思索我为什么能看到高清不卡顿的精彩视频。 于是乎……我开始大肆搜索网络的资料内容。 IT嘛&#xff0…