react学习

简介

  • 起源于Facebook
  • 与传统mvc的关系:轻量级的视图层库,将视图抽象成组件

特点

  • 声明式设计
  • 高效  通过虚拟dom,减少真实dom交互
  • 灵活  适配已知的库或框架
  • jsx     js语法扩展
  • 组件  代码可复用
  • 单向响应数据流  减少重复代码,比传统绑定简单

虚拟dom

  • 真实dom操作消耗性能,react把真实dom转化为js对象树(就是个对象)

ps:真实的dom属性太多了,而且频繁的操作视图重绘回流,而且进行了diff算法之后,将部分真正要改变的dom重绘,避免了大幅度修改。我们的目的是更快!更快!

安装

npx不能用的话,升级nodejs版本

npx create-react-app my-app
 npm start //启动项目npm test //测试npm run build //打包上线

目录

  • README.md            项目说明文档
  • node_modules          所有的依赖安装的目录
  • package-lock.json     锁定安装时的包的版本号,保证团队的依赖能保证一致。
  • package.json             配置文件
  • public                         静态公共目录
  • src                              开发用的源代码目录
//src-index.js
//创建小demoimport React from "react"; //jsx 17版本之后默认引入,可不写
import ReactDom from "react-dom";//react渲染到页面//render方法 将组件渲染指定节点
//参1:用jsx语法写的html
//参2:指定节点
ReactDom.render(<div>1111
</div>, document.getElementById('root'))

然后就报错啦!!!

因为我安装的是18.2.0版本,已经不支持 react-dom

 警告:ReactDOM。渲染在React 18中不再被支持。请使用createRoot。在你切换到新的API之前,你的应用程序会像运行React 17一样运行。

然后就去官网尝试新的写法

import { createRoot } from "react-dom/client";// 清除现有的 HTML 内容
document.body.innerHTML = '<div id="app"></div>';// 渲染你的 React 组件
const root = createRoot(document.getElementById("app"));
root.render(<h1>Hello, world</h1>);

页面就成功出现想要内容啦

jsx

所谓的JSX其实就是Javacript 对象,所以使用 React 和JSX的时候一定要经过编译的过程:
JSX一使用react构造组件,bable进行编译->JavaScript对象 - ReactDom.render中->DOM元素一>插入页面

//将jsx语法转化为react对象
ReactDom.render(React.createElement("div",{id:"aaa",class:"bbb",
},"111111111"),document.getElementById("root"))

组件

React 组件必须以大写字母开头

函数组件

function FunComponent() {return (<div><h1>Welcome to my app</h1></div>);
}
export default FunComponent;

class类组件 

  • this为undefined (babel翻译时自动开启了严格模式组件

//新建js文件
import React from "react";
class App extends React.Component {render() {return <div className="">hello,react</div>;}
}
export default App;
  • this为实例对象
  • render在类的原型对象上,实例使用

引入在index.js,进行渲染 

import { createRoot } from "react-dom/client";
import App from './01-base/01-class类组件'
document.body.innerHTML = '<div id="app"></div>';
const root = createRoot(document.getElementById("app"));
root.render(<App/>);

执行root.render(<组件/>)之后发生了什么呢?

  1. react解析该组件标签,找到该组件
  2. 发现组件时类创建,new该实例,调用实例上的render方法
  3. 将render返回的虚拟dom转为真实dom渲染在页面上

组件实例三大属性 

三大属性一般用在有实例的类组件身上,由于函数可以接受参数,函数组件可以通过传参的方式接受props

state

存储数据,数据改变,页面随着数据改变。

import React from "react";
class App extends React.Component {constructor(props) {super(props);//初始化状态this.state = {isHot: false,wind: "大风",};//解决函数this问题this.changeWeather=this.changeWeather.bind(this)}//调用的时候通过原型链查找changeWeather() {// const { isHot } = this.state;console.log(this);//局部函数开启了严格模式 undefined}render() {const { isHot } = this.state;return (<div className="">今天的天气是<button onClick={this.changeWeather}>{isHot ? "炎热" : "凉爽"}</button></div>);}
}export default App;

简写

import React from "react";
class App extends React.Component {state = {isHot: false,wind: "大风",};//直接使用父层的thischangeWeather = () => {const { isHot } = this.state;this.setState({ isHot: !isHot });};render() {const { isHot } = this.state;return (<div className="">今天的天气是<button onClick={this.changeWeather}>{isHot ? "炎热" : "凉爽"}</button></div>);}
}export default App;

props

  • 只读
//父组件传值
root.render(<App data="2023-5-17" data1="2023-5-18"/>);
//简写
//const p = { data: "2023-5-17", data1: "2023-5-18" };
//root.render(<App {...p} />);//子组件接收
render() {const { data,data1 } = this.props;return (<div className="">今天 {data} 明天 {data1}</div>);}

限定props

//父组件
function speak() {console.log("你好呀");
}
const p = { data: "2023-5-17", data1: "2023-5-18", sun: true };
root.render(<App {...p} speak={speak} />);//子组件
import PropTypes from "prop-types";
//限定标签类型,必要性static propTypes = {data: PropTypes.string.isRequired, //isRequired 必传data1: PropTypes.string,speak: PropTypes.func, //函数类型sun: PropTypes.bool, //布尔类型};//标签属性的默认值static defaultProps = {data1: "明天就是明天啊",};

函数组件

import PropTypes from "prop-types";function FunComponent(props) {const { name, sex, age } = props;return (<div><h1>Welcome to my app</h1><p>name: {name}</p><p>sex: {sex ? "女" : "男"}</p><p>age: {age}</p></div>);
}//限定标签类型,必要性
FunComponent.propTypes = {name: PropTypes.string.isRequired, //isRequired 必传sex: PropTypes.bool,age: PropTypes.number,
};
//标签属性的默认值
FunComponent.defaultProps = {name: "明天就是明天啊",
};
export default FunComponent;

refs

字符串形式

获取到的是真实dom元素(虚拟dom转化成真实dom的节点)

//使用refs
<button onClick={this.changeWeather} ref="but">{isHot ? "炎热" : "凉爽"}</button>//获取refschangeWeather = () => {const { but } = this.refs;console.dir(but.innerText);};

官网不建议使用字符串形式,可能会影响性能

回调形式(箭头函数)

//箭头函数this指向父元素,指向类的实例  
<div className="" ref={(e) => (this.weather = e)}> //内联函数今天的温度是<div />changeWeather = () => {console.log(this.weather);};

ref回调函数是以内联函数方式定义的,在更新过程中执行两次,第一次传入参数null,第二次传入参数dom元素,因为每次渲染会创建一个新的函数实例,react清空旧的ref并创建新的。通过ref回调函数定义成class绑定函数避免这种问题

//绑定函数 
<div className="" ref={this.saveElement}>今天的温度是<div />
//绑定节点
saveElement=(e)=>{this.input1=e}
//使用节点
console.log(this.input1);

createRef

//本身是个函数,调用后返回一个容器,该容器可以访问存储器ref标识的节点 
myRef=React.createRef()//绑定ref
<div className="" ref={this.myRef}>今天的温度是
<div/>
//使用
console.log(this.myRef.current);

事件处理

  1. 通过onXxx属性指定事件处理(注意大小写)
    1. React使用的是自定义(合成)事件,而不是使用的原生DOM事件
    2. React中的事件是通过事件委托方式处理的(委托给组件最外层的元素),元素会冒泡到父元素身上,用父元素监听多个子元素更加高效
  2. 通过event.target得到发生事件的DOM元素对象
    <button onClick={this.changeWeather} ref="but">按钮</button>changeWeather = (e) => {console.log(e);
    }

受控组件&非受控组件 

非受控组件 

页面中所有输入类的dom,现用现取。 <input/>

现用现取:比如说点击事件之后,通过回调函数我获取e.属性,获取的是最新的值

class Login extends React.Component {loginFromSubmit = (e) => {//表单提交跳到新地址,或者刷新页面e.preventDefault();const { username, password } = this;console.log(username, password);};render() {return (<form action="" onSubmit={this.loginFromSubmit}>username:<input type="text" name="username" ref={(r) => (this.username = r)} /><br />password:<inputtype="password"name="password"ref={(r) => (this.password = r)}/><br /><button>login</button></form>);}
}

受控组件 

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

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

相关文章

【C++】vector的使用

目录 1.什么是vector2.容量操作3.增删查改4.杨辉三角&#xff08;使用vector开辟二维数组&#xff09; 1.什么是vector vector就是一个动态顺序表&#xff0c;比起string&#xff0c;它不仅可以存储字符&#xff0c;还可以存储其他的内置类型以及自定义类型。 vector在使用时&…

Maven jar 包下载失败问题处理【配置Maven国内源】

前言 很多同学在Maven里下载一些依赖的时候&#xff0c;即下载【jar 包】的时候总是会出现一些问题&#xff0c;这里专门做一个教程讲解一下 其实这和你的Maven配置是有关系的&#xff0c;因为Maven是一个国际站点&#xff0c;它的仓库是在国外的&#xff0c;所以我们有时候在下…

易语言零基础新手入门系列教程 第一课

机器人小鑫易语言源码&#xff08;作业用&#xff09;&#xff1a; 机器人小鑫源码 - 第一课.zip 视频教程文字版&#xff1a; 新手学习易语言的几点建议 1、由浅入深、由易到难、循序渐进&#xff0c;切勿急功近利&#xff0c;想一步登天&#xff01; 这是学习的一般规…

是否想过中文编程呢?易语言使用的体验和感想

对于很多自以为英语不好就不能学好编程的童鞋来说&#xff0c;其实编程和英语真的不是那么的紧密&#xff0c;易语言可能是一种不错的选择。这里我们来体验一下&#xff0c;和其他语言做一下对比。 一、变量的声明 易语言中用ctrll和ctrlG来声明局部和全局变量&#xff0c;代码…

这次,易语言彻底“输了”,而另一新式中文编程却胜券在握

20多年来&#xff0c;饱受诟病的易语言 众多编程语言中&#xff0c;python、C、C语言、Java等&#xff0c;脱颖而出。但有一门冷门的编程语言&#xff0c; 大多数人可能听都没听过&#xff0c;它就是易语言。 什么是易语言啊&#xff1f;听起来好陌生。 笔者“深扒”了一下&…

易语言脚本开发入门教程

天蓝易语言脚本入门开发系列教程第1讲初识易语言 天蓝易语言脚本入门开发系列教程第2课简单控件变量 天蓝易语言脚本入门开发系列教程第3讲简单登录器制作 天蓝易语言脚本入门开发系列教程第4讲计算器实现 天蓝易语言脚本入门开发系列教程第5讲时钟随机数 天蓝易语言脚本入门开…

易语言学习笔记——基础篇

易语言学习笔记20180710 一、 易语言的数据类型可以分为基本数据类型和特殊数据类型 1. 其中基本数据类型分为&#xff1a; ① 数值型 ② 逻辑型 ③ 日期时间型 ④ 文本型 ⑤ 字节集型 ⑥ 子程序指针型 2. 然后基本数据类型中的数值类型有包含了&a…

易语言简介

易语言&#xff08;EPL&#xff09;是一门以中文作为程序代码编程语言&#xff0c;其以“易”著称&#xff0c;创始人为吴涛。易语言早期版本的名字为E语言。其最早的版本的发布可追溯至2000年9月11日。创造易语言的初衷是进行用中文来编写程序的实践&#xff0c;方便中国人以中…

“易语言.飞扬”十分钟入门教程

“易语言.飞扬”十分钟入门教程 作者&#xff1a;liigo 2007.1.1 原文链接&#xff1a;http://blog.csdn.net/liigo/archive/2007/01/01/1472077.aspx 转载必须注明出处&#xff1a;http://blog.csdn.net/liigo 第 1 分钟&#xff1a;序曲 第 2 分钟&#xff1a;“易语言.飞…

《MYSQL必知必会》读书笔记1

目录 行 主键 MYSQL工具 使用MYSQL 连接 检索数据 检索&#xff08;SELECT&#xff09; 限制结果&#xff08;LIMIT&#xff09; 排序检索&#xff08;ORDER BY&#xff09; 过滤数据&#xff08;WHERE&#xff09; 过滤数据&#xff08;AND、OR&#xff09; 通配符…

【SpringCloud】SpringAMQP

文章目录 1、AMQP2、基本消息模型队列3、WorkQueue模型4、发布订阅模型5、发布订阅-Fanout Exchange6、发布订阅-DirectExchange7、发布订阅-TopicExchange 1、AMQP Advanced Message Queuing Protocol&#xff0c;高级消息队列协议。是用于在应用程序之间传递业务消息的开放标…

黑马Redis视频教程实战篇(一)

目录 一、短信登录 1.1、导入黑马点评项目 &#xff08;1&#xff09;导入黑马点评sql脚本 &#xff08;2&#xff09;导入后端项目 &#xff08;3&#xff09;导入前端项目 1.2、基于Session实现登录流程 1.3 、实现发送短信验证码功能 1.4 、实现登录拦截功能 1.5 、隐…

创建第一个.NET MAUI应用

1.打开VS2022,创建新项目,并选择.NET MAUI应用,然后点击下一步 2.输入项目相关配置,然后点击下一步 3. 选择框架版本,然后点击创建 4.项目创建成功后会自动打开概述页 5.平台框架切换 6.启动应用,如有下图提示,启动开发者模式 成功启动应用 7.修改应用 修改MainPage.xml如下图…

阿里直播平台面临的技术挑战

大流量、高并发场景下&#xff0c;大型直播的技术挑战一般体现在如下几个方面&#xff1a; 视频流的处理、分发 播放质量保障 视频可用性监控 超大直播间实时弹幕及聊天互动 高性能消息通道 内容控制&#xff0c;如算法鉴黄、文本过滤 系统可用性、稳定性保障 本文将针对其中的…

龙珠直播php,斗鱼、全民TV、龙珠等直播平台排行榜 看视频直播发展趋势

从2015年下半年起&#xff0c;视频直播市场便显露出了火爆之势。除了越来越多的人喜欢观看、愿意参与直播之外&#xff0c;直播类 App也如雨后春笋般不断涌出。 而2016年&#xff0c;视频直播领域更是出现了火爆场面&#xff0c;尤其是刚刚过去的一个月&#xff1a;先是卷土重来…

短视频和直播,哪个会火得更久呢

短视频和直播&#xff0c;哪个会火得更久呢 曾经&#xff0c;电视剧和综艺节目是人们在工作之余放松的主要方式&#xff0c;目前越来越多的电视剧和网剧依靠着当红明星、大 IP 能够在前期获得大量的热度&#xff0c;但在播出之后收视率往往不理想。随着时间的增长&#xff0c;…

怎么创建直播平台

现在直播应用非常火爆&#xff0c;它以生动直观的方式向用户传达最真实的现场信息&#xff0c;受到广大用户的普遍欢迎。小编作为一名技术人员&#xff0c;经常开发各种直播平台&#xff0c;&#xff08;娱乐直播、游戏直播、教育直播、财经直播等&#xff09;下面我把自己积累…

关于linux的ssh(出现的问题以及ubuntu的ssh配置和ssh连接超时问题)

目录 Ubuntu进行ssh连接 关于ssh报错排错 备注&#xff1a;防火墙和selinux可能对ssh连接存在限制&#xff0c;但是我在操作的时候并没对我照成影响 查看selinux状态 ssh_config和sshd_config的区别 Ubuntu进行ssh连接 1.首先需要安装SSH服务器&#xff0c;在ubuntu终端输…

matlab机器人画圆轨迹规划

在这里插入图片描述 function Untitled()clear;clc; L(1)Link([0 0.15055 0 pi/2]); L(2)Link([0 -0.115 0.246 0]); L(3)Link([0 0.1163 0.190 0]); L(4)Link([0 -0.1175 0 pi/2]); L(5)Link([0 0.1175 0 -pi/2]); L(6)Link([0 0.105 0 0]);ZU3SerialLink(L,name,JAKA Z…

Ps制造图标

&#xff08;作者&#xff1a;翟正兴&#xff0c;撰写时间&#xff1a;2019年6月17日&#xff09; 首先我们打开ps新建一个文档 &#xff0c;然后在文档里面用椭圆工具画一个圆出来&#xff0c;画圆的时候把填充禁掉&#xff0c;把描边大小调成30像素首先我们打开ps新建一个文档…