React:一、初识react

1 前言

1.1 官网

(1)英文官网:https://reactjs.org/
(2)中文官网:https://react.docschina.org/

1.2 介绍

(1)动态构建用户界面的javaScript库
(2)FaceBook开源

1.3 特点

(1)声明式编程
(2)组件化编码
(3)React Native编写原生应用
(4)高效(优秀的Diffing算法)

1.4 React高效原因

(1)使用虚拟(virtual)DOM,不总是直接操作页面真实DOM。
(2)DOM Diffing算法,最小化页面重绘。

新建文件夹,使用vscode打开该文件夹,快捷键ctrl+` (Tab键上方)打开terminal终端,输入命令:

1.5 相关js库

(1)react.js:React核心库
(2)react-dom.js:提供操作DOM的react扩展库
(3)babel.js:解析JSX语法代码,转为JS代码的库

npm i react react-dom


两个包安装成功:

目录结构如下:

2 使用

非脚手架搭建react:

文件结构:

2.1 引入react、react-dom、babel-min这几个js文件

因为是开发环境,所以全部引入development.js即可(注意引入顺序:先引入react,再引入react-dom):

<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>

文件整体目录如下:

注意:
js中,混合写入类似于HTML的语法,叫做jsx语法。因为react会使用到jsx语法,故而还需下载babel-standalone(babel除了在使用import时,具有将ES6转换成ES5的作用,还有将jsx转换成js的作用):


注意引入的顺序:1 react;2 react-dom;3 babel-min ,(核心库react必须在react-dom库之前)修改如下:

<!-- 1. 引入js文件 -->
<!-- 引入react核心库 -->
<script src="../node_modules/react/umd/react.development.js"></script>
<!-- 引入react-dom,用于支持react操作dom -->
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<!-- 引入babel,用于将jsx转换为js -->
<script src="../node_modules/babel-standalone/babel.min.js"></script>

2.2 创建react元素

<script  type="text/babel">  //此处type一定要写babel//创建虚拟domconst title = React.createElement('h1',null,'Hello React')const a=<h1>你好~</h1>   //jsx语法,标签不要加双引号,因为不是字符串//渲染虚拟dom到页面// ReactDOM.render(虚拟DOM,容器)ReactDOM.render(a,document.getElementById("root"))ReactDOM.render(title,document.getElementById("myfreind"))
</script>

2.3 渲染React元素到页面中

<!-- 2 手动创建页面待展示的元素,vscode快捷键:#root+enter -->
<!-- 创建"容器" -->
<div id="root"></div>
<div id="myfreind"></div>

2.4 index.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>Document</title><!-- 1. 引入js文件 --><!-- 引入react核心库 --><script src="../node_modules/react/umd/react.development.js"></script><!-- 引入react-dom,用于支持react操作dom --><script src="../node_modules/react-dom/umd/react-dom.development.js"></script><!-- 引入babel,用于将jsx转换为js --><script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body><!-- 2 手动创建页面待展示的元素,vscode快捷键:#root+enter --><!-- 创建"容器" --><div id="root"></div> <div id="myfreind"></div><!-- 3 创建react元素参数一:元素名称;参数二:元素属性;参数三:元素的子节点--><!-- 4 渲染react元素参数一:要渲染的react元素;参数二:挂载点--><script  type="text/babel">  //此处type一定要写babel//创建虚拟domconst title = React.createElement('h1',null,'Hello React')const a=<h1>你好~</h1>   //jsx语法,标签不要加双引号,因为不是字符串//渲染虚拟dom到页面// ReactDOM.render(虚拟DOM,容器)ReactDOM.render(a,document.getElementById("root"))ReactDOM.render(title,document.getElementById("myfreind"))</script></body>
</html>

2.5 浏览器中效果如下


3 虚拟DOM的两种创建方式

(1)定义常量标签(无单双引号的)

修改如上的方式(针对a常量标签修改),body:

<div id="root"></div>
<div id="myfreind"></div><script  type="text/babel">  //此处type一定要写babel//创建虚拟domconst title = React.createElement('h1',null,'Hello React')const a=<h1 id="nihao">你好~</h1>   //jsx语法,标签不要加双引号//渲染虚拟dom到页面ReactDOM.render(a,document.getElementById("root"))ReactDOM.render(title,document.getElementById("myfreind"))
</script>

效果一致:

(2)React.createElement(标签名,标签属性,标签内容)创建虚拟DOM

对于标签属性,是一个js对象(形如java的map),可以有id、className等属性。body:

<div id="root"></div>
<div id="myfreind"></div><script  type="text/babel">  //此处type一定要写babel//创建虚拟domconst title = React.createElement("h1",{id:"test",className:"text_line"},"我是大侠")//渲染虚拟dom到页面ReactDOM.render(title,document.getElementById("myfreind"))
</script>


但是注意,有些情况下,第一种方式更优:比如希望在h1标签中,嵌入< span id=“mm”>Hello</ span>标签,两种方式分别如下操作,body:

<div id="method1"></div>
<div id="method2"></div>
<script  type="text/babel">  //此处type一定要写babelconst m1=<h1><span id="mm">Hello</span></h1>const m2=React.createElement("h1",{},'<span id="mm">Hello</span>')ReactDOM.render(m1,document.getElementById("method1"))ReactDOM.render(m2,document.getElementById("method2"))
</script>


很明显如上方式是把< span id=“mm”>Hello</ span>作为了标签的内容,而不是一个虚拟DOM。
应该修改为如下方式:

<div id="method1"></div>
<div id="method2"></div>
<script  type="text/babel">  //此处type一定要写babelconst m1=<h1><span id="mm">Hello</span></h1>const m2=React.createElement("h1",{},React.createElement("span",{id:"mm"},"Hello"))ReactDOM.render(m1,document.getElementById("method1"))ReactDOM.render(m2,document.getElementById("method2"))
</script>


由此可见,这种情况下,多层嵌套的React.createElement并不适用复杂场景。jsx写法(第一种)更加便捷高效,不建议React.createElement中嵌套React.createElement。

小结:
1.为什么react要使用jsx?

减少创建虚拟DOM的繁琐操作,可以如同编写html那样渲染到页面上

比如下面的jsx写法,实际上babel最终会把下面的语句,翻译为React.createElement中嵌套React.createElement这种形式的,其实jsx这种写法,就是原始js创建虚拟DOM的语法糖(语法糖:类似python的装饰器语法糖等,就是一种语法的缩写、简写方式):

//创建xuniDOM
const m3=(<h1><span id="mm">Hello</span></h1>
)

2.关于虚拟DOM:

本质上是Object类型的对象(一般对象);

虚拟DOM比较轻,真实DOM较重,因虚拟DOM为React内部使用,无需真实DOM那么多属性;

虚拟DOM最终会被React转化为真实DOM呈现在页面上。

4 jsx语法规则

(1)全称: javascriptXML
(2)react定义的一种类似于XML的JS扩展语法:JS+XML
(3)本质是 React.craeteElement(components,props,…children)
(4)作用:简化虚拟DOM创建
写法: var a = < h1>hello</ h1>
注意1:它不是字符串,也不是HTML/XML标签
注意2:产生的是一个JS对象
(5)标签名任意: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>jsx语法</title><!-- 1. 引入js文件 --><!-- 引入react核心库 --><script src="../node_modules/react/umd/react.development.js"></script><!-- 引入react-dom,用于支持react操作dom --><script src="../node_modules/react-dom/umd/react-dom.development.js"></script><!-- 引入babel,用于将jsx转换为js --><script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body><div id="test"></div><script type="text/babel">const xiaoxuId = "xiaoxu"const data = "hello,jsx语法"const VDOM = (<h2 id = {xiaoxuId.toLowerCase()}><span>{data.toLowerCase()}</span></h2>)ReactDOM.render(VDOM,document.getElementById('test'))</script>
</body>
</html>



tips:debug方式:

<body><div id="test"></div><script type="text/babel">const xiaoxuId = "xiaoxu"const data = "hello,jsx语法"const VDOM = (<h2 id = {xiaoxuId.toLowerCase()}><span>{data.toLowerCase()}</span></h2>)ReactDOM.render(VDOM,document.getElementById('test'))debugger;</script>
</body>


样式填充:
以前的方式:

<!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>jsx语法</title><!-- 1. 引入js文件 --><!-- 引入react核心库 --><script src="../node_modules/react/umd/react.development.js"></script><!-- 引入react-dom,用于支持react操作dom --><script src="../node_modules/react-dom/umd/react-dom.development.js"></script><!-- 引入babel,用于将jsx转换为js --><script src="../node_modules/babel-standalone/babel.min.js"></script><style>.title{background-color: aquamarine;width: 200px;}</style>
</head>
<body><div id="test"></div><script type="text/babel">const xiaoxuId = "xiaoxu"const data = "Hello,jsx语法"const VDOM = (<h2 id = {xiaoxuId.toLowerCase()} class = "title"><span>{data.toLowerCase()}</span></h2>)ReactDOM.render(VDOM,document.getElementById('test'))</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>jsx语法</title><!-- 1. 引入js文件 --><!-- 引入react核心库 --><script src="../node_modules/react/umd/react.development.js"></script><!-- 引入react-dom,用于支持react操作dom --><script src="../node_modules/react-dom/umd/react-dom.development.js"></script><!-- 引入babel,用于将jsx转换为js --><script src="../node_modules/babel-standalone/babel.min.js"></script><style>.title{background-color: aquamarine;width: 200px;}</style>
</head>
<body><div id="test"></div><script type="text/babel">const xiaoxuId = "xiaoxu"const data = "Hello,jsx语法"const VDOM = (<h2 id = {xiaoxuId.toLowerCase()} className = "title"style = {{color:'green',fontSize:"20px"}}><span>{data.toLowerCase()}</span></h2>)ReactDOM.render(VDOM,document.getElementById('test'))/* jsx语法规则:1.定义虚拟DOM时,不要写引号。2.标签中混入JS表达式时要用{}。3.样式的类名指定不要用class,要用className。4.内联样式:style = {{key:value}}*/</script>
</body>
</html>


虚拟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>jsx语法</title><!-- 1. 引入js文件 --><!-- 引入react核心库 --><script src="../node_modules/react/umd/react.development.js"></script><!-- 引入react-dom,用于支持react操作dom --><script src="../node_modules/react-dom/umd/react-dom.development.js"></script><!-- 引入babel,用于将jsx转换为js --><script src="../node_modules/babel-standalone/babel.min.js"></script><style>.title{background-color: aquamarine;width: 200px;}</style>
</head>
<body><div id="test"></div><script type="text/babel">const xiaoxuId = "xiaoxu"const data = "Hello,jsx语法"const VDOM = (<div><h2 id = {xiaoxuId.toLowerCase()} className = "title"style = {{color:'green',fontSize:"20px"}}><span>{data.toLowerCase()}</span></h2><input type = "text"/></div>)ReactDOM.render(VDOM,document.getElementById('test'))/* jsx语法规则:1.定义虚拟DOM时,不要写引号。2.标签中混入JS表达式时要用{}。3.样式的类名指定不要用class,要用className。4.内联样式:style = {{key:value}}5.只要一个根标签6.标签必须闭合*/</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>jsx语法</title><!-- 1. 引入js文件 --><!-- 引入react核心库 --><script src="../node_modules/react/umd/react.development.js"></script><!-- 引入react-dom,用于支持react操作dom --><script src="../node_modules/react-dom/umd/react-dom.development.js"></script><!-- 引入babel,用于将jsx转换为js --><script src="../node_modules/babel-standalone/babel.min.js"></script><style>.title{background-color: aquamarine;width: 200px;}</style>
</head>
<body><div id="test"></div><script type="text/babel">const xiaoxuId = "xiaoxu"const data = "Hello,jsx语法"const VDOM = (<div><h2 id = {xiaoxuId.toLowerCase()} className = "title"style = {{color:'green',fontSize:"20px"}}><span>{data.toLowerCase()}</span></h2><input type = "text"/><Fruit>123</Fruit></div>)ReactDOM.render(VDOM,document.getElementById('test'))/* jsx语法规则:1.定义虚拟DOM时,不要写引号。2.标签中混入JS表达式时要用{}。3.样式的类名指定不要用class,要用className。4.内联样式:style = {{key:value}}5.只要一个根标签6.标签必须闭合7.标签首字母:(1)若为小写字母开头,则将标签转为html中同名元素,若html中没有该标签对应的同名元素,则报错。(2)若大写字母开头,react渲染对应的组件,若组件没有定义,则报错。*/</script>
</body>
</html>


注意区分js表达式和代码块,在jsx中,{}里只能存在表达式,而非代码块,常见的js表达式、代码块有如下:

1.表达式
(1)a
(2)a+b
(3)demo(24)
(4)arr.map()
(5)function test(){}

2.语句(代码)
(1)if(){}
(2)for(){}
(3)switch(value){case 1:…;case 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>Document</title><script src="../node_modules/react/umd/react.development.js"></script><script src = "../node_modules/react-dom/umd/react-dom.development.js"></script><script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body><div id = "test"></div><script type = "text/babel">const data = ["java","python","react","vue"]const vDOM = (<div>        <ul>{data.map((item,index)=>{return <li key = {index}>{item}</li>})} </ul></div>)        ReactDOM.render(vDOM,document.getElementById("test"))</script>
</body>
</html>

效果如下:

React:一、初识react相关推荐

  1. 初识react(四) react中异步解决方案之 redux-saga

    回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱 初识react(二) 实现一个简版的html redux.js的demo 初识react(三)在 react中使用redux来实现简版计数器 ...

  2. 初识react(二) 实现一个简版的html+redux.js的demo

    回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱 初识react(二) 实现一个简版的html+redux.js的demo 初识react(三)在 react中使用redux来实现简版计数器 ...

  3. 初识React及React开发依赖介绍

    文章目录 初识React React介绍 React特点 React的依赖介绍 React的开发依赖 Babel和React的关系 React的依赖引入 初识React React介绍 React是什 ...

  4. web前端高级React - React从入门到进阶之初识React

    第一部分:React入门 系列文章目录 第一章:React从入门到进阶之初识React 第一章:React从入门到进阶之JSX简介 第三章:React从入门到进阶之元素渲染 第四章:React从入门到 ...

  5. 初识React脚手架

    最近接手了一个React的项目,学习和摸索了一段时间,刚好有一些心得,就记录下来. 这个项目是混合开发(Hybird)的.整体是以原生+Cordova+ReactJS 架构,下面简单说下. 原生是由S ...

  6. [译] React 路由和 React 组件的爱恨情仇

    原文地址:The Love-Hate Relationship between React Router and React Components 原文作者:Kasra 译文出自:掘金翻译计划 本文永 ...

  7. 从零开始React:一档 React环境搭建,语法规则,基础使用

    手挽手带你学React入门第一期,带你熟悉React的语法规则,消除对JSX的恐惧感,由于现在开发中都是使用ES6语法开发React,所以这次也使用ES6的模式进行教学,如果大家对ES6不熟悉的话,先 ...

  8. React笔记:React基础(2)

    1. JSX JSX是一种拥有描述UI的JavaScript扩展语法,React使用这种语法描述组件的UI. 1.1 基本语法 JSX可以嵌套多个HTML标签,可以使用大部分符号HTML规范的属性. ...

  9. React Component vs React Element

    React Component vs React Element 有这样的一个问题: // 方法定义 function add(x, y) {return x + y }// 方法调用 add(1, ...

  10. (React 框架)React技术

    1.简介 React 是Facebook 开发并开源的前端框架 当时他们的团队在市面上没找到合适的MVC 框架,就自己写一个 JS 框架,用来架设 instagram(图片分享社交网路),2013年开 ...

最新文章

  1. linux引导过程简述6,CentOS 6系统启动引导过程讲解
  2. centos 安装 openfire
  3. 【Qt】QObject详解
  4. [Labview资料] labview事件结构学习
  5. python实现按回车键继续程序_python实现按任意键继续执行程序
  6. 24 FI配置-财务会计-允许负值记账
  7. 前端—每天5道面试题(十二)
  8. CCF NOI1027 数字之和
  9. 使用代码辅助生成工具CodeSmith -- 生成NHibernate的映射文件
  10. [安全攻防进阶篇] 五.逆向分析之Win32 API获取及加解密目录文件、OllyDbg逆向其原理
  11. 数据库开启遇到的keng
  12. 毕业设计源码之“油价”小程序
  13. 三废的日常——什么是负载均衡
  14. Linux安装围棋AI(q5go和katago)
  15. Linux 计算机网络 从 ping 来初窥计算机网络
  16. RouterOS(ROS)软路由安全性配置指南
  17. 关于FB撞库、群控的技术实现
  18. 计算机常用软件考试试题,常用工具软件试题部分答案
  19. 【Java】方法中的参数传递机制的具体体现
  20. SV-函数(function)

热门文章

  1. 台式计算机和笔记本电脑的相同点,与笔记本电脑相比,台式机有哪些优势?
  2. 正则表达式的贪婪匹配和非贪婪匹配
  3. STM32HAL库微秒延时函数的实现---DWT和SysTick
  4. 终于解决“Git Windows客户端保存用户名与密码”的问题zhz
  5. html编辑个人信息页面,编辑个人信息.html
  6. onnx-modifier:ONNX可视化编辑
  7. JAVA前端————HTML—W3C—基本标签—超链接锚链接
  8. flutter pdf 插件使用
  9. 游戏数据库 mysql_网络游戏_数据库查询
  10. yang模型中rpc_RPC原理篇