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

目录

一、带输入框的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.mfbz.cn/a/778778.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最近你悟出来什么道理?

点击上方△腾阳 关注 转载请联系授权 大家伙&#xff0c;我是腾阳。 活了近30年的我&#xff0c;终于领悟到&#xff0c;人生的旅途是一场深刻而复杂的自我发现与灵魂成长的壮丽征途。 这不仅仅是对外在世界的探索&#xff0c;更是内心深处的一场革命&#xff0c;是灵魂从懵…

BulingBuling - 作息安排 [Reset Your Routine] - 1

The Blinkist Team: [ Reset Your Routine ] 如果你发现自己很难按部就班&#xff0c;或者陷入工作效率低的困境&#xff0c;那么你可能需要重新调整一下作息时间&#xff01;从睡眠和营养&#xff0c;到待办事项和井井有条--本指南为你提供了各种技巧和策略&#xff0c;让你的…

餐饮管理系统-计算机毕业设计源码43667

餐饮管理系统 摘 要 在信息化、数字化的时代背景下&#xff0c;餐饮行业面临着前所未有的挑战与机遇。为了提高运营效率、优化顾客体验&#xff0c;餐饮企业亟需一套高效、稳定且灵活的管理系统来支撑其日常运营。基于Spring Boot的餐饮管理系统应运而生&#xff0c;成为餐饮行…

STM32基本定时器、通用定时器、高级定时器区别

一.STM32基本定时器、通用定时器、高级定时器区别 STM32系列微控制器中的定时器资源分为基本定时器&#xff08;Basic Timer&#xff09;、通用定时器&#xff08;General Purpose Timer&#xff09;和高级定时器&#xff08;Advanced Timer&#xff09;三类&#xff0c;它们在…

SpringBoot新手快速入门系列教程:基于JPA的一个Mysql简单读写例子

现在我们来做一个简单的读写Mysql的项目 1&#xff0c;先新建一个项目&#xff0c;我们叫它“HelloJPA”并且添加依赖 2&#xff0c;引入以下依赖&#xff1a; Spring Boot DevTools (可选&#xff0c;但推荐&#xff0c;用于开发时热部署)Lombok&#xff08;可选&#xff0c…

好消息!Stable Diffusion 3 允许商业化,很快开源更大版本模型

7月6日凌晨&#xff0c;著名开源大模型平台Stability AI修改了社区许可协议&#xff0c;最新发布的文生图模型Stable Diffusion 3 Medium允许商业化&#xff08;以下简称“SD3-M”&#xff09;。 如果企业、个人开发者每年收入低于100万美元&#xff08;大约726万元人民币&…

数字信号处理及MATLAB仿真(3)——采样与量化

今天写主要来编的程序就是咱们AD变换的两个步骤。一个是采样&#xff0c;还有一个是量化。大家可以先看看&#xff0c;这一过程当中的信号是如何变化的。信号的变换图如下。 先说说采样&#xff0c;采样是将连续时间信号转换为离散时间信号的过程。在采样过程中&#xff0c;连续…

关于HTTP的攻击实验

实验原理&#xff1a;1. 根据ARP中间人攻击&#xff0c;获取 用户和服务器之间的数据2. 将获取到的数据 通过一定的技术来复原&#xff0c;进而获取用户的信息或者 相关权限实验拓扑图 将 kali 的网卡改为桥接模式&#xff0c;查看Kali和本机的ip 启动ettercap&#xff0c;…

android手机电视相框项目-学员做出个bug版本邀请大家review提意见

背景 前几天给我的vip学员布置了一个android手机/电视相框的项目&#xff0c;具体详情看如下链接&#xff1a; https://mp.weixin.qq.com/s/l2roDoco-o59SLlORENZlA 这个项目我说过不给提供答案哈&#xff0c;让各位学员朋友自己独立思考完成哈&#xff0c;因为尽量想让大家慢…

ABAP 一篇作业分享

目录 一&#xff1a;要件定义&#xff1a; 二&#xff0c;具体代码&#xff1a; 三&#xff0c;测试结果&#xff1a; 一&#xff1a;要件定义&#xff1a; 二&#xff0c;具体代码&#xff1a; *&-------------------------------------------------------------------…

强化学习编程实战-1-一个及其简单的强化学习实例(多臂赌博机)

1.1 多臂赌博机 一台拥有K个臂的机器&#xff0c;玩家每次可以摇动K个臂中的一个&#xff0c;摇动后&#xff0c;会吐出数量不等的金币&#xff0c;吐出金币的数量服从一定的概率分布&#xff0c;而且不同臂的概率分布不同。 多臂赌博机的问题是&#xff1a;假设玩家共有N次摇地…

CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)

CSS 样式选择器&#xff0c;用于选中页面中的 html 元素&#xff0c;以便添加 CSS 样式。 按渲染性能由高到低 依次是&#xff1a; ID 选择器 #id 通过元素的 id 属性选中元素&#xff0c;区分大小写 <p id"p1" >第一段</p>#p1{color: red; }但不推荐使…

eclipse ide中文件编码的修改,解决中文乱码的问题。

1、先上一张图&#xff1a; 记得之前设置过&#xff0c;但是稍微一变&#xff0c;环境编码又到了ISO-8859-1了&#xff0c;然后就出现了乱码。 2、设置eclipse的编码&#xff1a; Preferences--General -- Content Types -- Text -- Java Properties File -- Default encoding…

要想贵人相助,首先自己得先成为贵人!

点击上方△腾阳 关注 转载请联系授权 在金庸江湖里&#xff0c;有两位大侠&#xff0c;一个是萧峰&#xff0c;一个是郭靖。 郭靖在《射雕英雄传》里是绝对的主角&#xff0c;在《神雕侠侣》当中也是重要的配角&#xff0c;甚至可以说是第二主角。 谈起郭靖&#xff0c;很多…

策略为王股票软件源代码-----如何修改为自己软件61----资讯菜单修改-----举例---------调用同花顺网页------

http://stock.sina.com.cn 将原来的新浪行情,修改为同花顺, 搜索 stock.sina.com.cn... StkUI\View\InfoView.cpp(58):char

20K Stars!一个轻量级的 JS 库

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 Driver.js 是一个轻量级的 JavaScript 库,旨在帮助开发人员创建网站或应用程序的引导和教程。通过 Driver.js,您可以引导用户了解网站的各个功能和使用方式。 Driver.js 提供了高度可定制的功能,使其能够适应各种需求和…

【Python学习笔记】菜鸟教程Scrapy案例 + B站amazon案例视频

背景前摇&#xff08;省流可以跳过这部分&#xff09; 实习的时候厚脸皮请教了一位办公室负责做爬虫这块的老师&#xff0c;给我推荐了Scrapy框架。 我之前学过一些爬虫基础&#xff0c;但是用的是比较常见的BeautifulSoup和Request&#xff0c;于是得到Scrapy这个关键词后&am…

在AvaotaA1全志T527开发板上使用AvaotaOS 部署 LNMP 服务

准备工作 在这之前&#xff0c;确保设备已经联网&#xff0c;可以用 ifconfig 命令查看联网状态。这里使用的是 WIFI 联网&#xff0c;可以看到已经获取了IP地址。 由于安装需要较长时间&#xff0c;建议使用 screen 后台登录&#xff0c;这里看到系统默认已经安装了 screen …

6800和8080单片机读写时序和液晶屏接口

前言&#xff1a; 随着单片机发展&#xff0c;集成度越来越高&#xff0c;因此目前单片机较少使用RD和WR信号操作外设&#xff0c;因此很多时候&#xff0c;变成了6800和8080单片机读写液晶屏了。早期的读写本质上是对一个地址进行即时的操作&#xff0c;现在可能是等数据送到…

vue中自定义设置多语言(包括使用vue-i18n),并且运行js脚本自动生成多语言文件

在项目中需要进行多个国家语言的切换时&#xff0c;可以用到下面方法其中一个 一、自定义设置多语言 方法一: 可以自己编写一个设置多语言文件 在项目新建js文件&#xff0c;命名为&#xff1a;language.js&#xff0c;代码如下 // language.js 文档 let languagePage {CN…