react_web自定义组件_多类型Modal_搜索栏Search

news2024/11/28 6:35:52

目录

一、带输入框的Modal

二、提示框Modal

三、搜索栏Search


在做项目时引入一些现成的UI组件,但是如果和设计图冲突太大,更改时很麻烦,如果自己写一个通用组件其实也就几十分钟或者几个小时,而且更具UI设计更改也比较好更改,下面是两个简单的通用组件。

采用 react+ts+scss 进行开发。

如果你没有react+ts+scss项目,请看这个文章。

react项目icon-default.png?t=N7T8https://blog.csdn.net/zxy19931069161/article/details/140117004?spm=1001.2014.3001.5501react项目这个文章顶部有一个现成的后台项目,可以这个基础上测试组件。

下面开始测试组件:

在src文件夹下新建components文件夹,用来放所有组件。

一、带输入框的Modal

效果如下,自行更改特别方便,内容:

在components文件夹下新建文件夹modalInput,modalInput文件夹下新建文件index.tsx和index.scss。

组件代码:

index.tsx

import './index.scss';
// 需要一个x,关闭图片,记得将图片放在这个路径下assets/images/,图片叫这个名字 icon-delete.png
import Delete from '../../assets/images/icon-delete.png'
import { useState } from "react";

function ModalInput(props: any) {

    // 输入的文字,初始值为父元素传过来的值 props.systemNameData
    // const [inputValueData, setInputValue] = useState(props.systemNameData)

    // 输入的文字,初始值为空字符串
    const [inputValueData, setInputValue] = useState('')

    /**
     * 取消
     */
    function cancleClick() {
        //执行父组件方法,关闭弹窗并将用户输入的值传给父组件
        props.sendValueToFather(false, '');
        setInputValue('')
    }

    /**
     * 确定
     */
    function sureClick() {
        props.sendValueToFather(false, inputValueData);
        setInputValue('')
    }

    /**
     * 获得输入框输入的文字
     * @param event input输入事件
     */
    function inputValue(event: any) {
        setInputValue(event.target.value)
    }

    return (
        <div className='modal-input-box'>
            <div className="modal-input-content">
                <div className="modal-title">应用名称</div>
                <img className="modal-delete" src={Delete} alt="关闭" onClick={cancleClick} />
                <div className="modal-line"></div>
                <div className="modal-content">
                    <div className="content-title">应用名称</div>
                    <input className="content-input" type="text" placeholder='请输入应用名称' onChange={inputValue} value={inputValueData} />
                </div>
                <div className="modal-cacle" onClick={cancleClick}>取消</div>
                <div className="modal-sure" onClick={sureClick}>确定</div>
            </div>
        </div>
    );
}

export default ModalInput;

index.scss

.modal-input-box {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0, 0, 0, 0.4);
    z-index: 99;

    .modal-input-content {
        width: 560px;
        padding: 24px 24px 58px 24px;
        border-radius: 12px;
        background: #FFF;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        box-sizing: border-box;

        .modal-title {
            color: #1E201F;
            font-size: 16px;
            line-height: 24px;
            letter-spacing: -0.01px;
            font-weight: bold;
        }

        .modal-delete {
            width: 24px;
            height: 24px;
            position: absolute;
            top: 24px;
            right: 24px;
            cursor: pointer;
        }

        .modal-line {
            width: 560px;
            height: 1px;
            background: #EFF2F9;
            position: absolute;
            top: 64px;
            left: 0;
        }

        .modal-content {
            width: 512px;
            padding: 32px 0;
            position: relative;

            .content-title {
                font-size: 14px;
                color: #505553;
                margin-left: 38px;
                padding-top: 8px;
            }

            .content-input {
                width: 360px;
                height: 34px;
                line-height: 34px;
                font-size: 14px;
                position: absolute;
                top: 32px;
                left: 114px;
                padding: 2px 10px 0px 10px;
                margin: 0;
                border-radius: 6px;
                border: 1px solid #E8ECEB;
            }

            input:focus {
                outline: 1px solid #00b498;
                border-radius: 4px;
            }

            input:hover {
                outline: 1px solid #00b498;
                border-radius: 4px;
            }

            input::placeholder {
                color: #A7AAA8;
            }
        }

        .modal-cacle {
            display: inline-block;
            padding: 6px 24px;
            border-radius: 6px;
            border: 1px solid #DCDFE6;
            font-size: 14px;
            position: absolute;
            bottom: 24px;
            right: 112px;
            cursor: pointer;

            &:hover {
                color: #00B498;
                border: 1px solid #00B498;
            }
        }

        .modal-sure {
            display: inline-block;
            padding: 6px 24px;
            border-radius: 6px;
            border: 1px solid #00B498;
            font-size: 14px;
            position: absolute;
            bottom: 24px;
            right: 24px;
            background-color: #00B498;
            color: #fff;
            cursor: pointer;

            &:hover {
                background: #1BCEB2;
            }
        }
    }
}

父组件引用时:

import ModalInput from "../.././components/modalInput";
import { useState } from "react";

function Home() {

  // 系统名称输入弹窗是否显示
  const [isShowModal, setIsShowModal] = useState(false)
  // 系统名称
  const [systemName, setSystemName] = useState('');

  /**
   * 系统名称输入弹窗,子元素给父元素传的,用户输入的内容
   * @param param 是否关闭弹窗
   * @param data 用户输入的内容
   */
  function getValueFromSon(param: boolean, data: string) {
    setIsShowModal(param);
    if (data !== '') {
      setSystemName(data);
      // 传给后端,并刷新获取信息数据接口

    }
  }

  return (
    <div>
        {isShowModal ? <ModalInput isShow={isShowModal} systemNameData={systemName} sendValueToFather={getValueFromSon}></ModalInput> : ''}
    </div>
  );
}

export default Home;

二、提示框Modal

在components文件夹下新建文件夹modalTip,modalTip文件夹下新建文件index.tsx和index.scss。

组件代码:

index.tsx

import './index.scss';
// 替换成自己的提示图标
import Delete from '../../assets/images/icon-delete.png'  //右上角关闭图标
import Question from '../../assets/images/icon-question.png'//左上角弹窗类型,提问
import Error from '../../assets/images/icon-error.png'//左上角弹窗类型,错误

function ModalInput(props: any) {
    // 提示弹窗类型,可以自行添加
    //error 错误
    //question 提问
    //none 没有

    // 父元素传过来的值
    let data = {
        type: props.type,// 弹窗类型,根据类型显示图标(错误/提问)
        title: props.title,// 标题
        content: props.content,//内容
    }

    /**
     * 取消
     */
    function cancleClick() {
        props.sendValueToFather(false);
    }

    /**
     * 确定
     */
    function sureClick() {
        props.sendValueToFather(true);
    }

    return (
        <div className='modal-input-box'>
            <div className="modal-input-content">
                <div className="left-title">
                    {data.type === "question" ? <img className="modal-tip" src={Question} alt="提示标志" /> : " "}
                    {data.type === "error" ? <img className="modal-tip" src={Error} alt="提示标志" /> : " "}
                    <div className="modal-title">{data.title}</div>
                </div>
                <img className="modal-delete" src={Delete} alt="关闭" onClick={cancleClick} />
                <div className="modal-content">
                    <div className="content-text">{data.content}</div>
                </div>
                <div className="modal-cacle" onClick={cancleClick}>取消</div>
                <div className="modal-sure" onClick={sureClick}>确定</div>
            </div>
        </div>
    );
}

export default ModalInput;

index.scss

.modal-input-box {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0, 0, 0, 0.4);
    z-index: 99;

    .modal-input-content {
        width: 400px;
        padding: 24px 24px 58px 24px;
        border-radius: 12px;
        background: #FFF;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        box-sizing: border-box;

        .left-title {
            height: 24px;
            line-height: 24px;

            .modal-tip {
                width: 24px;
                height: 24px;
                margin-right: 6px;
                float: left;
            }

            .modal-title {
                display: inline;
                color: #1E201F;
                font-size: 16px;
                letter-spacing: -0.01px;
                font-weight: bold;
                float: left;
            }
        }


        .modal-delete {
            width: 24px;
            height: 24px;
            position: absolute;
            top: 24px;
            right: 24px;
            cursor: pointer;
        }

        .modal-content {
            width: 512px;
            padding: 14px 0 24px 0;
            position: relative;

            .content-text {
                width: 348px;
                font-size: 14px;
                color: #666;
                padding-top: 8px;
                word-break: break-all;
                text-align: justify;
                text-justify: inter-word;
                line-height: 22px;
            }

        }

        .modal-cacle {
            display: inline-block;
            padding: 6px 24px;
            border-radius: 6px;
            border: 1px solid #DCDFE6;
            font-size: 14px;
            position: absolute;
            bottom: 24px;
            right: 112px;
            cursor: pointer;

            &:hover {
                color: #00B498;
                border: 1px solid #00B498;
            }
        }

        .modal-sure {
            display: inline-block;
            padding: 6px 24px;
            border-radius: 6px;
            border: 1px solid #00B498;
            font-size: 14px;
            position: absolute;
            bottom: 24px;
            right: 24px;
            background-color: #00B498;
            color: #fff;
            cursor: pointer;

            &:hover {
                background: #1BCEB2;
            }
        }
    }
}

组件调用:

import ModalTip from "../.././components/modalTip";
import { useState } from "react";

function Home() {

  // 系统名称输入弹窗是否显示
  const [isShowModal, setIsShowModal] = useState(false)

  /**
   * 子元素传给父元素的结果
   * @param param 取消/确定
   */
  function getValueFromSon(param: boolean) {
    setIsShowModal(false);
    if (param) {
     //用户点击确定

    }else{
     //用户点击取消

    }
  }

  return (
    <div>
        {isShowModal ? <ModalTip type={'question'} title={"确定删除吗?"} content={"删除后不可恢复哦~"} sendValueToFather={getValueFromSon}></ModalTip> : ''}
    </div>
  );
}

export default Home;

三、搜索栏Search

        

在components文件夹下新建文件夹search,search文件夹下新建文件index.tsx和index.scss。

组件代码:

index.tsx

import './index.scss';
import { useState } from "react";
// 搜索图标,记得添加
import SearchIcon from "../../assets/images/icon-search.png";

function Search(props: any) {

    const [inputValueData, setInputValue] = useState("")

    /**
     * 获得输入框输入的文字
     * @param event input输入事件
    */
    function inputValue(event: any) {
        setInputValue(event.target.value)
    }

    /**
     * 用户点击了键盘回车按钮
     * @param e 元素信息
     */
    function search(e: any) {
        if (e.keyCode === 13) {
            toFather()

            // 用户按下回车后,让input元素失去焦点
            var inputElement: any = document.getElementById('myInput');
            inputElement.blur();
        }
    }

    /**
     * 将用户输入的内容传给父元素
     */
    function toFather() {
        props.searchValue(inputValueData)
    }

    return (
        <div>
            <input id="myInput" className="edu-Manage-input" type="text" placeholder={props.placeholder} onChange={inputValue} value={inputValueData} onKeyUp={search} />
            <img className="edu-Manage-search" src={SearchIcon} alt="搜索" onClick={toFather} />
        </div>
    );
}

export default Search;

index.scss

.edu-Manage-input {
    width: 240px;
    height: 34px;
    line-height: 34px;
    font-size: 14px;
    padding: 2px 0px 0px 34px;
    margin: 0;
    border-radius: 6px;
    border: 1px solid #E8ECEB;
    cursor: pointer;
}

.edu-Manage-search {
    width: 14px;
    height: 14px;
    position: absolute;
    left: 28px;
    top: 28px;
    cursor: pointer;
    z-index: 99;

    &:hover {
        input {
            outline: 1px solid #00b498;
            border-radius: 4px;
        }
    }
}



input:focus {
    outline: 1px solid #00b498;
    border-radius: 4px;
}

input:hover {
    outline: 1px solid #00b498;
    border-radius: 4px;
}

input::placeholder {
    color: #A7AAA8;
}

组件调用:

import Search from "../.././components/search";

function Home() {

  /**
   * 搜索组件返回用户搜索的字符串
   * @param value 用户搜索的字符串
   */
  function getSearchData(value: string) {
    console.log(value)
  }

  return (
    <div>
        <Search placeholder="请输入姓名" searchValue={getSearchData}></Search>
    </div>
  );
}

export default Home;

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

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

相关文章

win11如何关闭自动更新,延长暂停更新时间

网上有很多关闭自动更新的方法&#xff0c;今天给大家带来另一种关闭win11自动更新的方法。 1.winR打开运行窗口&#xff0c;输入regedit打开注册表 2.定位到以下位置&#xff1a; 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 3.右键右边空白&…

使用kali Linux启动盘轻松破解Windows电脑密码

破解分析文章仅限用于学习和研究目的&#xff1b;不得将上述内容用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。谢谢&#xff01;&#xff01; 效果展示&#xff1a; 使用kali Linux可以轻松破解Windows用户及密码 准备阶段&#xff1a; &#xff08…

Dungeonborne卡顿怎么办 快速解决Dungeonborne卡顿问题

随着Dungeonborne游戏剧情的深入&#xff0c;玩家将逐渐解锁更多的地图和副本&#xff0c;每个区域都有其独特的生态和敌人。在探索的过程中&#xff0c;玩家不仅可以获得强大的装备和道具&#xff0c;还能结识到志同道合的伙伴&#xff0c;共同面对更强大的敌人。不过也有玩家…

【项目实践】贪吃蛇

一、游戏效果展示二、博客目标三、使用到的知识四、Win32 API 介绍 4.1 WIn32 API4.2 控制台程序4.3 控制屏幕上的坐标COORD4.4 GetStdHandle4.5 GetConsoleCursorInfo 4.5.1 CONSOLE_CURSOR_INFO 4.6 SetConsoleCursorInfo4.7 SetConsoleCursorPosition4.8 GetAsyncKeyState 五…

vue3+electron项目搭建,遇到的坑

我主要是写后端,所以对前端的vue啊vue-cli只是知其然,不知其所以然 这样也导致了我在开发前端时候遇到了很多的坑 第一个坑, vue2升级vue3始终升级不成功 第二个坑, vue add electron-builder一直卡进度,进度条走完就是不出提示succes 第一个坑的解决办法: 按照网上说的升级v…

如何通过KB知识库系统实现内部知识的管理

“Baklib 通过构建KB知识库系统实现内部知识的管理&#xff0c;构建 CMS 系统实现网站内容管理&#xff0c;构建 DAM 实现对原子化数字内容的管理。” Baklib 从多个维度和深度实现对数字内容的管理。 CMS 系统 CMS 系统(Content Management System 内容管理系统)是一种帮助用…

什么是 HTTP POST 请求?初学者指南与示范

在现代网络开发领域&#xff0c;理解并应用 HTTP 请求 方法是基本的要求&#xff0c;其中 "POST" 方法扮演着关键角色。 理解 POST 方法 POST 方法属于 HTTP 协议的一部分&#xff0c;主旨在于向服务器发送数据以执行资源的创建或更新。它与 GET 方法区分开来&…

智能升级,监控无界——全新安全生产生态算法一体机上线

安全生产生态算法一体机 安全生产生态算法一体机是万物纵横推出的一款AI算法软硬一体生态产品&#xff0c;重点面向安全生产领域&#xff0c;采用BM1684强劲AI芯片&#xff0c;内置安全生产场景所需的多种专用AI算法&#xff0c;面向各场景的人员监控、规范作业、异常检测等应…

Nginx 常用配置与应用

Nginx 常用配置与应用 官网地址&#xff1a;https://nginx.org/en/docs/ 目录 Nginx 常用配置与应用 Nginx总架构 正向代理 反向代理 Nginx 基本配置反向代理案例 负载均衡 Nginx总架构 进程模型 正向代理 反向代理 Nginx 基本配置反向代理案例 负载均衡 Nginx 基本配置…

基于AGX ORIN与FPGA K7实现PCIE高速数据通信/Orin与FPGA高速数据传输/XDMA在linux系统使用教程

因最近想学习AGX orin和FPGA实现数据高速通信&#xff0c;借此机会和大家一起学习AGX orin和FPGA 制作不易&#xff0c;记得三连哦&#xff0c;给我动力&#xff0c;持续更新&#xff01;&#xff01;&#xff01; 完整工程文件下载&#xff1a;AGX orin与FPGA实现PCIE完整…

如何查看MCU编译生成的elf(out)文件内容

一般地&#xff0c;我们想要知道单片机程序编译完后的结构我们可以查看map文件或者是elf/out文件&#xff0c;map文件不能看函数的汇编格式&#xff0c;只能查看编译完成后变量、代码的地址和占用空间大小&#xff0c;而elf文件里面更加详细&#xff0c;还包含了函数的汇编&…

gen_region_line 生成直线

gen_region_line (Operator) Name 名称 gen_region_line — Store input lines as regions.将输入行存储为region。 生成直线&#xff0c;直线区域 Signature 签名 gen_region_line( : RegionLines : BeginRow, BeginCol, EndRow, EndCol : ) Description 描述 运算符ge…

半导体切割研磨废水的处理技术

半导体切割研磨废水处理是一个复杂而关键的过程&#xff0c;其废水主要来源于切割、研磨等工艺环节&#xff0c;这些过程中使用的化学品、冷却水、洗涤水等会产生含有重金属、有机物、酸碱度不稳定以及高浓度硅化合物等污染物的废水。针对这些废水的特性&#xff0c;半导体行业…

基于SpringBoot的就业信息管理系统

你好&#xff0c;我是计算机学姐码农小野&#xff01;如果你对就业信息管理系统感兴趣或有相关需求&#xff0c;欢迎私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBootMySql 工具&#xff1a; MyEclipse、Tomcat 系统展示…

深入分析 Android BroadcastReceiver (九)

文章目录 深入分析 Android BroadcastReceiver (九)1. Android 广播机制的扩展应用与高级优化1.1 广播机制的扩展应用1.1.1 示例&#xff1a;有序广播1.1.2 示例&#xff1a;粘性广播1.1.3 示例&#xff1a;局部广播 1.2 广播机制的高级优化1.2.1 示例&#xff1a;使用 Pending…

筛选有合并单元格的数据

我们经常会使用合并单元格&#xff0c;比如下面表格&#xff0c;因为一个部门中会有不同的员工&#xff0c;就会出现如下表格&#xff1a; 但是当按部门去筛选的时候&#xff0c;会发现并不是我们预期的结果&#xff0c;部门列有空值&#xff0c;每个部门只有第一行数据可以被…

百数教学:如何用分析图表助力报表可视化?

表单收集的数据是决策的重要依据&#xff0c;而报表则是分析和处理这些数据的关键工具。 通过报表&#xff0c;我们能够进行明细查询&#xff0c;深入了解每一条数据的细节&#xff1b;通过汇总功能&#xff0c;用户能够快速掌握整体情况&#xff1b;计算平均值有助于用户评估…

编译开源车载Linux操作系统AGL

随着汽车行业的智能化和互联化趋势日益明显&#xff0c;车载系统作为汽车的重要组成部分&#xff0c;其性能和功能也受到了越来越多的关注。Linux作为一款开源的操作系统&#xff0c;具有稳定性高、安全性强、可定制性好等优点&#xff0c;因此成为了车载系统领域的热门选择。 …

九盾安防叉车UWB行人防撞标签系统助力安全管理

智慧叉车安全管理&#xff0c;作为现代工业物流领域的核心议题&#xff0c;始终牵动着每一位物流从业者的心弦。在九盾安防的研发下&#xff0c;叉车UWB行人防撞标签系统应运而生&#xff0c;为叉车安全行驶提供了强有力的技术保障。 这套叉车UWB行人防撞标签系统&#xff0c;其…

文件操作及部分文件函数的介绍学习(上)

目录 前言 1.为什么要要使用文件&#xff1f; 2.什么是文件&#xff1f; 2.1程序文件 2.2数据文件 2.3文件名 4.文件的打开和关闭 4.1 流和标准流 4.1.1流 4.1.2标准流 4.2文件指针 4.3文件的打开和关闭 结语 前言 Hello&#xff0c;亲爱的小伙伴们&#xff0c;作…