后端程序员入门react笔记(四)-综合运用,写一个小demo

news2024/9/22 11:41:46

样式模块化

有时候我们会遇到这样的问题,有两个css对一个class声明了样式,这样的话后引入的css会覆盖前面的css样式,导致样式冲突,那么我们怎么解决这种问题呢,我们可以使用样式的模块化,我们起名一个index.module.css和一个content.module.css
在这里插入图片描述

  • 我们在代码中这样使用
import React from "react";
import index from "./css/index.module.css";
import content from "./css/content.module.css";

class Hello extends React.Component {
    render() {
        console.log("i am render")
        return (
            <ul>
                <h1 className={index.title}>i am index.css</h1>
                <h1 className={content.title}>i am content.css</h1>
            </ul>
        )
    }
}
//导出组件
export default Hello;

Webstorm中的快捷键

  • rcc+tab键:用ES6模块系统创建一个React组件类
import React, {Component} from 'react';

class Hello extends Component {
    render() {
        return (
            <div>
                
            </div>
        );
    }
}

export default Hello;
  • rccp+tab键:创建一个带有PropTypes和ES6模块系统的React组件类
import React, {Component} from 'react';
import PropTypes from 'prop-types';

class Hello extends Component {
    render() {
        return (
            <div>
                
            </div>
        );
    }
}

Hello.propTypes = {};

export default Hello;
  • rcfc+tab键:创建一个带有PropTypes和所有生命周期方法以及ES6模块系统的React组件类
  • rcjc+tab键:用ES6模块系统创建一个React组件类(无导出)
  • rdp+tab键:快速生成defaultProps
  • rpc+tab键:用PropTypes和ES6 moudle系统创建一个React纯组件类
  • rrc+tab键:创建一个连接到redux的React组件类
  • rrdc+tab键:创建一个通过dispatch连接到redux的React组件类
  • rsc+tab键:创建没有PropTypes和ES6模块系统的无状态React组件
  • rscp+tab键:创建有PropTypes和ES6模块系统的无状态React组件
  • rsf+tab键:以命名函数的形式创建无状态的React组件,不使用PropTypes
  • rsfp+tab键:使用PropTypes将无状态的React组件作为命名函数创建
  • rsi+tab键:创建无状态的React组件,不使用PropTypes和ES6模块系统,但使用隐式返回和道具
  • rwwd+tab键:在没有导入的情况下,在ES6模块系统中创建一个有构造函数、空状态、proptypes和导出的React组件类。(主要用于React时,proptype由webpack提供插件提供)

组件化编码

我们通过前面应该也能认识到,我们写react,包括npm运行react,其实都是从index.js入口文件开始,那么index.js的格式至关重要

//引入核心库
import React from 'react';
//引入dom库
import ReactDOM from 'react-dom';
//引入组件
import Hello from './components/Hello';
ReactDOM.render(<Hello />,document.getElementById('root'))

拆分组件的原则

  • 单一职责原则:每个组件只负责一项功能,这样可以使组件的代码更加简洁易读,并且方便维护和重用。

  • 可复用性:每个组件都应该尽量独立,以便在其他地方重复使用。

  • 组件之间的耦合度:组件之间应该尽量避免耦合,这样可以使得组件的代码更加灵活,便于维护和修改。

  • 让组件尽可能小:尽可能使组件的代码行数少,这样可以使代码更易读,并且方便维护。

  • 可读性:组件的代码应该有良好的结构,并且有适当的注释,便于阅读和理解。

案列 TodoList

页面渲染

我先把一个没有任何功能的页面渲染出来,给一些初始数据

  • 我们在入口文件中,分别声明 引入的核心文件,dom库,和组件
//引入核心库
import React from 'react';
//引入dom库
import ReactDOM from 'react-dom';
//引入组件
import App from "./App";
ReactDOM.render(<App />,document.getElementById('root'))
  • 在App组件初始化一些数据并返回页面结构,并将初始化数据通过props传给list
import React, {Component} from 'react';
import "./App.css"
import Header from "./components/Header/Header"
import Footer from "./components/Footer/Footer"
import List from "./components/List/List"
class App extends Component {
    //初始状态
    state={
        todos:[
            {id:1,text:"吃饭",done:false}
            ,{id:2,text:"睡觉",done:false}
            ,{id:3,text:"打豆豆",done:false}
            ,{id:4,text:"看动画",done:false}
        ]
    }
    render() {
        return (
            <div className="todo-container">
                <div className="todo-wrap">
                    {/*引入header组件*/}
                    <Header />
                    {/*引入list组件*/}
                    <List data={this.state.todos} />
                    {/*引入Footer组件*/}
                    <Footer />
                </div>
                
            </div>
        );
    }
}

export default App;
  • List.jsx
import React, {Component} from 'react';
import Item from "../Item/Item";
import "./List.css"
class List extends Component {
    //限制属性类型
    render() {
        const todos = this.props.data;
        return (
            <ul className="todo-main">
                {todos.map((todo, index) => {
                    // 将todo对象作为props传给Item组件  ...默认和对象同名
                    return <Item key={todo.id} {...todo}></Item>;
                })}
            </ul>
        );
    }
}

export default List;
  • Item.jsx
import React, {Component} from 'react';
import "./Item.css"

class Item extends Component {
    render() {
        const {id,text,done}=this.props
        return (
            <li style={{backgroundColor: 'white'}}>
                <label >
                    <input type="checkbox"/>
                    <span>{text}</span>
                </label>
                <button className="btn btn-danger" style={{display:'none'}}>删除</button>
            </li>
        );
    }
}
export default Item;
  • Header.jsx
import React, {Component} from 'react';

class Header extends Component {
    render() {
        return (
            <div className="todo-header">
                <input type="text" placeholder="请输入你的任务名称,按回车键确认"/>
            </div>
        );
    }
}
export default Header;
  • Footer.jsx
import React, {Component} from 'react';

class Footer extends Component {
    render() {
        return (
            <div className="todo-footer">
                <label>
                    <input type="checkbox"/>
                    <span>
                        <span>已经完成2/全部5</span>
                    </span>
                </label>
                <button className="btn btn-danger">清除已完成任务</button>
            </div>
        );
    }
}

export default Footer;
  • 最终样式如下
    在这里插入图片描述

功能实现

鼠标悬浮

  • 首先我们来实现第一个功能,从简单功能入手,鼠标悬浮,列表背景色变色,并展示删除按钮,触发事件是onMouseEnter,鼠标离开恢复原状,触发事件是onMouseLeave,展示是否完成的状态,我们开始编写
class Item extends Component {

    //定义状态
    state={mouse:false}
               //接收参数
    handleMouse=(flag)=>{
       return ()=>{
           this.setState({
               mouse:flag
           })
       }
    }
    render() {
        const {id,text,done}=this.props
        const flag=this.state.mouse
        return (                                                                  //传入参数
            <li style={{backgroundColor: flag?'#ddd':'white'}} onMouseEnter={this.handleMouse(true)}
            onMouseLeave={this.handleMouse(false)}>
                <label >
                    <input type="checkbox" checked={done}/>
                    <span>{text}</span>
                </label>
                <button className="btn btn-danger" style={{display:flag?'block':'none'}}>删除</button>
            </li>
        );
    }
}

勾选和删除

  • 实现勾选和删除功能,当点击选中按钮的时候,触发的操作是onChange,删除按钮的触发事件是onClick,我们来实现一下,因为我们操作的数据来源于App.jsx的state,为了方便操作数据,我们将方法写在App.jsx里面,然后通过props传递给组件
    updateTodo=(id,done)=>{
        const todos=this.state.todos
        //遍历找到对应的todo,创建一个新的数组对象
        const newTodos=todos.map((todo)=>{
            if (todo.id===id){//改变状态
                return {...todo,done:done}
            }else{
                return todo
            }
        })
        this.setState({todos:newTodos})
    }

    deleteTodo=(id)=>{
        const todos=this.state.todos
        const newTodos=todos.filter((todo)=>{
           return todo.id !==id
        })
        this.setState({todos:newTodos})
    }
  • Item.jsx
    handelChange=(id)=>{
        return (e)=>{
            //根据id和checked状态更新数据
            this.props.updateTodo(id,e.target.checked)
        }
    }
    del=(id)=>{
        return ()=>{
            this.props.deleteTodo(id)
        }
    }
    render() {
        const {id,text,done}=this.props
        const flag=this.state.mouse
        return (                                                                  //传入参数
            <li style={{backgroundColor: flag?'#ddd':'white'}} onMouseEnter={this.handelMouse(true)}
            onMouseLeave={this.handelMouse(false)}>
                <label >
                    <input type="checkbox" checked={done}  onChange={this.handelChange(id)}/>
                    <span>{text}</span>
                </label>
                <button className="btn btn-danger" onClick={this.del(id)} style={{display:flag?'block':'none'}}>删除</button>
            </li>
        );
    }

添加

  • 接下来我们再实现一个添加todo的功能,触发事件就是Onkeyup
    App.js
    addTodo=(todo)=>{
        const todos=this.state.todos
        const newTodos=[...todos,todo]
        console.log(newTodos);
        this.setState({todos:newTodos})
    }

header.jsx

    addTodo = (e) => {
        // console.log(e);
        const {keyCode, target} = e
        if (keyCode === 13) {
            const todo = {
                id: nanoid(),
                text: target.value,
                done: false
            }
            // console.log(todo);
            this.props.addTodo(todo);
            target.value = '';
        }
    }

全选和一键清除

  • app.js
    checkAll=(bool)=>{//全选或者取消全选
        const todos=this.state.todos
        const newTodos=todos.map((todo)=>{
            return {...todo,done:bool}
        })
        this.setState({todos:newTodos})
    }

    delAll=()=>{
        const todos=this.state.todos
        const newTodos=todos.filter((todo)=>{
            return !todo.done
        })
        this.setState({todos:newTodos})
    }
  • footer.jsx
class Footer extends Component {
    state = {
        checked: false
    };

    //如果是状态false 点击后全选中
    checkAll = () => {
        const  checked=this.state.checked;
        this.props.checkAll(!checked);
        this.setState({
            checked: !this.state.checked
        });
    };
    delAll = () => {
        this.props.delAll();
    };

    render() {
        const {todos} = this.props;
        const total=todos.length

        const doneCount=todos.reduce((prev,cur)=>{
            return prev+(cur.done?1:0);
        },0)

        return (
            <div className="todo-footer">
                <label>
                    <input onChange={this.checkAll} checked={this.state.checked} type="checkbox"/>
                    <span>
                        <span>已经完成{doneCount}/全部{total}</span>
                    </span>
                </label>
                <button className="btn btn-danger" onClick={this.delAll}>清除已完成任务</button>
            </div>
        );
    }
}

react的事件监听大全

react所有事件监听

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

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

相关文章

关于HashMap的面试问题(26问面试题)

文章目录 关于HashMap的面试问题1、HashMap的底层实现2、HashMap的数组的元素类型3、为什么要使用数组&#xff1f;4、HashMap的数组的初始化长度5、HashMap的映射关系的存储索引index如何计算6、HashMap 为什么使用 &按位与运算代替%模运算&#xff1f;7、为什么要使用has…

微服务篇之限流

一、为什么要限流 1. 并发的确大&#xff08;突发流量&#xff09;。 2. 防止用户恶意刷接口。 二、限流的实现方式 1. Tomcat限流 可以设置最大连接数&#xff0c;但是每一个微服务都有一个tomcat&#xff0c;实现起来非常麻烦。 2. Nginx限流 &#xff08;1&#xff09;控…

解决IDEA git 提交慢的问题

文章目录 前言解决IDEA git 提交慢的问题 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! 解…

路由器的端口映射如何设置?

路由器的端口映射设置是网络连接中常用的配置功能&#xff0c;通过将外部网络访问请求映射到内部设备&#xff0c;实现局域网内设备的远程访问。本文将介绍如何进行路由器的端口映射设置&#xff0c;并以【天联】组网产品为例进行说明。 【天联】组网产品介绍 【天联】组网是一…

jenkins报错:Pseudo-terminal will not be allocated because stdin is not a terminal

jenkins的流水线部分代码如下 sh ssh root192.168.2.234 << remotessh cd /var/lib/jenkins/workspace/txkc /usr/local/maven/apache-maven-3.8.6/bin/mvn clean package -U ls remotessh执行流水线出现报错&#xff1a;Pseudo-terminal will not be allocated because…

汽车制造5G智能工厂数字孪生可视化平台,推进汽车行业数字化转型

汽车制造5G智能工厂数字孪生可视化平台&#xff0c;推进汽车行业数字化转型。在当今数字化时代&#xff0c;汽车行业正面临着前所未有的挑战和机遇。随着5G技术的快速发展&#xff0c;汽车制造正在向智能化、数字化转型&#xff0c;而数字孪生技术作为这一转型的核心驱动力&…

数据仓库【指标体系】

指标体系是将零散单点的具有相互联系的指标&#xff0c;系统化的组织起来&#xff0c;通过单点看全局&#xff0c;通过全局解决单点的问题。它主要是由指标和体系两部分组成。 指标是指将业务单元细化后量化的度量值&#xff0c;它使得业务目标可描述、可度量、可拆解&#xff…

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息队列【分布式高级篇六】

目录 1 消息队列(Message Queue)简介 1.1 概述 1.2 消息服务中两个重要概念 1.3 消息队列主要有两种形式的目的地 1.4 JMS和AMQP对比 1.5 应用场景 1.6 Spring支持 1.7 SpringBoot自动配置 1.7 市面上的MQ产品 2 RabbitMQ 2.1 RabbitMQ简介 2.1.1 RabbitMQ简介 2…

在UE5中制作UI环形进度条

在日常开发中&#xff0c;经常会有环形进度条UI的效果&#xff0c;例如技能CD时间、加载动画等&#xff0c;本文将通过材质球节点实现该效果&#xff0c;相较于准备美术素材&#xff0c;这样的做法更为方便&#xff0c;效果如下&#xff1a; 1.制作环状效果材质函数 在内容面…

SAP PP学习笔记03 - SAP中如何设定项目选择

上次这篇文章里面讲了界面的字段显示顺序及是否显示的设置。 并做了 事务代码 控制界面显示的例子。 SAP PP学习笔记02 - PP中配置品目Master时的顺序-CSDN博客 那么&#xff0c;每次控制界面显示什么都要这么挨个 这么设置一遍吗&#xff1f; 那岂不得烦死。 其实SAP里面参…

gitlab,从A仓库迁移某个工程到B仓库,保留提交记录

从A仓库&#xff0c;拷贝 git clone --bare ssh://git192.168.30.88:22/framework/platform.git 在B仓库新建工程&#xff0c;注意&#xff1a;一定要去掉默认的生成README文件进入platform.git 文件夹下&#xff0c;推送到B仓库 git push --mirror ssh://git192.168.30.100…

Stable Diffusion——文生图界面参数讲解与提示词使用技巧

Clip终止层数 什么是Clip CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09;是由OpenAI于2021年开发的一种语言图像对比预训练模型。其独特之处在于&#xff0c;CLIP模型中的图像和文本嵌入共享相同的潜在特征空间&#xff0c;这使得模型能够直接在图像和文…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第八天-高级驱动framebuffer(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1cd7LOSAvmPgVRPAyuMX7Fg?pwd1688 提取码&#xff1a;1688 帧缓冲&#xff08;framebuffer&#xff09;设备应用于linux显示技术方面。因为linux的显示平台已经全部基于framebuffer&#xff0c;所以目前在linux环境下开发图形化界面、…

电脑死机卡住怎么办 电脑卡住鼠标也点不动的解决方法

在我们使用电脑的过程中,可能由于电脑硬件或者软件的问题,偶尔会出现电脑卡住的情况,很多电脑小白都不知道电脑卡住了怎么办,鼠标也点不动,键盘也没用,一旦发生了这种情况,大家可以来参考一下小编分享的电脑死机卡住的解决方法。 电脑卡住鼠标也点不动的解决方法 方…

java替换jar中的class文件

1、编译好class文件2、找到需要修改class文件的路径3、解压需要替换的文件4、上传编译后的class文件5、重新压缩 在调整java代码过程中会遇到需要改jar包中的class文件的情况&#xff0c;改了如何替换呢&#xff1f; 1、编译好class文件 将需要修改的class文件代码复制到java编…

亿道丨三防平板丨加固平板丨三防加固平板丨改善资产管理

库存资产管理中最重要的部分之一是准确性&#xff1b;过时的库存管理技术会增加运输过程中人为错误、物品丢失或纸张损坏的风险。如今随着三防平板电脑的广泛使用&#xff0c;库存管理也迎来了好帮手&#xff0c;通过使用三防平板电脑能够确保库存管理、数据存储和记录保存的准…

R语言【base】——abs(),sqrt():杂项数学函数

Package base version 4.2.0 Description abs(x) 计算 x 的绝对值&#xff0c;sqrt(x) 计算 x 的正平方根。 Usage abs(x) sqrt(x) Arguments 参数【x】&#xff1a;一个数值或复数向量或数组。 Details 这些都是内部泛型原语函数:可以为它们单独定义方法&#xff0c;也可以…

Python 光速入门课程

首先说一下&#xff0c;为啥小编在即PHP和Golang之后&#xff0c;为啥又要整Python&#xff0c;那是因为小编最近又拿起了 " 阿里天池 " 的东西&#xff0c;所以小编又不得不捡起来大概五年前学习的Python&#xff0c;本篇文章主要讲的是最基础版本&#xff0c;所以比…

基于springboot+vue的靓车汽车销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

荧光淬灭剂Tide Quencher 2酸,Tide Quencher 2 acid ,能够与荧光物质发生反应

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;荧光淬灭剂Tide Quencher 2酸&#xff0c;Tide Quencher 2 acid &#xff0c;TQ2 acid 一、基本信息 产品简介&#xff1a;Tide Quencher 2 acid is highly favored in the field of scientific experiments due to…