React不是一个框架,是一个用于构建用户界面的JS库,实现单页面应用。React用于在前端构建用户界面(UI)。React是MVC应用程序的视图层(模型视图控制器)。html
多页面应用:页面跳转时跳转的都是完整的html页面
单页面应用:只有一个html页面,全部内容都在这个页面中展现,经过'路由'来加载不一样内容。所有是经过js来控制显示的。优势:用户体验比较好,加载比较流畅。缺点:不利于seo(网站优化,影响搜索排名),解决办法ssr(服务端渲染)。
先决条件 :全局安装了Node.js和npm。 npm i -g yarn(yarn下载速度比npm快) 方法1 :npx create-react-app my-app(项目初始化)
Create React App解读 :该环境预先配置了构建React应用所需的一切。它将建立一个实时开发服务器,使用Webpack自动编译React,JSX和ES6,自动前缀CSS文件,并使用ESLint测试和警告代码中的错误。前端
node_modules : 项目依赖包 public : 静态文件 (模板-index.html) src : 编写前台代码文件夹 index.js : 入口文件 App.js : 入口文件中渲染的页面 .test.js : 测试文件,通常不须要管 serviceWorker.js : PWA的配置文件 .gitignore文件 : git上传时的忽略配置文件 package.json :记录安装信息 "scripts": { "start": "react-scripts start", //启动开发阶段服务器 "build": "react-scripts build", //打包 "test": "react-scripts test", //运行测试 "eject": "react-scripts eject" //显示隐藏的配置 } 运行npm run eject时,提示这个命令是不可逆的, 运行后会多出config文件夹和scripts文件夹, config里边是webpack的配置;scripts里边是启动命令的配置, 通常不执行这个命令
1.在js中能够直接写html HTML部分:直接写html标签 JS部分 : 写在 { } 内 ·babel会把jsx转成React.createElement() ·React.createElement()方法是建立react元素(虚拟DOM)的方法 ·ReactDom.render()的第一个参数,须要的就是react元素 2.JSX的特色 { }大括号中写的是js表达式,【注】大括号中不能直接渲染对象,能渲染数组(不能有普通对象) 1. 类名 : className <div className='' ></div> <label htmlfor='' ></label> 2.添加行内样式: <div id={uid} style={{color:'red',fontsize:'14px'}} ></div> 3. react元素时不可变的,若是须要更新页面显示,就须要建立新的react元素 4.JSX是一个表达式,能够在map循环的代码块中使用JSX,将 JSX 赋值给变量, 把 JSX 看成参数传入,以及从函数中返回 JSX。 在JSX当中,是不能使用if else 的,不过可使用三元运算表达式 .map(function(ele,index){ return 返回值 }) 数组的一个遍历方法,ele是数组元素项,index是下标,return后是返回值 5. JSX属性 1.使用引号来定义以字符串为值的属性 const element = <div tabIndex="0"></div>; 2.使用大括号来定义以 JavaScript 表达式为值的属性 const element = <img src={user.avatarUrl}></img>; 3.style样式使用JSX,写法以下: <div style={{ color:"red" ,fontSize:"30px"}}></div>
React DOM 会负责更新 DOM 来与 React 元素保持一致node
语法:ReactDom.render(element,parentNode) 说明:
1.参数1:element为要显示的元素。能够是双标签形式的,也能够是单标签形式的,若是是单标签必须有结束符号
2.参数2:parentNode为元素要显示在页面的哪一个标签中。 3.渲染方法通常一个项目中只有一个。其余页面经过组件引入或者路由访问。 4.更新已渲染的元素:React 元素是不可变对象。一旦被建立,你就没法更改它的子元素或者属性。 react元素写法: 1.直接使用jsx语法: `<div>{变量名}</div>` 2.使用React.createElement() 3.使用组件`<App/>`
建立方式有两种:react
function App(props){ return (<div>{props.name}</div>) }
2. 类型式组件 :前期使用类组件,会学习类组件中的state,生命周期函数 类组件中想要获取props须要用 this.props 来获取
class App extends React.Component{ render(){ return ( <div></div> ) } }
【注意】无论函数式组件仍是类型式组件,必须先引入React,不然报错;return返回的jsx只能有一个顶层标签webpack
import React,{Component} from 'react' class Home extends React.Compoent{ return (<div></div>) }
说明: 1:组件名称首字母要求大写git
2:须要继承React.Component这个类 3:必须有一个render函数,render必须return,return后写的是jsx语法
export {Home} export default Home
import {Home} from 'path'---->Home名字是自定义 import Home from 'path'
<Home/> || <Home></Home>
把页面中的某一块UI拆分出去,作成一个组件,在使用的位置直接屡次调用组件便可es6
<Item data='data' arr={[1,2,3]} />
class Item extends Component{ console.log(this.props) // {data:'string',arr:[1,2,3,4]} }
arr/obj.map(function(item,index){ return item })
constructor(){ super(); this.state = { count : 1 } }
第二种:直接在组件中定义web
state = { count : 1 }
this.setState({ count : this.state.count + 1 })
方法2函数形式的 :
this.setState((state)=>{ return { count : state.count + 1 } })
this.setState({count : this.state.count + 1})ajax
this.setState({ },( )=>{ })
setState的函数形式 :参数state指的永远是最新的数据,是上一次操做完state的结果npm
this.setState((state)=>{ return { count : state.count + 1 } })
生命周期函数也被称为钩子函数,在组建运行过程当中在某些特定条件下自动执行的函数。重点:componentDidMount , componentDidUpdate , shouldComponentUpdate , componentWillUnmount
··· componentWillMount 组件即将渲染(可能会网络请求,可是不建议)
··· componentDIdMount 组件渲染完成(网络请求,全局事件绑定)
··· shouldComponentUpdate 是否容许组件更新(优化使用)
··· componentWillUpdate 组件即将更新(通常不作任何处理)
··· componentDidUpdate 组件更新完成(新的网络请求)
··· compoentWiiReceiveProps 组件接收新的props(通常不作任何处理)
··· componentWillUnmount 组件即将卸载(把全局绑定的事件,网络请求等有反作用的所有清除)
react中本身从新定义了事件系统,react绑定事件不须要获取到DOM元素,而是把事件绑定定义再虚拟DOM上
语法:<div on事件名 = {函数}>《/div>事件名要求采用驼峰命名法
函数编写形式:
1.直接定义一个箭头函数 2.能够定义函数 若是是类型式组件,须要使用this.clickme,clickme函数定义在类中 class App extends React.Component{ clickme() render(){ return <div onClick={this.clickme}></div> } } 3. this指向问题 在react中,自定义事件中this默认是指向undefined的 若是想让this指向当前组件有如下几种方法: 1.在constructor构造方法中经过bind绑定this 2.使用bind,改变this指向(能够传参) 3.使用箭头函数(内存开销最大) 若是当函数调用时没有传参,建议在constructor方法中绑定,若是函数调用时须要传参,直接使用bind绑定更多一些
事件对象不须要传递,直接调用就行,在事件对象方法函数形参的最后一个位置
获取坐标信息 阻止默认事件 阻止冒泡 获取事件触发者
form标签 <form action='http://xxx' method='get | post'></form>
ajax:不刷新页面,实现局部刷新,form不多用
表单:收集用户输入信息
第一种 : 受控组件(表单数据的显示和更改都是由react的state控制的,使react的state成为'惟一数据源') 第二种 : 非受控组件(容许用户获取到原生DOM,本身来操做数据)
。。。reart--》es6函数扩展