React起源于 Facebook的内部项目,因为该公司对市场上所有 Javascript MVC框架,都不满意,就决定自己写一套,用来架设 Instagram(照片交友)的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
Angular12009年谷歌MVC不支持组件化开发
由于 React的设计思想极其独持,属于革命性创新,性能出众,代码逻却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来Web开发的主流工具。
清楚两个概念:
三大框架一大抄
Angular.js:出宋较早的前端框架,学习曲线比较陡,NG1学起来比较麻烦,NG2~NG5开始,进行了一系列的改革,也提供了组件化开发的概念;从NG2开始,也支持使用IS( Typescript)进行编程;
vue.js:最火(关注的人比较多)的一门前端框架,它是中国人开发的,对我我们来说,文档要友好一些
Reac.js:最流行(用的人比较多)的一门框架,因か它的设计很优秀
React!是由 Facebook前端官方团队进行维护和更新的;因此, Reacte的维护开发団队,技术实力比较雄厚
Vue:第一版,主要是有作者尤雨溪专门进行维护的,当Vue更新到2X版本后。也有了ー个以尤雨溪为主导的开源小团队,进行相关的开发和维护
和 Angular1相比, Reacti设计很优秀,一切基于js并且实現了组件化开发的思想
开发团队实力强悍,不必担心断更的情況
社区强大,很多问题都能找到对应的解决方案
提供了无缝转到 Reactnative上的开发体验,让我们技术能力得到了拓展;増强了我们的核心竟争力
很多企业中,前端项目的技术选型首选的是 React.js;
- **DOM的本质是什么**:浏览器中的概念,用js对象来表示页面上的元素,并提供了操作DOM对象的API
- **什么是 Reacte中的虚拟DOM**:用JS对象来模拟页面上的DOM和DOM嵌套;
- **为什么要实现虚拟DOM(虚拟DOM的目的)**:为了实现页面中,DOM元素的高效更新
- **DOM和虚拟DOM的区别**:
- DOM:针对于浏览器来说 才有dom
- 虚拟DOM:针对于框架的说法 按需渲染页面
- 如何按需渲染 需要获取内存中的dom树 从而比对 但是无法获取到浏览器中的dom树 怎么办? 通过程序员自己 手动模拟俩个dom树 出来 实现新旧dom树进行比对 程序员手动模拟的dom 就是**react中虚拟dom的由来**
什么情况下 必需操作真实dom
- video/audio 音频 视频 操作dom开关 播放
- 插件 ui插件 swiper/better-scroll
- canvas
react获取真实dom3种方式
this.$refs.dom1 获取的是当前实际dom
<div ref="dom1"></div>
- 方式二:传递的是一个回调函数
this.dom1 获取的是当前实际dom
参数 el 就是真实的额dom元素 但在别的地方需要使用 所以挂载到this上
<div ref={(el)=>{el=>this.dom1=el}}></div>
- 方式三:传递的是react创建的一个对象
this.dom1 = React.createRef()
this.dom1.current 获取的是当前实际dom
<div ref={this.dom1}></div>
全部委托给 document去处理了
绑定事件 其实 是 绑定给 document了 利用事件冒泡原理
react中的事件 没有绑定在dom上
react利用事件冒泡 吧所有的额事件全部绑定在document上
严格模式下 直接打印this - undefined
<input type="text" defaultValue="我是非受控组件默认值" ref={el => this.inp = el}/>
<button onClick={this.submit}>提交</button>
submit = () => {
console.log(this.inp.value)
}
state = {
val: '我是val'
}
<input type="text" value={this.state.val} onChange={this.changeInp} />
changeInp = (e) => {
this.setState({
val: e.target.value
})
}
学习React必须掌握 React 最新的解锁方式,紧跟时代潮流。本步骤系统介绍React新特性Hooks, 并利用所学知识,使用
PWA 实现堪比原生 APP 体验的应用
学习目标: 掌握 React 的新特性, 重构去哪儿网火车票系统
课程重点:
1.Context 与静态属性ContextType
2.Hooks 函数式组件与传统类组件的差异
3.Redux 的概念和意义,以及 Redux 的常用 API
4.渐进式 Web 应用的核心以及在项目中的应用
<ul>
<li><NavLink exact to="/" activeStyle={{
fontWeight: 'bold',
color: 'red'
}}>home</NavLink>
</li>
<li><NavLink exact to="/detail" activeStyle={{
fontWeight: 'bold',
color: 'red'
}}>detail</NavLink>
</li>
</ul>
<ul>
<li onClick={() => this.props.history.push({pathname:'detail'})}><div>home</div>
</li>
<li onClick={() => this.props.history.push({pathname:'home'})}><div>detail</div>
</li>
</ul>
<ul>
<li onClick={() => this.props.history.push({pathname:'detail',state:{id:1}})}><div>home</div>
</li>
<li onClick={() => this.props.history.push({pathname:'home',state:{
id:0}})}><div>detail</div>
</li>
</ul>
// 获取参数
this.props.history.location.state
1.使用query传递
this.props.history.push({ pathname : '/access_control/role/roleEdit',query:{ aa: 'aa'} })
获取参数:
this.props.location.query.aa
2.使用state传递
this.props.history.push({ pathname : '/access_control/role/roleEdit',state:{ aa: 'aa'} })
获取参数:
this.props.location.state.aa
import React from 'react';
import {Switch, Route, Redirect} from 'react-router-dom';
export default (props)=>{
return <Switch>
{
props.routes.map((item, index)=>{
return <Route key={index} path={item.path} render={(props)=>{
if (item.children){
/** 渲染组件,类似于
* ...props 把路由信息展开传递下去
* item.children 把子路由配置传递下去
*/
return <item.component {...props} routes={item.children}/>
}else{
return <item.component {...props}/>
}
}}></Route>
})
}
<Redirect exact from="/" to="/list"></Redirect>
</Switch>
}
// 一级路由
import List from '../components/List';
import Detail from '../components/Detail';
// 二级路由
import Content from '../components/Content';
export default {
routes: [{
path: '/list',
component: List,
children: [{
path: '/list/content',
component: Content
}]
},{
path: '/detail',
component: Detail
}]
}
// 封装的类似与router-view的组件
import RouterView from './router/RouterView';
// 路由配置
import config from './router/router.co nfig';
ReactDOM.render(<Router>
<RouterView routes={config.routes}></RouterView>
</Router>, document.getElementById('root'));
<RouterView routes={this.props.routes}></RouterView>