React(2)

news2024/11/28 8:50:06

题外话:vscode有个插件可以很方便的快速写代码

输入rcc回车

 

 1.组件嵌套



import React, { Component } from 'react'



class Navbar extends Component{

    render(){
        return <div>Navbar</div>
    }
}


const Swiper=()=>{
    return <div>Swiper</div>
}


const Tabbar=()=>{
    return <div>Tabbar</div>
}




export default class App extends Component {
    render() {
        return (
            <div>
               <Navbar></Navbar>
               <Swiper></Swiper>
               <Tabbar></Tabbar>
            </div>
        )
    }
}

 如果想要继续嵌套  比如在NavBar组件中加入其它组件

错误的做法

 正确的做法

既然你说在Navbar组件里面   那就去这个组件里面加

2.组件的样式

import React, { Component } from 'react'

export default class StyleApp extends Component {
    render() {

        var name="zhangsan";
        return (
            <section>
                <div>1+2</div>
                <div>{1+2}</div>
                <div>{10>20? name:'lisi'}</div>
            </section>

        )
    }
}

 引入变量   执行表达式运算   使用{ }括起来

当我们给div加style样式的时候,一般我们是

<div style="background:red">样式</div>

但是放在react这里会报错

 The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.

“style”道具需要从样式属性到值的映射,而不是字符串。例如,当使用JSX时,style={{marginRight:spaceing+'em'}}。

也就是说我们需要使用{{ }} 或者 定义个对象传入

import React, { Component } from 'react'

export default class StyleApp extends Component {
    render() {

        var name="zhangsan";
        var style2={
            background:"blue"
        }
        return (
            <section>
                <div>1+2</div>
                <div>{1+2}</div>
                <div>{10>20? name:'lisi'}</div>
                <div style={{background:"red"}}>
                    样式1
                </div>
                <div style={style2}>
                    样式2
                </div>
            </section>

        )
    }
}

也可以引入自己写的css文件   就在js中引入  不要去html引入   不会热加载

.active{
    background-color: rgb(0, 255, 98);
}

可以将class改为className

总结两种方式:

1.行内样式

// 注意这里的两个括号,第一个表示我们在要JSX里插入JS了,第二个是对象的括号
<p style={{color:'red', fontSize:'14px'}}>Hello world</p>

2.使用class

React推荐我们使用行内样式,因为React觉得每一个组件都是一个独立的整体

其实我们大多数情况下还是大量的在为元素添加类名,但是需要注意的是, class 需要写成 className (因为毕竟是在写类js代码,会收到js规则的现在,而 class 是关键字)

3.事件绑定处理

3.1 绑定事件

采用on+事件名的方式来绑定一个事件,注意,这里和原生的事件是有区别的,原生的事件全是小写 onclick , React里的事件是驼峰 onClick ,React的事件并不是原生事件,而是合成事件。

onClick  onMouseOver  .......

 <button onClick={()=>{
     console.log("开始");
 }}>添加</button>

3.2 事件handler的写法

1.直接在render里写行内的箭头函数(不推荐)

2.在组件内使用箭头函数定义一个方法(推荐)

3.直接在组件内定义一个非箭头函数的方法,然后在render里直接使用 onClick= {this.handleClick.bind(this)} (不推荐)

4.直接在组件内定义一个非箭头函数的方法,然后在constructor里bind(this)(推荐)

bind(this) 修正this指向


import React, { Component } from 'react'

export default class BindAPP extends Component {
    render() {
        return (
            <section>
                <div>
                    事件绑定
                </div>
                <div>
                    <input></input>
                    <button onClick={()=>{console.log("开始1");}}>添加</button>
                    <button onClick={this.handler1}>添加1</button>  //不推荐
                    <button onClick={this.handler1.bind(this)}>添加1</button>  //不推荐
                    <button onClick={this.handler2}>添加2</button>
                    <button onClick={()=>{
                        this.handler3()   //比较推荐
                    }}>添加3</button>
                </div>
            </section>

        )
    }

    handler1(){
        console.log("开始111");
    }
    handler2=()=>{
        console.log("开始222");
    }
    handler3=()=>{
        console.log("开始333");
    }
}

 注意:前面两种不要自作主张this.handler加括号   this.handler() 错误错误!!!!!

如果this.handler()会自动执行   由于该方法里面没有写返回值  导致执行一次之后就是undefined

导致onclick点击是没反应的

3.3 Event 对象

和普通浏览器一样,事件handler会被自动传入一个 event 对象,这个对象和普通的浏览器 event 对 象所包含的方法和属性都基本一致。不同的是 React中的 event 对象并不是浏览器提供的,而是它自 己内部所构建的。它同样具有 event.stopPropagation 、 event.preventDefault 这种常用的方法。

4.ref的应用

4.1给标签设置ref="username"    (不推荐)

通过这个获取this.refs.username , ref可以获取到应用的真实dom

 <input ref="username"></input>
 <button onClick={()=>{
        console.log("开始1",this.refs.username);
  }}>添加</button>

所以获取输入框的值可以  this.refs.username.value

 <button onClick={()=>{
       console.log("开始1",this.refs.username.value);
   }}>添加</button>

4.2 新的写法  (推荐)

React.createRef()

export default class BindAPP extends Component {

    myref=React.createRef();
    render() {
        return (
            <section>
                <div>
                    事件绑定
                </div>
                <div>
                    <input ref={this.myref}></input>

                    <button onClick={() => {
                        console.log("开始1", this.myref);
                    }}>添加</button>

                </div>
            </section>

        )
    }


}

input对象在current   因此   可以通过 this.myref.current.value 获取输入框的值

5.组件的数据挂载方式

5.1 状态state初体验

状态就是组件描述某种显示情况的数据,由组件自己设置和更改,也就是说由组件自己维护,使用状态 的目的就是为了在不同的状态下使组件的显示不同(自己管理)

错误写法:一般我们会想到定义一个变量  然后使用这个变量  然后点击按钮触发  修改这个变量的值

import React, { Component } from 'react'

export default class App extends Component {

    render() {
        var text="收藏";

        return (
            <div>
                <h1>欢迎来到react世界</h1>
                <button onClick={()=>{
                    text="取消收藏"
                }}>{text}</button>
            </div>
        )
    }
}

前台显示我们会发现并没有起作用

需要使用state状态  和setState

import React, { Component } from 'react'

export default class App extends Component {

    state={
        text:"收藏"
    }

    render() {
        // var text="收藏";

        return (
            <div>
                <h1>欢迎来到react世界</h1>
                <button onClick={()=>{
                    this.setState({
                        text:"取消收藏"
                    })
                }}>{this.state.text}</button>
            </div>
        )
    }
}

import React, { Component } from 'react'

export default class App extends Component {

    state={
        myshow:true
    }

    render() {
        // var text="收藏";

        return (
            <div>
                <h1>欢迎来到react世界</h1>
                <button onClick={()=>{
                    this.setState({
                        myshow: !this.state.myshow
                    })
                    if(this.state.myshow){//收藏
                        //执行收藏的逻辑  比如给后端发请求保存收藏的状态值
                    }
                }}>{this.state.myshow?"收藏":"取消收藏"}</button>
            </div>
        )
    }
}

另一种写法constructor()

import React, { Component } from 'react'

export default class App extends Component {

    // state={
    //     myshow:true
    // }

    constructor(){
        super();
        this.state={
            myshow:true
        }
    }

    render() {
        // var text="收藏";

        return (
            <div>
                <h1>欢迎来到react世界</h1>
                <button onClick={()=>{
                    this.setState({
                        myshow: !this.state.myshow
                    })
                    if(this.state.myshow){//收藏
                        //执行收藏的逻辑  比如给后端发请求保存收藏的状态值
                    }
                }}>{this.state.myshow?"收藏":"取消收藏"}</button>
            </div>
        )
    }
}

5.2 列表渲染

import React, { Component } from 'react'

export default class App extends Component {

    state={
        list:["111","222","333"]
    }

    render() {
        return (
            <div>
                <ul>
                    {
                        this.state.list.map(item=><li>{item}</li>)
                    }
                    
                </ul>
            </div>
        )
    }
}

 成功渲染列表  但是会有一个警告   在列表中的每一个孩子应该有一个不同的key属性

设置key的原因是让react精准知道操作哪个

 为了列表的复用和重排,设置key值,提高性能

理想的key是独一无二的   一般设置为对象中的id


import React, { Component } from 'react'

export default class App extends Component {

    state={
        // list:["111","222","333"]
        list:[
            {
                id:1,
                text:"111"
            },
            {
                id:2,
                text:"222"
            },
            {
                id:3,
                text:"333"
            },
        ]
    }

    render() {
        return (
            <div>
                <ul>
                    {
                        this.state.list.map(item=>
                        <li key={item.id}>{item.text}</li>)
                    }
                    
                </ul>
            </div>
        )
    }
}

当然,如果只是为了将列表进行渲染显示,不需要进行增删,可以使用index


import React, { Component } from 'react'

export default class App extends Component {

    state={
        // list:["111","222","333"]
        list:[
            {
                id:1,
                text:"111"
            },
            {
                id:2,
                text:"222"
            },
            {
                id:3,
                text:"333"
            },
        ]
    }

    render() {
        return (
            <div>
                <ul>
                    {
                        this.state.list.map((item,index)=>
                        <li key={index}>{item.text}-----{index}</li>)
                    }
                    
                </ul>
            </div>
        )
    }
}

6.案例tolist增加和删除

6.1 增加


import React, { Component } from 'react'

export default class App extends Component {

    constructor() {
        super();
        this.state = {
            addList: [
                {
                    id: Date.parse(new Date()), title: "张三"
                }
            ]
        }

    }

    myref = React.createRef();

    render() {
        return (
            <div>
                <input ref={this.myref}></input>
                <button onClick={() => {
                    this.handler()
                }}>增加</button>
                <ul>
                    {
                        this.state.addList.map((item) =>
                            <li key={item.id}>{item.id}----{item.title}</li>)
                    }
                </ul>
            </div>
        )
    }

    handler = () => {
        let newList = [...this.state.addList]
        newList.push(
            {
                id: Date.parse(new Date()),
                title: this.myref.current.value
            }
        )
        this.setState({
            addList: newList
        }) 
    }
}

6.2 删除


import React, { Component } from 'react'

export default class App extends Component {

    constructor() {
        super();
        this.state = {
            addList: [
                {
                    id: Math.random()*10000, title: "张三"
                }
            ]
        }

    }

    myref = React.createRef();

    render() {
        return (
            <div>
                <input ref={this.myref}></input>
                <button onClick={() => {
                    this.handler()
                }}>增加</button>
                <ul>
                    {
                        this.state.addList.map((item,index) =>
                            <li key={item.id}>
                                {item.id}----{item.title}
                                <button onClick={()=>{
                                    this.deleteList(index)
                                }}>删除</button>
                            </li>
                            )
                    }
                </ul>
            </div>
        )
    }

    handler = () => {
        let newList = [...this.state.addList]
        newList.push(
            {
                id: Math.random()*10000,
                title: this.myref.current.value
            }
        )
        this.setState({
            addList: newList
        }) 
    }

    deleteList=(index)=>{
        console.log(index);
        let newList = [...this.state.addList];
        newList.splice(index,1);//从该下标开始删除  删除一个
        this.setState({
            addList: newList
        })
    }
}

优化:

1.输入框输入后,点击按钮, 应该自动清空输入框的值,避免每次重新输入还需要删;
 

this.myref.current.value=""

2.删除到一个都不剩的时候,一片空白,应该显示一个空空如也;

如果为空就..........................

条件渲染

 {this.state.addList.length==0 ?<div>暂无待办事项</div>:null}

换种写法:(推荐)

 {this.state.addList.length===0 && <div>暂无待办事项</div>}

条件为真就显示渲染  为假就移除

7.dangerouslySetInnerHTML

意思就是输入框中如果输入的是富文本,需要输出并解析

dangerouslySetInnerHTML顾名思义,危险的设置html 

固定写法{__html:}    注意是双下划线

  {/* {item.id}----{item.title} */}
  <span dangerouslySetInnerHTML={
       {
           __html:item.id+"------"+item.title
       }
   }></span>

import React, { Component } from 'react'

export default class App extends Component {

    constructor() {
        super();
        this.state = {
            addList: [
                {
                    id: Math.random()*10000, title: "张三"
                }
            ]
        }

    }

    myref = React.createRef();

    render() {
        return (
            <div>
                <input ref={this.myref}></input>
                <button onClick={() => {
                    this.handler()
                }}>增加</button>
                <ul>
                    {
                        this.state.addList.map((item,index) =>
                            <li key={item.id}>
                                {/* {item.id}----{item.title} */}
                                <span dangerouslySetInnerHTML={
                                    {
                                        __html:item.id+"------"+item.title
                                    }
                                }></span>

                                <button onClick={()=>{
                                    this.deleteList(index)
                                }}>删除</button>
                            </li>
                            )
                    }
                </ul>
                {/* {this.state.addList.length===0 ?<div>暂无待办事项</div>:null} */}
                {this.state.addList.length===0 && <div>暂无待办事项</div>}
            </div>
        )
    }

    handler = () => {
        let newList = [...this.state.addList]
        newList.push(
            {
                id: Math.random()*10000,
                title: this.myref.current.value
            }
        )
        this.setState({
            addList: newList
        }) 

        this.myref.current.value=""
    }

    deleteList=(index)=>{
        console.log(index);
        let newList = [...this.state.addList];
        newList.splice(index,1);//从该下标开始删除  删除一个
        this.setState({
            addList: newList
        })
    }
}

 

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

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

相关文章

学习babylon.js --- [2] 项目工程搭建

本文讲述如何搭建babylonjs的项目工程。 一 准备 首先创建一个目录叫MyProject&#xff0c;然后在这个目录里再创建三个目录&#xff1a;dist&#xff0c;public和src&#xff0c;如下&#xff0c; 接着在src目录里添加一个文件叫app.ts&#xff0c;本文使用typescript&#…

论文笔记--PTR: Prompt Tuning with Rules for Text Classification

论文笔记--PTR: Prompt Tuning with Rules for Text Classification 1. 文章简介2. 文章概括3 文章重点技术3.1 Pre-training & Fine-tuning & Prompt-based Fine Tuning3.2 PTR(Prompt Tuning with Rules)3.3 task decomposition3.4 Sub-prompts composition3.5 多个l…

平衡二叉搜索树--AVL详解剖析

目录 一、什么是AVL树 二、AVL树的作用 三、树节点的定义 四、节点的插入 五、旋转 1.左单旋 2.右单旋 左右双旋代码 &#xff1a; 4.右左双旋 一、什么是AVL树 AVL树就是二叉搜索树的进一步的优化&#xff0c;二叉搜索树虽可以缩短查找的效率&#xff0c;但是当数据有…

SDN系统方法 | 1. 概述

随着互联网和数据中心流量的爆炸式增长&#xff0c;SDN已经逐步取代静态路由交换设备成为构建网络的主流方式&#xff0c;本系列是免费电子书《Software-Defined Networks: A Systems Approach》的中文版&#xff0c;完整介绍了SDN的概念、原理、架构和实现方式。原文: Softwar…

SpringFactoriesLoader解析

一、SpringFactoriesLoader 介绍 1.1 SpringFactoriesLoader 简介 SpringFactoriesLoader 工厂加载机制是 Spring 内部提供的一个约定俗成的加载方式&#xff0c;与 java spi 类似&#xff0c;只需要在模块的 META-INF/spring.factories 文件中&#xff0c;以 Properties 类型…

DOT slam论文翻译

DOT:视觉SLAM的动态目标跟踪 摘要 - 在本文中&#xff0c;我们提出了DOT(动态目标跟踪)&#xff0c;这是一个添加到现有SLAM系统中的前端&#xff0c;可以显着提高其在高动态环境中的鲁棒性和准确性。DOT结合实例分割和多视图几何来生成动态对象的掩模&#xff0c;以允许基于刚…

实现 Rollup 插件alias 并使用单元测试提高开发效率

本篇文章是对 实现 Rollup 插件 alias | 使用 TypeScript 实现库的基本流程 | 使用单元测试提高开发效率 的总结。其中涉及到开发一个组件库的诸多知识点。 实现一个经常用的 rollup 插件 alias 首先执行npm init命令初始化一个package.json文件&#xff0c;因为插件使用了ty…

DevOps系列文章之Argo CD 使用

一、什么是 argo cd Argo CD 是用于 Kubernetes 的声明性 GitOps 连续交付工具。 二、为什么使用 argo cd Argo CD 可在指定的目标环境中自动部署所需的应用程序状态&#xff0c;应用程序部署可以在 Git 提交时跟踪对分支&#xff0c;标签的更新&#xff0c;或固定到清单的特…

测试开发之路 ---- 可读性,可维护性,可扩展性

目录 前言 测试框架与测试脚本的目标&#xff08;部分&#xff09; 分层 使用类似 xml 这种可扩展性强的语义存储数据 代码复用&#xff1a;抽象一切可抽象的&#xff0c;减少一切可能的代码相似与重复 活用 java 注解和反射&#xff08;python 中应该也有相关的机制&…

如何从视频中提取音频?分享三个免费的方法给大家!

在数字时代&#xff0c;视频和音频的使用越来越广泛。有时&#xff0c;您可能希望从视频中提取音频&#xff0c;以便单独使用或与他人分享。无需购买昂贵的软件或具备专业技能&#xff0c;下面将介绍三种免费的方法&#xff0c;帮助您从视频中提取音频。这些方法简单易行&#…

Unity学习笔记--siki学院保卫萝卜

生命周期&#xff1a; 在同一个脚本中的执行先后顺序&#xff1a;先左后右 Inspector 赋值 > 外部调用 > Awake > OnEnable > Start 脚本对象的失活与激活不作用于Awake方法&#xff0c;当方法中只有Awake方法时&#xff0c;控制脚本激活失活的对勾会消失掉 当…

vue3 中ref的函数用法

简介 这里说的ref不是响应式ref,是用在组件身上的ref标识&#xff0c;一般都是ref“某一个字符串”&#xff0c;本文介绍第二种用法&#xff0c;ref“()>{}”,对没错&#xff0c;ref可以等于一个回调函数 ref可以是一个回调 <el-input:ref"(vc: any) > (inputAr…

lwip-2.1.3自带的httpd网页服务器使用教程(三)使用CGI获取URL参数(GET类型表单)

上一篇&#xff1a;lwip-2.1.3自带的httpd网页服务器使用教程&#xff08;二&#xff09;使用SSI动态生成网页部分内容 认识URL参数 在上网的时候&#xff0c;我们经常会见到在网址后面带有?AB&CD这样的语法格式。例如&#xff1a;https://blog.csdn.net/ZLK1214/articl…

OpenCV的HSV颜色空间在无人车中颜色识别的应用

RGB属于三基色空间&#xff0c;是大家最为熟悉的&#xff0c;看到的任何一种颜色都可以由三基色进行混合而成。然而一般对颜色空间的图像进行有效处理都是在HSV空间进行的&#xff0c;HSV(色调Hue,饱和度Saturation,亮度Value)是根据颜色的直观特性创建的一种颜色空间, 也称六角…

如何撤销git上一次的commit(或已push)

如何撤销git上一次的commit&#xff08;或已push&#xff09; 当多人开发时&#xff0c;我们本地commit后&#xff0c;刚要push&#xff0c;发现忘记pull最新代码&#xff0c;此时会有冲突push失败&#xff0c; 我们想要撤销最近的一次commit 我们先简单介绍一下git git有三大…

GreenPlum数据库日常维护

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61…

使用 YOLOv8 和 Streamlit 构建实时对象检测和跟踪应用程序:第3部分:添加跟踪算法

介绍 对象跟踪是随着时间的推移识别一系列帧中的特定对象或多个对象的过程。它涉及定位对象在每个帧中的位置并跟踪其跨帧的移动。对象跟踪在各个领域都有广泛的应用,包括监控、机器人、自动驾驶、运动分析等。 跟踪算法使用各种技术(例如颜色直方图、运动分析、深度学习等)…

【多线程】(二)线程安全问题与线程同步

文章目录 一、多线程带来的风险1.1 观察线程不安全1.2 线程安全概念1.3 线程不安全的原因1.4 线程安全的解决方法 二、synchronized关键字2.1 synchronized 的特性2.2 synchronized 使用示例2.3 Java 标准库中的线程安全类 三、volatile关键字3.1 保证内存可见性3.2 禁止指令重…

Java反射的应用:动态代理

代理设计模式的原理 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 对于静态代理&#xff0c;特征是代理类和目标对象的类都是在编译期间确定下来&#xff0c;不利于程…

基于FPGA的按键消抖

文章目录 基于FPGA的按键消抖一、按键消抖原理二、按键消抖代码三、仿真代码编写四&#xff1a;总结 基于FPGA的按键消抖 一、按键消抖原理 按键抖动&#xff1a;按键抖动通常的按键所用开关为机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性…