云上快速入门,热门云上应用快速查找
丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
畅聊无限,分享你的技术见解
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
热门
一、React进阶1、React脚手架npx create-react-app my-app12、reactconst React = { createElement, Component}1234React.createElement: 创建虚拟DOMReact.Component: 实现自定义组件
3、react-dom主要是render逻辑。
ReactDOM.render: 渲染真实DOM
4、Redux
5、组件通讯props使用:函数组件通过props接收数据,类组件通过this.props接收数据。特点:传递任意类型的数据;props是只读的对象;
props深入children属性props校验Mouse.propTypes = { children: PropTypes.func.isRequired}123props默认值Mouse.defaultProps = { children: ""}123三种方式父传子子传父通过回调函数实现class Parent extends React.Component{ getMsgCallback = data=>{ console.log(data) } render(){ return (
class Child extends React.Component{ handleClick= ()=>{ this.props.getMsgCallback("子传父") } render(){ return (
12345678910111213141516171819202122232425兄弟组件状态提升
Context跨组件传递数据
const {Provider,Consumer}=React.createContext()
{data => {}}123456786、组件的生命周期只有类组件才有生命周期不能在render钩子函数中调用setState函数在componentDidUpdate钩子函数中调用setState函数,要比较更新前后的状态是否相同常用钩子函数:
旧版钩子函数:
新版钩子函数:
7、render props模式实现状态逻辑复用,状态指的是state,逻辑指的是setState。
class Mouse extends React.Component{ render(){ return this.props.render(this.state) }}
鼠标当前位置{mouse.x},{mouse.y}
class Mouse extends React.Component{ render(){ return this.props.children(this.state) }}
{(mouse)=>
import PropTypes from 'prop-types'
Mouse.propTypes = { children: PropTypes.func.isRequired}123458、高阶组件高阶组件之于组件相当于手机壳之于手机。
目的:实现状态逻辑复用装饰模式HOC,实际上是一个函数const EnhancedComponent = withHOC(WrappedComponent)1function withMouse(WrappedComponent){ class Mouse extends React.Component{ return } return Mouse}
const MousePosition = withMouse(Position)
12345678910问题1得到两个组件名称相同
解决1设置displayName能在调试时区分不同组件
Mouse.displayName = WithMouse${getDisplayName(WrappedComponent)}
WithMouse${getDisplayName(WrappedComponent)}
function getDisplayName(WrappedComponent){ return WrappedComponent.displayName || WrappedComponent.name || 'Component'}12345问题2props丢失
解决2
1二、React原理1、setState函数作用:修改state;更新组件注意:异步更新数据;多次调用setState函数只触发一次重新渲染;setState(updater[,callback]),第二个参数在状态更新且页面完成渲染后立即执行某个操作;
// 经典写法this.setState({ count: this.state.count+1})
// 推荐写法,多次调用setState函数的顺序更符合人类的思维顺序this.setState((state,props)=>{ return { count: state.count+1 }})12345678910112、JSX语法的转化过程JSX是createElement函数的简化语法。JSX语法被@babel/preset-react插件编译为creatElement函数。React元素:描述看到的内容。
JSX和JSX预处理后的代码:
3、组件更新机制
4、组件性能优化减轻state只存储与渲染相关的数据
避免不必要的渲染使用钩子函数shouldComponentUpdate(nextProps, nextState)
纯组件自动实现了shouldComponentUpdate钩子函数;使用浅层对比,对于引用类型,只比较对象的地址;
const newObj = {...state.obj, number: 2}setState({obj: newObj})
this.setState({ list: [...this.state.list, {新数据}]})1234565、React的部分更新实现:虚拟DOM配合Diff算法虚拟DOM:React元素,本质是JS对象,描述UI。用JS对象表示DOM信息和结构,当状态变更的时候,重新渲染这个JS的对象结构
const element={ type: 'h1', props: { className: 'greeting', children: 'Hello JSX' }}1234567'运行运行Diff过程:
三、React路由功能:从一个视图导航到另一个视图使用:配置路由和组件常用组件:Router组件,推荐用HistoryRouterLink组件Route组件,能够指定路由组件的位置路由的执行过程:
编程式导航通过JS代码实现页面跳转push(path)go(n)匹配模式模糊匹配默认匹配模式,pathname以path开头就匹配成功,pathname是Link组件的to,path是Route组件的path精确匹配添加exact属性
1四、租房移动Web实践核心业务在线找房、用户登陆、房源发布
技术栈React核心库:react、react-dom、react-router-dom脚手架:create-react-app数据请求:axiosUI组件库:antd-mobile其他组件库:react-virtualized、formik+yup、react-spring百度地图API
node-sass依赖注意node-sass依赖的问题,多次yarn操作后可以成功安装,但默认情况下node-sass的版本与node的版本不一致。(着实纳闷)
condition:
node -v v14.17.3node-gyp -v v3.8.012target:
yarn add node-sass@4.12.01problem:
gyp verb which failed Error: not found: python21solution:
which
yarn add global production windows-build-tools1H5的地理位置API获取的地理位置与GPS、IP地址、WIFI和蓝牙的MAC地址、GSM/CDMS的ID有关。手机优先使用GPS定位,笔记本最准确的定位是WIFI。只能获得经纬度信息。navigator.geolocation.getCurrentPosition(position => { console.log('当前位置信息:', position)})123百度地图API使用步骤:
引入百度地图API的JS文件,替换自己的密钥在index.css设置全局样式创建Map组件,配置路由。在Map组件中,创建地图容器元素,并设置样式创建地图实例设置中心点坐标初始化地图,并设置展示级别地图找房百度地图标注文本覆盖物label缩放级别缩放事件组件间样式覆盖问题solution手动处理,定义不同类名CSS IN JSCSS Modules,React脚手架已集成说明:对CSS类名重命名,保证每个类名的唯一性。所有类名都有局部作用域。实现:webpack的css-loader命名:BEM规范(Block块、Element元素、Modifier)React脚手架中的命名:文件名、类名、hashstyled-components案例