React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
由于 React的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。
官网:https://react.docschina.org/
(1)跨浏览器兼容
(3)单向数据流动
(4)虚拟DOM,运行速度非常快
(5)JSX语法糖
React不是完整的MVC框架,需要结合flux或者redux来开发大型项目
react核心库
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
reactDOM核心库
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
示例代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>起步</title> <!-- 引入React核心库 --> <script src="./js/react.development.js"></script> <!-- 引入ReactDOM核心库 --> <script src="./js/react-dom.development.js"></script> </head> <body> <div id="app"></div> <script> //通过React核心库创建一个虚拟DOM var el = React.createElement("h1",null,"纸上得来终觉浅") //通过ReactDOM核心库把虚拟DOM渲染到指定的容器内容 ReactDOM.render(el,document.getElementById("app")) </script> </body> </html>
jsx(Javascript和XML),是FaceBook专门为React框架开发的一套语法糖
jsx是一种js语法的扩展,允许html和js混写
jsx语法糖具有结构清晰、增加js语义、抽象程度高、屏蔽DOM操作、语言跨平台等特点
规律:遇到<解析成html语法,遇到{解析成js语法。
{ } 花括号中,可以写单行js语法,也可以写成一个匿名函数
<script src="./js/babel.min.js"></script>
<script type="text/babel"></script>
var els = <div> <h1>纸上得来终觉浅</h1> <h2>绝知此事要躬行</h2> </div>
<script type="text/babel"> var arr = [ { id:100001,goodsname:‘小米手机‘,price:3999 }, { id:100002,goodsname:‘笔记本电脑‘,price:5999 }, { id:100003,goodsname:‘冰箱‘,price:4999 } ] var uls = (<ul> { arr.map(item=>{ return( <li key={ item.id }> <p>商品编号:{ item.id }</p> <p>商品名称:{ item.goodsname }</p> <p>商品价格:{ item.price }</p> </li> ) }) } </ul>) ReactDOM.render(uls,document.querySelector("#box")) </script>
(1)在jsx中,实现条件判断可以使用if
arr.map(item=>{ if(item.status){ return ( <li key={ item.id }> <p>商品编号:{ item.id }</p> <p>商品名称:{ item.goodsname }</p> <p>商品价格:{ item.price }</p> </li> ) } })
(2)如果在jsx渲染的虚拟DOM中需要再次使用条件判断
<p> { ( function(){ if(item.isnew == 1){ return <span>新品</span> } }() ) } </p>
(1)不能把html和body标签当成挂载点
(2)虚拟DOM只能有一个根标签
(3)单标签要有闭合,input、hr、br、img
(4)行内样式,要写成对象格式
<div id="box2" style={ { color:‘red‘ } }>box2</div>
(5)class属性
class属性要改为className
(6)for属性
for属性要改为htmlFor
npm i create-react-app -g
验证是否安装成功
create-react-app -V
进入一个指定的目录(不要在c盘或者桌面),执行命令
create-react-app 项目名称
项目名称不要包含中文和空格
在命令行中进入到项目根目录,执行命令
npm start
项目启动成功后,会自动打开浏览,并在3000端口上运行
node_modules 项目依赖目录 public 项目运行根目录 src 项目源码目录 index.js 项目启动文件 index.css 全局样式文件 App.js 根组件 App.css 根组件样式文件
项目运行流程:
public/index.html
src/index.js
src/App.js
无状态组件
function App() { return ( <div className="App"> <h1>根组件</h1> </div> ); } export default App;
状态组件(业务组件)
在react中,组件的首字母要大写
import React from ‘react‘ // 声明一个类组件 export default class Home extends React.Component{ render(){ return( <div> <h1>home组件</h1> </div> ) } }
只有类组件才有状态机
在类中直接定义一个state属性,属性值的数据类型是对象
state = { msg : ‘react状态机‘ } render(){...}
constructor(){ super();//在构造函数中,必须要先调用super,才能够获取到this指向 this.state = { msg : ‘react状态机‘ } } render(){...}
在页面组件中使用状态机中的数据
<p>{ this.state.msg }</p>
在状态机中给提供了一个setState方法,用来修改状态机中的数据,同时可以实现页面重新渲染。
setState方法做了两件事情:
第一个是合并数据
第二个是调用render方法来重新渲染页面
import React, { Component } from ‘react‘ export default class Clock extends Component { state = { nowtime : new Date().toLocaleTimeString() } changeTime(){ setInterval(() => { // this.state.nowtime = new Date().toLocaleTimeString() this.setState({ nowtime : new Date().toLocaleTimeString() }) }, 1000); } // 组件挂载完成生命周期钩子函数 componentDidMount(){ this.changeTime(); } render() { return ( <div> <h2>当前时间:{ this.state.nowtime }</h2> </div> ) } }
原文:https://www.cnblogs.com/hxmw/p/14336589.html