React是Facebook开发出的一款JS库 Facebook认为MVC无法满足他们的扩展需求
特点
1.react不使用模板
2.react 不是一个MVC框架
3.响应式
4. react是一个轻量级的js库
原理
虚拟DOM react把DOM抽象成为一个JS对象
diff算法
1.虚拟DOM确保只对界面上真正发生变化的部分进行实际的DOM操作
2.逐层次的来进行节点的比较
react 历史轴
2013
1.react.js 核心文件
2.react-dom.js 渲染页面中的DOM 当前文件依赖于react核心文件或者(react-native)
3.babel.js ES6转换成ES5 JSX语法转换成javascript 现今浏览器进行代码的兼容
下载
react 核心包 npm i react --save
react-dom npm i react-dom --save
babel npm i babel-standalone --save
// 1.注释 /**/
let MyDom=
{/*我是需要注释的内容*/}
hello
ReactDOM.render(MyDom,document.getElementById("demoReact"))
使用表达式
渲染数组
属性设置
// 注意在jsx 不能使用class 这个属性 因为class是js的关键字 className
jsx独立文件
map()
let obj={
name:"xixi",age:18,sex:"男"
}
let myDom=
{ Object.keys(obj).map((v,i)=>{
return 便利的属性是:{v}-------便利出来的值是:{obj[v]}
})}
ReactDOM.render(myDom,document.getElementById("demoReact"));
组件到底是什么?
高耦合低内聚
高耦合就是吧逻辑紧密的内容放在一个组件当中 低内聚吧不同组件的依赖关系尽量弱化 每个组件眼尽可能的独立起来
组件当中的重要内容
1.构建方式
2.组件的属性
3.生命周期
演变过程 传统的组件有几个明显的特点 1,简单的封装 2 简单的生命周期的呈现 3.明显的数据流动 当一个项目比较
复杂的时候 传统的组件化根本不能很好的把结构样式和行为结合 让项目很难以维护
react的组件分为3个部分 1 属性props 2 状态 state 3 生命周期
react的组件 是一个非常重要的概念 通过组件可以吧页面中的ui部分切分成 独立 高复用性的部件 让每个开发者更加专注于
一个个独立的部件
组件与组件化
组件 就是用实现页面局部功能的代码集合 简化页面的复杂程度 提高运行效率
组件化 当前程序都是使用组件完成的 那么就是一个组件话的应用
组件的创建
1.函数组件/无状态组件
2.类组件
1.
// 无状态组件的创建方式
function MyCom(){
return (
我是一个无状态组件
)
}
// 组件就是自定义标签
// 调用组件
let com=
ReactDOM.render(com,document.getElementById("demoReact"));
// 创建类组件 组件名首字母大写
class MyCom extends React.Component{
render(){
return(
类组件
)
}
}
let com=
ReactDOM.render(com,document.getElementById("demoReact"));
函数组件
// props是react中一个重要的属性 是组件对外的接口 我们props就可以从组件的外部向组件的内部进行数据的传递
// 也可以完成父组件给子组件的数据传递
// 注意:无论是无状态组件还是类组件 我们都不饿能修改自身的props
function Com(props){
return (
我是一个无状态组件------外部传递数据是:{props.text}---{props.num}
)
}
let obj={
text:"我是text数据",
num:"我是num"
}
ReactDOM.render( ,document.getElementById("demoReact"));
类组件
class Com extends React.Component{
render(){
return(
我是类组件---{this.props.name}---{this.props.num}
)
}
}
let obj={
name:"我是数据name",
num:"我是数据num"
}
ReactDOM.render( ,document.getElementById("demoReact"));
无状态组件的props验证和 默认值
Com.defaultProps={
name:"我是props中name的默认值"
}
Com.propTypes={
name:PropTypes.number,//验证name这个props传递进来的数据必须是number类型
age:PropTypes.number.isRequired
}
let num=9527
let agetext=18
ReactDOM.render(,document.getElementById("demoReact"));
// state 状态
// state和props的区别
// props是组件对外的接口 state是组件对内的接口
// 组件内可以引用其他组件 组件之间的引用就形成了一个树状的接口 如果下层组件需要使用上层组件的数据
// 上曾组建就可以通过下层组件中props来进行数据的传递 因此props就是组件对外的接口
// 组件除了使用上层组件传递的数据之外 他自身也可能有需要管理的数据 这个对内管理数据的属性就是state
// 主要区别:
// 1.state是可变的
// 2.props对于当前页面的组件来说 他是只读 如果我们想修改props中的数据 那么我们修改传递给当前组件数据的父组件中的内容
// react中我们只需要关心的是数据 当数据改变的时候页面就会自动的发生改变
// 状态等同于页面中的数据 状态/数据改变了---页面中对应的数据绑定内容就会被react自动的进行改变
// 声明式渲染 --- 一切的数据改变操作都不用我们关心 只需要我们生命好数据 react就会自动的对于数据进行相应的改变
// 如果想使用状态 那么不能使用无状态组件
class Com extends React.Component{
// 在ES6中不管子类写不写constructor 在new实力的时候都会不上consttructor。
// 我们可以不写 但是如果我们写了constructor 之后就必须在其中协商super() 就是指向父类的构造方法
constructor(props){
// 如果想在consternation使用props 那么super中必须写上props
super(props)
// 定义state
this.state={
name:"西西"
}
}
render(){
return (
// this.setState({key:newValue}) 异步的 react就会自动的触发render进行数据的渲染
我是一个组件-----{this.state.name}
)
}
}
ReactDOM.render( ,document.getElementById("demoReact"));
插入html标签dangerouslySetInnderHTML={{__HTML:你要插入的字符串}}
// 转发 refs react当中提供了一个ref的数据 (不能再无状态组件当中来进行使用 因为无状态组件没有实例)
// 表示当前组件的真正实例的引用 他会返回绑定当前属性的元素
// 标识组件内部的元素---方便我们查找
// react给我们3种方式进行ref的使用
// 1、字符串的方式
// 2.回调函数(推荐)
// 就是在dom节点上或者组件上挂在函数 函数的入参形参 是dom接地那 他的效果和字符串的方式是一样的都是获取值得引用
// 3.React.createRef()(react16.3新提供的一种方式)
// 把值付给一个变量 通过ref挂在在节点或者足尖上 使用ref的current属性拿到这个节点
// 官方当中建议我们 不要过度的使用refs对逻辑进行处理 需要优先考虑state
class Com extends React.Component{
constructor(props){
super(props)
this.myRef=React.createRef();
}
fun=()=>{
// console.log(this.refs.demoInput.value)
// console.log(this.textinput.value)
console.log(this.myRef.current.value)
}
render(){
return(
我是组件
{/*
*/}
{/*{this.textinput=input}} placeholder="请输入"/>
*/}
)
}
}
ReactDOM.render( ,document.getElementById("demoReact"));
在这里插入代码片
// 状态提升 多个组件需要反映相同的变化数据 ,提升到他们最近的一个父组件中
// 多个子组件需要利用到对方状态的情况下 那么这个时候就需要使用到状态提升
1.create-react-app 是facebook官方退出的一款react的脚手架
为什么?
安装插件麻烦
电脑上面必须有node 升级到最新版本
安装
1.npm install -g create-react-app 全局安装脚手架
2,create-react-app --version 查看版本
3.cd 需要创建的文件夹中,create-react-app myapp
4.npm start 启动项目
1.public 静态资源文件夹
2.src 写代码的地方
1.json-server 模拟数据的 npm install json-server -g
启动 cd mock文件夹下
json-server json数据的名字 --port 4000
2.axios 数据请求 npm install --save axios
在页面中引用axios
解决跨域
安全机制 同源策略 通端口同域名
react解决跨域:
1.正向代理–开发环境 一个位于客户端和目标服务器之间的代理服务器 为了获取到目标服务器的内容 客户端向代理服务器发送一个请求 代理服务器
帮助我们去目标服务器里面获取数据并且返回给我们
2.反向代理–上线环境 可以通过代理服务器来接受网络上的请求连接 然后将这个请求转发给内部的网络服务器上 并且把这个服务器上得到的数据返回给网络
请求的客户端 这个时候代理服务器对外的表现就是一个反向代理
模拟请求真实的网络接口 中国天气网中的数据
找到文件 项目\node_modules\react-scripts\config\webpackDevServer.config.js
代理
proxy:{
"/api":{
target:"http://www.weather.com.cn/data/cityinfo",
changeOrigin:true,
"pathRewrite":{
"^/api":"/"
}
}
},
路由 --根据 url的不同来切换对应的组件 实现spa(单页面应用) 在页面切换的时候不会刷新 更加接近原生体验
v5版本
1下载 npm install --save react-router-dom
router-router 只提供了一些核心的API
router-router-dom 更多的一些选项
路由模式:
hash HashRouter (hash 模式 带#号 刷新的时 候页面不会丢失)
browser BrowserRouter 历史记录模式 没有#号 他是通过历史记录api来进行路由切换的 刷新会丢失 本地模式不会
2.index.js引用路由模块
3.路由模式包裹根组件
ReactDOM.render(, document.getElementById(‘root’));
4引用import {Route} from ‘react-router-dom’
5配置 Route
路由导航 Link to=“去哪里” NavLink 可以动态的给选中的导航添加active的类名
// redux javascript提供的一个可预测性(我们给一个固定的输入 那么必定可以等到一个结果)的状态容器
// 集中的管理react中多个组件的状态
// redux是一个专门的状态管理库 (在vue等当中也可以使用 但是在react中会比较多)
// 需求场景
// 某个组件的状态需要共享的时候
// 一个组件需要改变另外一个组件状态的时候
// 组件中的状态需要在任何地方都可以拿到
// 三大原则:
// 1.单一数据源 整个react中的状态都会被统一的管理到store
// 2.state是只读的 我们不能够直接改变state 而是要通过触发redux中的特定方法来进行修改
// 3.使用纯函数来执行修改操作: action来改变redux中的state
// 下载 npm install --save redux