React(2)

题外话: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
        })
    }
}

 

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

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

相关文章

适合小公司的自动化部署脚本

背景&#xff08;偷懒&#xff09; 在小小的公司里面&#xff0c;挖呀挖呀挖。快挖不动了&#xff0c;一件事重复个5次&#xff0c;还在人肉手工&#xff0c;身体和心理就开始不舒服了&#xff0c;并且违背了个人的座右铭&#xff1a;“偷懒”是人类进步的第一推动力。 每次想…

资深测试总结,自动化测试-JSON+YAML+CSV+Excel数据驱动(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 数据驱动 在自动…

pytorch深度学习逻辑回归 logistic regression

# logistic regression 二分类 # 导入pytorch 和 torchvision import numpy as np import torch import torchvision from torch.autograd import Variable import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import matplotlib.pyplot as …

android editText获取不到数据

问题分析&#xff1a;在onActivityCreated一开始就创建了findViewById&#xff0c;这时获取的是默认值&#xff0c;需要在点击按钮时重新加载才能获取到输入数据。 需要在点击按钮时重新加载数据&#xff1a;

ORACLE TO POSTGRESQL 来自2天上海的印象

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

.NET网络编程——TCP通信

一、网络编程的基本概念 : 1. 网络 就是将不同区域的电脑连接到一起&#xff0c;组成局域网、城域网或广域网。把分部在不同地理区域的计算机于专门的外部设备用通信线路 互联成一个规模大、功能强的网络系统&#xff0c;从而使众多的计算机可以方便地互相传递信息&#xff0c…

netty组件详解-上

netty服务端示例: private void doStart() throws InterruptedException {System.out.println("netty服务已启动");// 线程组EventLoopGroup group new NioEventLoopGroup();try {// 创建服务器端引导类ServerBootstrap server new ServerBootstrap();// 初始化服…

了解交换机接口的链路类型(access、trunk、hybrid)

上一个章节中讲到了vlan的作用及使用&#xff0c;这篇了解一下交换机接口的链路类型和什么情况下使用 vlan在数据包中是如何体现的&#xff0c;在上一篇的时候提到测试了一下&#xff0c;从PC1去访问PC4的时候&#xff0c;只从E0/0/2发送给了E0/0/3这是&#xff0c;因为两个接…

【SpringⅡ】简单高效地存储读取对象

目录 &#x1f9e5;1 配置扫描路径 &#x1f9e4;2 类注解实现 Bean 对象的存储 &#x1fa71;2.1 五大类注解的使用 &#x1f381;2.2 五大类注解之间的关系 &#x1f38f;2.3 Java 项目的标准分层 &#x1f383;3 方法注解实现 Bean 对象的存储 &#x1f388;3.1 Bean…

【论文阅读】一些多轮对话文章的体会 ACL 2023

前言 本文是对昨天看到的ACL 2023三篇多轮对话文章的分享这三个工作都是根据一些额外属性控制输出的工作&#xff0c;且评估的方面比较相似&#xff0c;可以借鉴 方法 这几篇文章都不是做general任务的&#xff0c;倾向于通过一些额外信息&#xff0c;来做specific任务 【1】…

【ceph】存储池pg个数如何设置

存储池pg个数如何设置 参考官方文档说明&#xff1a;https://old.ceph.com/pgcalc/参数说明TargePGs per OSD&#xff1a;每个OSD的pg数OSD#存储池包含osd个数%Data存储池写入数据占总OSD容量百分比Size存储池冗余数

vue2watch监听遇到的问题

1 vue 父组件里引入子组件 显示与隐藏是v-if控制时 父传入子的参数通过watch 监听请求接口时 watch 时而监听不到 请求接口的参数就不对 如图 父组件这么引入子组件v-show 和v-if 是有区别的 2 子组件通过watch 监听后 清空页面要展示的列表数据 重新从第一页加载数据&#x…

微服务sleuth+zipkin——链路追踪

一、链路追踪&#x1f349; 1.什么是链路追踪&#xff1f;&#x1f95d; 在大型系统的微服务化构建中&#xff0c;一个系统被拆分成了许多模块。这些模块负责不同的功能&#xff0c;组合成系统&#xff0c;最终可以提供丰富的功能。在这种架构中&#xff0c;一次请求往往需要…

简单了解UML类图

前言 大话设计中&#xff0c;多次使用UML类图来表示&#xff0c;并也给了基本的介绍&#xff0c;这里从书中选出UML图和代码做成笔记&#xff0c;以方便查找。 1、类 注意前面的符号&#xff1a; &#xff1a;public -&#xff1a;private #&#xff1a;protected 抽象类&…

在阿里云linux上安装MySql数据库

我们先远程连接服务器 然后输入 sudo yum update重新运行一下 然后 sudo yum install mysql-server安装 mysql 服务 其中有两次 y n 选择 都选y就好了 然后 运行 sudo service mysqld start启动MySql 然后 我们查看一下MySql sudo service mysqld status

Debian 12上如何关闭nobody共享文件夹,一个能让INSCODE AI 创作助手不知所措的小问题

这个问题之前在Debian 10和11上都没有遇到过&#xff0c;换上Debian 12后Samba的设置就出现了状况&#xff0c;装上Samba后什么都没有设置就在局域网可以看到&#xff1a; 根据之前的经验在/etc/samba/smb.conf里查了很久也没有看出所以然来&#xff0c;后来又问了INSCODE AI…

[洛谷]P8662 [蓝桥杯 2018 省 AB] 全球变暖(dfs)

读题不规范&#xff0c;做题两年半&#xff01; 注意&#xff1a;被海水淹没后的陆地应用另一个字符表示&#xff0c;而不是把它变为海洋&#xff0c;这个点可以便利&#xff0c;但不能被当作起点&#xff0c;不然就只有 36 分。 ACocde: #include<bits/stdc.h> using…

静态数码管显示

学习芯片&#xff1a; EP4CE6F17C8 本次学习使用的为共阴极数码管&#xff0c;即用低电平点亮数码管&#xff0c;同样可知&#xff0c;共阳极数码管的阳极连在一起&#xff0c;即用高电平点亮数码管。 八段数码管示意图&#xff1a; a,b,c,d,e,f,g,dg表示八段数码管时&#…

微服务sleuth+zipkin---链路追踪+nacos配置中心

目录 1.分布式链路追踪 1.1.链路追踪Sleuth介绍 1.2.如何完成sleuth 1.3.zipkin服务器 2.配置中心 2.1.常见配置中心组件 2.2.微服务集群共享一个配置文件 2.2.1实时刷新--配置中心数据 2.2.2.手动写一个实时刷新的配置类 ----刷新配置文件 2.3.多个微服务公用一个配…

FPGA——点亮led灯

文章目录 一、实验环境二、实验任务三、实验过程3.1 编写verliog程序3.2 引脚配置 四、仿真4.1 仿真代码4.2仿真结果 五、实验结果六、总结 一、实验环境 quartus18.1 vscode Cyclone IV开发板 二、实验任务 每间隔1S实现led灯的亮灭&#xff0c;实现流水灯的效果。 三、实…