React学习(JSX+组件+state+表单)

2023-11-17

JSX

JSX是一种JavaScript语法的拓展,React中就是用JSX来描述用户界面的。
在JavaScript中写JSX代码,必须要有:

<script type="text/babel"></script>

在写js或jq的时候,我们可以不用写type,但这个一定要写,引用JSX文件也要写。

元素是构成 React 应用的最小单位,JSX 就是用来声明 React 当中的元素,而这个元素就是我们在js中的对象。

声明元素

var myDivElement = <div className="foo" />;
const element = <h1>Hello, world!</h1>;

和js的声明有一些像,但又有不同,它直接声明了一个对象,并且:

在ReactDOM中,使用className代替class,用htmlFor代替for

渲染元素

那么我们怎么把React元素渲染到页面中?
我们是用ReactDOM.render(渲染元素,插入节点)方法。

    const text = <h1>hello word!</h1>;
    ReactDOM.render(
        text,
        document.querySelector("div")
    );
    //把text对象插入到div中

ReactDOM.render()方法每次只能传递一个元素,如果想要传递多个元素,比如:p+span+ul li,这种的,可以嵌套HTML代码,用div包裹他们,相当于直接传递了div这一个元素。

    ReactDOM.render(
        <div>
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
        <p>123</p>
        </div>
        ,
        document.querySelector("div")
    );

在这里插入图片描述
但包裹的时候,我们无法在里面直接使用我们定义的变量,比如:

    ReactDOM.render(
        <div>
        text
        <p>123</p>
        </div>
        ,
        document.querySelector("div")
    );

这样会直接输出text,会把他直接当成文本来处理。那我们怎么才能使用变量呢?那就需要使用{}

{}

{}中可以写很多东西。

  1. 表达式
    var i=1;
    ReactDOM.render(
        <div>
        <p>123</p>
        <p>{1*2+3}</p>
        <p>{i == 1 ? "true" : "false" }</p>
        //不能使用if else语句,可以使用三元运算符
        </div>
        ,
        document.querySelector("div")
    );

在这里插入图片描述

  1. css样式
    var mystyle={
        color: 'red', //颜色值要用引号括起来
        fontSize: 20 //React会直接在后面加px
    };//可以把mystyle看成对象,{}作用是展开,和数组一结合更能看出来
    ReactDOM.render(
        <div>
        <p style = {mystyle} >123</p>
        </div>
        ,
        document.querySelector("div")
    );
  1. 注释
    ReactDOM.render(
    	//没有在标签内部,可以
        <div>
        <p style = {mystyle} >123</p>
        //在js中这种注释可以,但在标签内部不可以
        {/*在标签内部,只能使用这种注释*/}
        </div>
        ,
        document.querySelector("div")
    );

csdn中都会变斜体,因为这是js的代码环境。

  1. 数组
var arr = [
  <h1>菜鸟教程</h1>,
  <h2>学的不仅是技术,更是梦想!</h2>,
];
ReactDOM.render(
  <div>{arr}</div>,
  document.getElementById('example')
);
  1. 函数
function formatName(user) {
    return user.firstName + ' ' + user.lastName;
}
const user = {
    firstName: 'harper',
    lastName: 'Perez'
}
const element = <h1> Hello, {formatName(user)}! </h1>
ReactDOM.render (
    element,
    document.querySelector('div')
)

{}的展开作用

    ReactDOM.render(
        <div>
            <p style={{fontSize:20,color:'blue'}}>123</p>
            <div>{[<h1>123</h1>,<h2>123</h2>]}</div>
        </div>
        ,
        document.querySelector("div")
    );

在这里插入图片描述

组件

在JSX中定义组件,最简单的方式就是定义一个function函数
而这个组件的第一个字母必须大写

function HelloMessage(props) {
    return <h1>Hello {props.name}!</h1>;
}
 
const element = <HelloMessage name="Runoob"/>;

HelloMessage就是我们自定义的一个组件props是传递的参数,我们使用< HelloMessage />来渲染组件,相当于调用函数。
并且在< HelloMessage />后面的name会作为props的一个属性来使用,我们可以使用props.name来使用这个属性。

function Name(props) {
    return <h1>网站名称:{props.name}</h1>;
}
function Url(props) {
    return <h1>网站地址:{props.url}</h1>;
}
function Nickname(props) {
    return <h1>网站小名:{props.nickname}</h1>;
}
function App() {
    return (
    <div>
        <Name name="菜鸟教程" />
        <Url url="http://www.runoob.com" />
        <Nickname nickname="Runoob" />
    </div>
    );
}
 
ReactDOM.render(
     <App />,
    document.getElementById('example')
);

练习

基本的东西也不多,下面主要根据阮一峰的react入门来练习,不过它上面的代码是es5的了,现在推荐使用es6,所以我会把他的代码转成新版来写,可以对照着看。

this.props.children

    class NotesList extends React.Component{  
        render = ()=>{  
            return ( 
                <ol>
                {
                    React.Children.map( //this指向类,this.props.children是NotesList下的两个节点,map方法用于遍历
                        this.props.children,function(child){
                            return <li>{child}</li>
                        }
                    )
                }
                </ol>
            );  
        }  
    }
    ReactDOM.render(
        //定义一个NotesList组件,里面包含两个节点,把他们渲染到div中
        <NotesList>
            <span>hello</span>
            <span>word</span>
        </NotesList>
        ,  
        document.querySelector('div'),
    )    

React.Children用来处理this.props.children,再使用map遍历子节点。

this.props.children 的值有三种可能:如果当前组件没有子节点,它就是 undefined ;如果有一个子节点,数据类型是object ;如果有多个子节点,数据类型就是 array

PropTypes

组件中有PropTypes属性,用来验证实例的属性是否符合要求

    class Example extends React.Component{  
        render = ()=>{  
            return ( 
               <h1>{this.props.title}</h1>
            );  
        }  
    }
    Example.propTypes = {
        title:PropTypes.string//规定title只能是string
    };
    ReactDOM.render(
        <Example title={123}/>
        ,  
        document.querySelector('div'),
    )    

在这里插入图片描述

默认值

    Example.defaultProps = {
        name : 'bob'
    }

使用defaultPropsprops 设置默认值,如果构造实例时并没有规定name值,则会使用默认值。

获取真实的DOM节点

组件并不是真正的DOM节点,而是存在于内存中的一种数据结构,叫虚拟DOM。当它插入文档后,才会变成真正的DOM。所有的变动,都现在虚拟DOM上发生,然后再反映到真正的DOM上。也就是说,组件和真正的DOM节点并不是直接操作的,但我们有时候需要获取真正的DOM节点。

    class Example extends React.Component{  
        constructor(props){
            super(props);
            this.handleClick=this.handleClick.bind(this);
        }
        handleClick(){
            this.refs.myinput.focus();
        }
        render = ()=>{  
            return ( 
                <div>
                    <input type="text" name="" id="" ref="myinput"/>
                    <input type="button" value="Focus the text input" onClick={this.handleClick}/>
                </div>
            );  
        }  
    }
    ReactDOM.render(
        <Example/>
        ,  
        document.querySelector('div'),
    )   

效果:
在这里插入图片描述
文本输入框必须有一个 ref 属性,然后 this.refs.[refName] 就会返回这个真实的 DOM 节点。

this.state

组件最重要的作用就是跟用户互动,互动就会有更新。在React中,组件就是一个状态机,一开始有一个初始状态,用户互动,会导致状态发生改变,重新渲染。

    class Example extends React.Component{  
        constructor(props){
            super(props);
            this.state = {liked : false};//初始化state状态,属性liked为false
            this.handleClick=this.handleClick.bind(this);//将this绑定在此类
        }
        handleClick(){
            this.setState({liked : !this.state.liked});//改变属性liked
        }
        render = ()=>{  
            var text = this.state.liked ? 'like' : 'haven\'t liked';
            return ( 
                <p onClick={this.handleClick}>
                    You {text} this. Click to toggle.
                </p>
            );  
        }  
    }
    ReactDOM.render(
        <Example/>
        ,  
        document.querySelector('div'),
    )    

在这里插入图片描述
setState的用法可以参考这个:https://blog.csdn.net/qq_44162474/article/details/107752079?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-4&spm=1001.2101.3001.4242

当用户点击组件,导致状态变化,this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件。

表单

用this.state获取表单改变时的值。

    class Example extends React.Component{  
        constructor(props){
            super(props);
            this.state = {value : 'Hello!'};//初始化state状态
        }
        handleChange = (event) => {//event代表发生事件源
            this.setState({value : event.target.value});
            //setState可以改变
        }
        render = ()=>{  
            return ( 
                <div>
                    <input type="text" value={this.state.value} onChange={this.handleChange} />
                    <p>
                    {this.state.value}
                    </p>
                </div>  
            );  
        }  
    }
    ReactDOM.render(
        <Example/>
        ,  
        document.querySelector('div'),
    )  

在这里插入图片描述

组件的生命周期

组件的生命周期被分为三个状态:

  1. Mounting:已插入真实DOM
  2. Updating:正在被重新渲染
  3. Unmouting:已移出真实DOM

状态处理函数:
will 函数在进入状态之前调用,did 函数在进入状态之后调用

  • componentWillMount()
  • componentDidMount()
  • componentWillUpdate(object nextProps, object nextState)
  • componentDidUpdate(object prevProps, object prevState)
  • componentWillUnmount()
  • componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用
  • shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用
    在这里插入图片描述
class Example extends React.Component{  
  constructor(props){
      super(props);
      this.state = {opacity : 1.0};//初始化state状态
  }
  componentDidMount=function(){//当组件插入到真实dom树后执行的操作
    this.timer=setInterval(function () {
        var opacity=this.state.opacity;//1.0
        opacity -= 0.5;//0.5
        if(opacity<0.1){
            opacity = 1.0;
        }
        this.setState({opacity:opacity});
    }.bind(this),1000);//每间隔1000毫秒改变透明度
  }
  render = ()=>{  
      return ( 
          <div style={{opacity:this.state.opacity}}>
              hello{this.props.name}
          </div>  
      );  
  }  
}
ReactDOM.render(
  <Example name="world"/>
  ,  
  document.querySelector('div'),
)     


例子

class Example extends React.Component{  
    constructor(props) {
        super(props);
        this.state = {
          isGoing: true,//初始化是否离开和访客数
          numberOfGuests: 2
        };
    
        this.handleInputChange = this.handleInputChange.bind(this);
    }
    
    handleInputChange(event) {
        const target = event.target;//获取当前dom元素
        const value = target.type === 'checkbox' ? target.checked : target.value;
        //当前元素的type如果是checkbox,那么value=false/true,否则是number
        const name = target.name;
        //当前元素的name属性存到name变量
        this.setState({
          [name]: value//isGoing:true/false;numberOfGuests:2
          //因为现在name是变量,所以需要用[]引用,实现动态修改key值
        });
    }
    
      render() {
        return (
          <form>
            <label>
              是否离开:
              <input
                name="isGoing"
                type="checkbox"
                checked={this.state.isGoing}
                onChange={this.handleInputChange} />
            </label>
            <br />
            <label>
              访客数:
              <input
                name="numberOfGuests"
                type="number"
                value={this.state.numberOfGuests}
                onChange={this.handleInputChange} />
            </label>
          </form>
        );
      }
}
ReactDOM.render(
  <Example name="world"/>
  ,  
  document.querySelector('div'),
)     


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React学习(JSX+组件+state+表单) 的相关文章

  • VUE 常用指令

    目录 Vue概念 同类产品 官网 特点 渐进式框架 入门案例 html 改造入门案例 html MVVM框架 基础语法 运算符 operator 方法 methods Vue解析数据 三种data值的写法 高级用法 v 命令 指令集 双向绑

随机推荐

  • Java中GET请求与POST请求,前端传参与后端接收实例

    此示例以代码方式展现 可直接结合controller层每个接口上方注释与其接口传递参数方式理解 前端传参直接就以apiPost工具来代替 apiPost调用后端接口几种方式 代码 controller层 package com chensi
  • 读写ini配置文件(C++)

    文章目录 1 为什么要使用ini或者其它 例如xml json 配置文件 2 ini文件基本介绍 3 ini配置文件的格式 4 C 读写ini配置文件 5 代码示例 6 配置文件的解析库 文章转载于 https blog csdn net
  • Proteus中继电器详解

    目录 一 引言 二 继电器实物 三 Proteus继电器选择 四 继电器工作原理及Proteus中继电器引脚 五 Proteus中继电器正确接法举例及仿真视频记录 一 引言 我们都知道继电器可以利用小信号控制大功率 有四两拨千斤功效 同时还
  • 一些关于TV的概念

    文章目录 TTX FVP BML MTS BTSC 一些关于TV的属于解释 TTX TTX是一种电视机上的文字广播系统 可以在电视屏幕上显示文字信息 如新闻 天气预报 股票行情 电视剧剧情介绍等 它是通过电视信号的一部分传输的 不需要额外的
  • springboot 2.0.4 关闭程序————我走过的那些坑

    首次接触springboot项目 在本地测试的时候 发现不知道怎么关闭程序 虽然后来不得不用杀死进程的方式解决 但总觉得这种方式太简单粗暴 就准备问问度娘别人都是怎么做的 结果普遍答案是 步骤 第一步 引入依赖
  • 中央和省级产业政策匹配数据(含完整stata代码)

    1 数据来源 国泰安数据库 2 时间跨度 中央产业政策 2001 2020年 和省份产业政策 2006 2020年 3 区域范围 全国 4 指标说明 具体匹配代码详见分享文件中的do文件 匹配流程 1 整理证监会2001年分类标准和证监会2
  • Python 进阶(七): Word 基本操作

    1 概述 Word 是一个十分常用的文字处理工具 通常我们都是手动来操作它 本节我们来看一下如何通过 Python 来操作 Python 提供了 python docx 库 该库就是为 Word 文档量身定制的 安装使用 pip insta
  • openwrt 格式化_如何在路由器上格式化 U 盘、硬盘

    本教程适用于梅林 padavan LEDE openwrt 等固件 以下具体方法都基于 ext4 NTFS 相关错误不做回答 使用ssh连接路由器 把U盘插到路由器上 我们需要在命令行进行以下4步操作 安装fdisk 一般梅林 Padava
  • Keil(MDK-ARM-STM32)系列教程(六)Configuration(Ⅱ)

    写在前面 本文接着上一篇文章 Configuration 进行讲述Configuration后面三项Shortcut Keys快捷键 Text Completion代码完形 Other其他的内容 Shortcut Keys快捷键 Keil软
  • 精学JS:宏任务 & 微任务的运行机制

    首先分析宏任务和微任务的运行机制 并针对日常开发中遇到的各种宏任务 微任务的方法 结合一些例子来看看代码运行的顺序逻辑 把这部分知识点重新归纳和梳理 在日常开发中 例如 setTimeout和 promise都是经常会使用到的 JS方法 当
  • 操作系统【六】虚拟内存

    传统存储管理方式的不足 一次性 作业必须一次性全部装入内存后才能开始运行 这会造成 当作也很大时不能全部装入内存 当大量作业要求运行时 由于内存无法容纳所有作业 因此只有少量作业能够运行 导致多道程序并发度下降 驻留性 一旦作业被装入内存
  • 【计算机视觉】Visual Transformer (ViT)模型结构以及原理解析

    文章目录 一 简介 二 Vision Transformer如何工作 三 ViT模型架构 四 ViT工作原理解析 4 1 步骤1 将图片转换成patches序列 4 2 步骤2 将patches铺平 4 3 步骤3 添加Position e
  • Python——LSTM、GRU 时间序列股票数据预测(文末完整代码)

    GRU 是在 LSTM 基础上的简化 将 LSTM 内部的三个闸门简化成两个 往往 GRU 的计算效果会优于 LSTM 目录 1 导入工具包 2 获取数据集 3 数据预处理 4 时间序列滑窗 5 数据集划分 6 构造网络模型 7 网络训练
  • tracert命令返回的三个时间为什么有时会出现1个或2个星号?

    如图 三个时间里有1个或者2个显示星号 这是为什么呢 如果是配置了ACL丢弃了响应报文的话按理应该3个都显示星号呀 直接ping这个ip的话不会出现丢包 时延也很稳定 这个问题很诡异 演绎一下 仅供参考 首先traceroute 是利用 T
  • 后台系统切换主题颜色(换肤) Vue+ elementUi

    文章目录 前言 一 css color function 二 使用步骤 1 下载依赖项 2 引入 3 使用 定义data数据 3 定义方法 4 调用方法使用 5 模板 6 AllCode 总结 前言 不断学习demo中 有好的demo会记录
  • antd pro protable request请求有数据 页面不渲染或postdata里的data一直是undefined

    异常原因 protable的request请求默认的数据格式为 data pageSize 10 current 1 total 28 success true request请求如果返回的数据格式不是以上形式就会获取不到data page
  • STM32 DMA 应用之(二) DMA 串口 数据传输--发送

    一 DMA请求映像 由此我们知道如果需要使用串口1的发送功能需要用到的是DMA1 Channel4 使用串口1的接收功能需要用到的是DMA1 Channel5 二 怎样配置软件来使用DMA 把数据传到串口发送 1 配置dma 函数名称 Dm
  • vim退出时提示:q:未找到命令的解决办法

    有一天 我在WSL上快乐的用vim编游戏 可就在我输入 q时 bash提醒我 q 未找到命令 平常程序都在WSL上 cat不自动在行尾加换行违反了我的强迫症 然后我就开始修理vim了 然后我又试了 wq等等和q有关的命令 甚至连 q都没问题
  • C#编程,.NTE调用java类、jar包方法

    基本思路 用C 实现调用Java编写的类中的方法 重点是将Java编写的程序打包成Jar 然后使用开源工具IKVM将其转化成DLL控件 在 NET环境下调用 一 使用IKVM NET组件 首先到IKVM官网 http www ikvm ne
  • React学习(JSX+组件+state+表单)

    React JSX 声明元素 渲染元素 组件 练习 this props children PropTypes 默认值 获取真实的DOM节点 this state 表单 组件的生命周期 例子 JSX JSX是一种JavaScript语法的拓