初始react和使用——事件处理、样式处理和组件

news2024/10/5 17:28:40

一、react官网

1、官网下载

官网分别有中英文两种:

中文官网:React 官方中文文档 – 用于构建用户界面的 JavaScript 库

英文官网:https://reactjs.org/

 2、react简介

react是用于构建用户界面的JavaScript库,起源于Facebook的内部项目

由于react的设计思想十分独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用它,认为它可能是将来web开发的主流工具。

react的好处:

  • 声明式设计: React使创建交互式UI变得轻而易举。为你应用的每一个状态
    设计简洁的视图,当数据变动时React能高效更新并渲染合适的组件
  • 组件化:构建管理自身状态的封装组件,然后对其组合以构成夏杂的UI。
  • 高效:React通过对DOM的模拟,最大限度地减少与DOM的交互。
  • 灵活:无论你现在使用什么技术栈,在无需重写现有代码的前提下,通过引React来开发新功能。

注:在学习react之间我们所需要掌握的js知识有:es6语法、this发的指向、面向对象【原型、原型链、class类、继承】、模块化、柯里化函数等一些基础的js

3、需使用的JavaScript库

使用方法:

第一种:使用npm安装库

方法二:直接进行引入链接即可

需要值得注意的是建议是用18版本以前的版本,因为18以后的版本语法有一定变化。 

二、使用react

1、创建对象

创建虚拟DOM对象,并进行渲染。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 根标签 -->
    <div id="app"></div>

<!-- 引入的顺序不能乱 -1-引入react的核心库-->
    <script src="./js/react.development.js"></script>
    <!-- 引用react-dom,用于支持react操作DOM -->
    <script src="./js/react-dom.development.js"></script>
    <!-- 引入babel,用于将jsx语法转换成js语法 -->
    <!-- <script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script> -->
  <!-- <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script> -->
    <script src="./js/babel.min.js"></script>

    <script type="text/babel"> 
        /*
        vue:在html标签面写js
        react:大部分在js中写标签
        */

        // 第一个react
        console.log(ReactDOM);
        // 参数一:标签内容
        const VDOM=<div>
            <h1>HELLO WORLD</h1>
            <h2>HELLO WORLD</h2>
            </div>
        // 参数二:
        // ReactDOM.render(
        //     VDOM,
        //         document.getElementById('app')
            
        // );
        // react中是需要把单标签进行闭合,不然会出现报错
        ReactDOM.render(
            <div>
                {/* 单行注释的写法*/}
                {
                    // 
                }
                <h1>2333</h1>
                <h2>test333</h2>
                <input type="text"/>
                </div>,
                document.getElementById('app')
        );

    </script>




</body>
</html>

(1)jsx语法:全称JavaScript XML。是一种JavaScript的语法扩展,运用于react架构中,其格式比较像是模板语言,但事实上完全是在JavaScript内部实现的  。元素是其构成react应用的最小单位,jsx就是用来声明react当中的元素,react使用jsx来描述用户界面。

(2)插值符号:{}

插值符号内可以写的内容:

1、表达式

2、数组

3、字符串

4、即时函数

5、布尔值

6、三目表达式

(3)js语句和js表达式

表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方

js语句:

 2、样式处理

这里我不知道该如何组织我的语言咯,我就简单的说一下哈,剩下的自己理解哈哈哈~~~原谅我这小学语言水平组织能力

第一种方式:

样式放在head标签中写,和html+css写样式一样的,但不同在于引用样式的时候采用className属性进行引用。

第二种方式:

样式是在script中写以对象的形式,在引用时直接使用style={对象名}

另外一种我觉得差别不大,就和json一样,调用时采用对象.属性名

直接上代码哈哈:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2-样式处理</title>
    <style>
        .con{
            background-color: pink;
        }
    </style>
</head>
<body>
    <div id="app">   </div>
        <script src="./js/react.development.js"></script>
        <script src="./js/react-dom.development.js"></script>
        <script src="./js/babel.min.js"></script>

        <script type="text/babel">
        const title=<h2>我是标签内容</h2>
        const arr=['大胡子','小胡须','佩奇',"浩浩"]

        const person={
            name:'雨哥',
            age:20,
            house:'false',
            car:'false',
            wife:'false'
        }
        // 样式处理:
        const sty={
           backgroundColor:"#f90",
        }
        const style1={
            bgc1:{backgroundColor:"#f90",},
            bgc2:{backgroundColor:"#90f",}
        }
        const element=<div className='con'>
            <h1 className='col'>`hello react`</h1>
            {
 /* <h2 style={background-color:red}>`hello react`</h2>*/
            }
            <h2 style={sty}>`hello react`</h2>
            {/*外面那个{}是插值*/}
            <h2 style={{"background-color":"red"}}>`hello react`</h2>
            <h2 style={style1.bgc2}>hello react22</h2>

            </div>
            ReactDOM.render(element,document.getElementById("app"))
</script>
</body>
</html>

3、事件处理

react元素的事件处理和DOM元素类似,知识在语法上有所不同:

  • react事件绑定属性的命名采用驼峰式写法,而不是小写
  • 如果采用jsx语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法)
  <script type="text/babel">
        // obj.onclick=function(){

        // }
        // function fn(){}
        // function handleClick(a,b,c){
        function handleClick(a){
        // alert(666)
        // alert(a)
        // console.log(a);
        // console.log(b);
        // console.log(c);
        console.log(this);
        /*
            参数的n+1是属于事件对象event
        */
        }
        function handleKeyDown(){
        // console.log(11);
        console.log(this);
        }

        // obj.onclick=function(event){}
// function fn(){}
// obj.addEventListener("click",fn)
        let element=(
            <div>
                {/*react事件处理*/}
                <input 
                type="button" 
                value="点击事件1" 
                onClick={handleClick}/>
                <input 
                type="button" 
                value="点击事件2" 
                onClick={function handleClick(){
                    alert(888)
                }}
                />
                <input 
                type="button" 
                value="点击事件3" 
                onClick={()=>{
                    alert(999)
                }}
                />
                <input 
                type="text" 
               
               onKeyDown={handleKeyDown}
                />
                <input 
                type="button" 
               value="传参"
               onClick={handleClick.bind(null,"参数一","参数二")}
            //    onClick={handleClick.bind(null)}
                />
                {/*babel开启严格模式,函数的指向为undefined*/}
                <input type="button"
                value="this"
                onClick={handleClick.bind(this)}/>
                </div>
        )
        // call,apply,bind()

        ReactDOM.render(element,document.getElementById('app'))
</script>
</body>

三、组件及三大属性

件的核心属性:state、props、prop-types、refs

state:React把组件看成是一个状态机(State Machines) 通过与用户的交互,实现不同状态,然后渲染ul,让用户界面和数据保持一致。React里,只需更新组件的 state,然后根据新的state重新渲染用户界面(不要操作DOM)

props:通过标签属性从组件外向组件内传递变化的数据,每个组件对象都会有props,组件标签的所有属性都保存在props中


prop-types:对props中的属性值进行类型限制和必要性限制

refs:用来绑定到render()输出的任何组件上。
当组件插入到DOM后,ref属性添加—个组件的引用于到this.refs

setState:设定状态

在开始上代码之前我们来简单回顾一下在JavaScript中ES5和ES6的面向对象

1、复习ES5/ES6

 还有一个是关于继承的问题(es6):

2、组件的使用

关于组件的使用有三种写法:

  • 函数式写法
  • 双标签
  • 单标签

组件的使用原理在于把各个代码块单独进行抽出,最终进行挂载;组件又分为有状态和无状态两种。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组件</title>
</head>
<body>
    <!-- <div>
        <ul>
            <li></li>
        </ul>
    </div> -->
    <div id="app"></div>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
    <script type="text/babel">

// 把各个代码块单独进行抽出,最终进行挂载

// 组件:无状态组件
function Sect(){
    return <section>我是内容部分</section>
}

// 组件:有状态组件
class Foot extends React.Component{
    // 构造器
    constructor(){
        super();
    }
// 钩子函数、生命周期:

    // 渲染:
    render(){
      return  <footer>我是底部内容</footer>
    }
}

let element=<div>
        <h1>hello world!</h1>
        <header>我是头部内容</header>
        {/* <section>我是内容部分</section> */}
        {/*<footer>我是底部内容</footer>*/}

        {/*函数式写法*/}
        {/*Sect()*/}

        {/*组件:双标签组件*/}
        {/*<Sect></Sect>*/}

        {/*单标签写法:*/}
        {<Sect/>}
        {/*<Sect/>*/}
        {/*<Sect/>*/}
        {/*<Sect/>*/}
        <Foot/>
        </div>
ReactDOM.render(
        element,
        document.getElementById('app')
)

// console.log(ReactDOM);

    </script>
</body>
</html>

3、如何改变值

如果直接通过赋值的情况下是无法改变的,也就是说无状态是没办法进行值的修改

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组件-改变值</title>
</head>
<body>
    <div id="app"></div>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
    <script type="text/babel">
function Sect(){
    return <section>我是内容部分</section>
}
let str=`回`
let element=<div>
        <h1>hello world!</h1>
        <header>今年{str}家过年吗?</header>
        <Foot/>
        </div>

        // 把回改为不回-无状态是不能该的
        setTimeout(() => {
            str=`不回`
            console.log(str);
        }, 2000);

ReactDOM.render(
        element,
        document.getElementById('app')
)

// console.log(ReactDOM);

    </script>
</body>
</html>

所以需要通过有状态组件来改变值:这里所要使用的属性就是state和setstate两个,因为setstate是用来改变state值的属性。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组件-改变值</title>
</head>
<body>
    <div id="app"></div>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
    <script type="text/babel">

// 组件:有状态组件
class Foot extends React.Component{

    constructor(){
        super();
        // console.log(this);
        // 状态仓库
        this.state={
            data:`不回`,
            data1:"马上要回家过年了!!!"
        }
        setTimeout(() => {
            console.log(666);
            // str='不回' 
            // this.state.data=`不回` //此方法行不通的
            // 改变state的值使用this.setstate
            this.setState({data:`回`})
            
        }, 2000);
    }

    // 渲染:
    render(){
        // 测试能否取到state的值
        console.log(this.state);
    //   return  <footer><b>今年{this.state.data}家过年</b></footer>
    // 测试data1
    return (
        <div>
            <b>今年{this.state.data}家过年</b>
            {this.state.data1}
            </div>
    )
    }
}

let str=`回`
let element=<div>
        <h1>今年{str}家过年吗?</h1>
        <header>hello world!</header>
        <Foot/>
        </div>

        /*
        直接通过重新赋值的情况下,无法改变
        */
        // 把回改为不回-无状态是不能该的
        
ReactDOM.render(
        element,
        document.getElementById('app')
)

// 改值方法如同下面一样
// let json={
//     data:"123"
// }
// json.data="456"
// console.log(ReactDOM);

    </script>
</body>
</html>

简写:

 这里的这个代码不用在意,是我整着玩的,跟前面那个简写差不多!!!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组件-改变值</title>
</head>
<body>
    <div id="app"></div>
    <script src="./js/react.development.js"></script>
    <script src="./js/react-dom.development.js"></script>
    <script src="./js/babel.min.js"></script>
    <script type="text/babel">
const sty={
    backgroundColor:"pink",
    // 两种形式:不加引号不写单位,或者加引号加单位

    width:"500px",
    height:200,
}

class Foot extends React.Component{
    constructor(){
        super();
        // console.log(this.handleChange());
    }

    state={
           str:"有",
           str1:false

    }
    // 如何改变原型中this的指向问题:
    // 1.通过绑定bind改变,点击事件中

handleChange(){
    //用bind改变this的指向,使handlechange的this指向foot 
    console.log("handlechange");
    // 看一下这里的this指向谁--undefined
    //在jsx语法中,由于babel开启严格模式,函数的this指向undefined;
    // console.log(this,`111`);
    let {str1}=this.state
    // this.setState({str:"没有",str1:true})
    this.setState({str1:!str1})

}
    // 渲染:
    render(){
// onClick={handleChange}
        // console.log(this.handleChange());
        return (
        <div style={sty}>
            <h1 
            onClick={this.handleChange.bind(this)}
            style={{backgroundColor:"#46B400"}} >你现在有没有女朋友? {this.state.str}</h1>
            <b
            style={{backgroundColor:"#46B406"}}
            onClick={this.handleChange.bind(this)}>
            你现在有没有女朋友? {this.state.str1?"true":"false"}</b>

            </div>
    )
    }
}
        
ReactDOM.render(
       <Foot/>,
        document.getElementById('app')
)



    </script>
</body>
</html>

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

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

相关文章

Python入门自学进阶-Web框架——40、redis、rabbitmq、git——3

git&#xff0c;一个分布式的版本管理工具。主要用处&#xff1a;版本管理、协作开发。 常见版本管理工具&#xff1a; VSS —— Visual Source Safe CVS —— Concurrent Versions System SVN —— CollabNet Subversion GIT GIT安装&#xff1a;下载安装文件&#xff1a;…

Nexus仓库介绍以及maven deploy配置

一 、Nexus仓库介绍 首先介绍一下Nexus的四个仓库的结构&#xff1a; maven-central 代理仓库&#xff0c;代理了maven的中央仓库&#xff1a;https://repo1.maven.org/maven2/&#xff1b; maven-public 仓库组&#xff0c;另外三个仓库都归属于这个组&#xff0c;所以我们的…

Oracle21C--Windows卸载与安装

卸载方法&#xff1a; &#xff08;1&#xff09;WinR&#xff0c;输入services.msc,打开服务&#xff0c;把Oracle相关的服务全部停止运行&#xff08;重要&#xff09; &#xff08;2&#xff09;WinR&#xff0c;输入regedit&#xff0c;打开注册表&#xff0c;删除Oracle开…

国产芯片设备达到3纳米,还打入台积电,美日荷被彻底赶出市场

由于众所周知的原因&#xff0c;荷兰和日本的光刻机对中国供应面临限制&#xff0c;其他芯片设备和材料也受到很大的限制&#xff0c;这促使国产芯片产业链积极完善&#xff0c;以实现纯国产芯片工艺&#xff0c;虽然在光刻机方面还稍微落后&#xff0c;不过有一项国产芯片设备…

Maven入门教程(三):Maven语法

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 6.Mav…

2023年高教社杯数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…

Qt按钮按动、划过背景设置

title: Qt按钮按动、划过背景设置 date: 2023-08-30 19:29:49 tags: Qt按钮按钮背景设置按钮动态效果 categories:Qt学习之路 给按钮添加背景后&#xff0c;原先按钮的按动效果就没了&#xff0c;&#xff08;按钮没有反馈&#xff0c;我的手就会一直在抖&#xff0c;哈哈哈哈…

最新社区团购电商小程序源码 无bug完美运营版+详细搭建部署教程

分享一个开源社区团购电商小程序源码&#xff0c;无bug完美运营版&#xff0c;含完整前后端详细搭建部署教程。 系统运营模式&#xff1a;整合线下社区资源&#xff0c;由各快递代收点、社区便利店、社区物业、业主等发起的社区微信群&#xff0c;推送商品信息&#xff0c;消费…

leetcode原题: 最小值、最大数字

题目1&#xff1a;最小值 给定两个整数数组a和b&#xff0c;计算具有最小差绝对值的一对数值&#xff08;每个数组中取一个值&#xff09;&#xff0c;并返回该对数值的差 示例&#xff1a; 输入&#xff1a;{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8} 输出&#xff1a;3&…

运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 一&#xff1a; $(cd $(dirname $0); pwd) 命令详解 path $(cd $(dirname $0); pwd)解析&#xff1a; 1、取当前运行脚本的所在路径&#xf…

【AI模型】LibTorch深度学习框架配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍LibTorch深度学习框架配置与使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

Jmeter性能压测 —— 高并发思路

测试场景&#xff1a;模拟双11&#xff0c;百万级的订单量一个物流信息的查询接口。 条件&#xff1a;接口响应时间<150ms以内。10万并发量每秒。 设计性能测试方案 1、生产环境 ①10W/S--并发量&#xff08;架构师/技术负责人提供&#xff09; ②20台机器&#xff08;…

java八股文面试[多线程]——ThreadLocal底层原理和使用场景

源码分析&#xff1a; ThreadLocal中定义了ThreadLocalMap静态内部类&#xff0c;该内部类中又定义了Entry内部类。 ThreadLocalMap定了 Entry数组。 Set方法&#xff1a; Get方法&#xff1a; Thread中定义了两个ThreaLocalMap成员变量&#xff1a; Spring使用ThreadLocal解…

STP生成树

文章目录 一、二层环路带来的问题二、生成树定义三、STP相关概念BPDU&#xff08;Bridge Protocol Data Unit&#xff09;定义分类用来选举的参数 四、STP的选举机制五、STP初始化流程交换机端口状态 六、STP计时器七、STP拓扑变更机制八、STP的问题九、RSTP&#xff08;Rapid …

200 Smart 与 PLC 4000 PN/PN Coupler通讯

1、打开200 smart 菜单栏选择工具&#xff0c;profinet网络&#xff0c;添加控制器 2、200 Smart PN /PN Coupler 做为控制器组态IO均配置128个BYTE. 3、S7400 在硬件配置里组态 PN/PN Coupler通讯 并添加报文长度为128BYTE 4、通过程序将200 msart中的IO点写到DB数据块内

c++11 标准模板(STL)(std::basic_stringstream)(一)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_stringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::alloc…

机器学习基础17-基于波士顿房价(Boston House Price)数据集训练模型的整个过程讲解

机器学习是一项经验技能&#xff0c;实践是掌握机器学习、提高利用机器学习 解决问题的能力的有效方法之一。那么如何通过机器学习来解决问题呢&#xff1f; 本节将通过一个实例来一步一步地介绍一个回归问题。 本章主要介绍以下内容&#xff1a; 如何端到端地完成一个回归问题…

Ansible学习笔记8

group模块&#xff1a; 创建一个group组&#xff1a; [rootlocalhost ~]# ansible group1 -m group -a "nameaaa gid5000" 192.168.17.105 | CHANGED > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}…

【Tkinter系列05/15】小部件(框架标签和列表)

续接上文&#xff1a;【Tkinter系列04/15】界面小部件&#xff08;选择钮、行编辑器&#xff09; 11. 小部件Frame 框架基本上只是其他小部件的容器。 应用程序的根窗口基本上是一个框架。 每个框架都有自己的网格布局&#xff0c;因此每个框架中小部件的网格化 框架独立工作…

ARP欺骗(大白话)

前提条件&#xff1a; 有三台主机&#xff0c;PC1&#xff0c;PC2&#xff0c;PC3&#xff0c;现要实现PC1与PC2的关联&#xff08;如图&#xff09; 不存在ARP欺骗时 步骤&#xff1a; 首先查看arp表&#xff08;有ip和mac的关系&#xff09; 如果表中有PC2的信息&#xf…