仅供个人学习使用,大量借鉴他人文章,详情移步 React面试知识点, # 高频前端面试题汇总之React篇,# 「react进阶」一文吃透react-hooks原理,# React Hooks 使用误区,驳官方文档,# 30分钟精通React Hooks,# React-Router V6 使用详解(干货),# React快速暴力入门,# react-redux一点就透,我这么笨都懂了!,# JSX核心语法及JSX本质浅析
声明式编程&&命令式编程
- 声明式编程
const doubleWithDec = numbers.map(number => number * 2);
- 命令式编程
const doubleWithImp = [];
for(let i=0; i<numbers.length; i++) {
const numberdouble = numbers[i] * 2;
doubleWithImp.push(numberdouble)
}
声明式编程的编写方式描述了应该做什么,而命令式编程描述了如何做。
函数式编程
函数式编程是声明式编程的一部分。函数是数据,你可以像保存变量一样在应用程序中保存、检索和传递这些函数。其具有以下特性:
- 不可变性(Immutability)
- 纯函数(Pure Functions)
- 数据转换(Data Transformations)
- 高阶函数 (Higher-Order Functions)
- 递归
- 组合
React
React 是js的一个UI库,能够高效、快速的构建用户界面。使用虚拟dom操作dom,遵循数据从高阶组件到低阶组件单向流动
虚拟dom
浏览器遵循HTML指令来构造文档对象模型(DOM)。当浏览器加载HTML并呈现用户界面时,HTML文档中的所有元素都变成DOM元素。eg:
<div>
<div>
<h1>This is heading</h1>
<p>this is paragraph</p>
<div>
<p>This is just a paragraon</p>
</div>
</div>
</div>
每当DOM发生更改时,浏览器都需要重新计算CSS、进行布局并重新绘制web页面,这是个非常消耗计算的过程.而虚拟dom运用两个虚拟dom树,通过比较两个虚拟DOM 差异,并将这些变化更新到实际DOM,从而大大减少计算
JSX
- JSX是一种JavaScript的语法扩展(eXtension),也在很多地方称之为JavaScript XML,因为看起来就是一段XML语法;
- 它用于描述我们的UI界面,并且其完成可以和JavaScript融合在一起使用
- 它生成React元素,这些元素将在DOM中呈现。React建议在组件使用JSX
import React from 'react';
export const Header = () => {
const heading = 'TODO App'
return(
<div style={{backgroundColor:'orange'}}>
<h1>{heading}</h1>
</div>
)
}
函数组件
函数组件(无状态组件)是一个纯函数,它可接受接受参数,并返回react元素。eg: 上面的Header组件
类组件
由于hooks的出现,类组件已经慢慢被淘汰的。这里不讨论。
React如何引用css
- 外部样式表
import React from 'react';
import './App.css';//外部样式表
import { Header } from './header/header';
function App() {
return (
<div className="App">
<Header />
</div>
);
}
export default App;
- 内联样式
import React from 'react';
export const Header = () => {
const heading = 'TODO App'
return(
//内联样式
<div style={{backgroundColor:'orange'}}>
<h1>{heading}</h1>
</div>
)
}
- 定义样式对象并使用它 styled
//可以在组件中定义一个`style`对象并使用它
import React from 'react';
const footerStyle = {
width: '100%',
backgroundColor: 'green',
padding: '50px',
font: '30px',
color: 'white',
fontWeight: 'bold'
}
export const Footer = () => {
return(
<div style={footerStyle}>
All Rights Reserved 2019
</div>
)
}
React-Redux
- Redux 是 React的一个状态管理库,它基于flux。
- Redux简化了React中的单向数据流。 Redux将状态管理完全从React中抽象出来 原理
- redux是react全家桶的一员,它试图为 React 应用提供「可预测化的状态管理」机制。
- Redux是将整个应用状态存储到到一个地方,称为store
- 里面保存一棵状态树(state tree)
- 组件可以派发(dispatch)行为(action)给reduer,reduer处理好数据后返回新的state给store
- store不是直接通知其它组件
- 其它组件可以通过订阅store中的状态(state)来刷新自己的视图
React组件列表渲染、条件渲染与DOM的Diffing算法
key 的使用
有的人发现了写列表渲染的时候,我都会给每个标签加上一个 key属性,这是为什么呢?
其实 key的作用是给当前的标签添加一个唯一的标识,用于给React进行 diffing算法计算的时候使用
export const Content = () => {
const listData = [
{ name:'lee', age: 23, id: 277 },
{ name:'fun', age: 24, id: 898 },
{ name:'kao', age: 25, id: 554 },
];
return <div style={footerStyle}>
{listData.map(item => {
return <li key={item.id}>{item.name}---{item.age}</li>
})}
</div>);
}
3. diffing 算法
当状态发生改变时,react会根据【新的状态】生成【新的虚拟DOM】
然后将新旧虚拟DOM进行 diff比较,比较规则如下:
-
旧虚拟DOM 中找到了与 新虚拟DOM 相同的 key
- 若虚拟DOM中的内容没变,则直接使用之前的真实DOM
- 若虚拟DOM中的内容变了,则生成新的真实DOM并进行替换
-
旧虚拟DOM 中未找到与 新虚拟DOM 相同的 key,则根据数据创建新的真实DOM,然后渲染到页面
用index作为key可能引发的问题
- 对数据进行 逆序添加、逆序删除 邓破坏顺序的操作 会产生没有必要的真实DOM更新,影响效率
- 对结构中包含输入类的DOM 会产生错误的 DOM更新,同时界面渲染有问题
- 若仅用于展示数据,那用 index作为 key则没有问题
react-router-dom(v6说法)
react-router-dom 是目前最新的说法之前是 react-router 全局路由有常用两种路由模式可选:HashRouter 和 BrowserRouter
- HashRouter:URL中采用的是hash(#)部分去创建路由,类似www.example.com/#/
- BrowserRouter:URL采用真实的URL资源 后续有文章会详细讲HashRouter的原理和实现,这里我们采用BrowserRouter来创建路由
useNavigate
useNavigate是替代原有V5中的useHistory的新hooks,其用法和useHistory类似,整体使用起来更轻量
//js写法
let navigate = useNavigate();
function handleClick() {
navigate("/home");
}
//组件写法
function App() {
return <Navigate to="/home" replace state={state} />;
}
//替代原有的go goBack和goForward
<button onClick={() => navigate(-2)}>
Go 2 pages back
</button>
<button onClick={() => navigate(-1)}>Go back</button>
<button onClick={() => navigate(1)}>
Go forward
</button>
<button onClick={() => navigate(2)}>
Go 2 pages forward
</button>
react-hooks
30分钟精通React Hooks # React Hooks 使用误区,驳官方文档 # react进阶」一文吃透react-hooks原理