先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
btns: [
{
title: ‘查询’,
onClick: () => console.log(‘查询’),
},
{
title: ‘重置’,
onClick: () => console.log(‘重置’),
},
],
}}
)
}
}
HOC-⾼阶组件
为了提⾼组件复⽤率,可测试性,就要保证组件功能单⼀性;但是若要满⾜复杂需求就要扩展功能单⼀的组件,在React⾥就有了HOC(Higher-Order Components)的概念,定义:⾼阶组件是⼀个⼯⼚函数,它接收⼀个组件并返回另⼀个组件
HOC-基本使⽤
HocPage.js
import React from ‘react’
function Child(props) {
return
}
const foo = (Cmp) => (props) => {
return <Cmp {…props} />
}
/*const foo = (Cmp) => {
return (props) => {
return <Cmp {…props} />
}
}*/
export default function HocPage(props) {
const Foo = foo(Child)
return (
HocPage
)
}
/pages/User.js【运⽤hoc改写前⾯的Context例⼦】
import React from ‘react’
import { Consumer } from ‘…/AppContext’
import Layout from ‘./Layout’
const handleConsumer = (Cmp) => (props) => {
return {(ctx) => <Cmp {…props}>}
}
export default function User(props) {
const HandleConsumer = handleConsumer(UserCmp)
return (
)
}
function UserCmp(props) {
console.log(‘user’, props)
return
}
HOC-链式调⽤
import React from ‘react’
function Child(props) {
return
}
const foo = (Cmp) => (props) => {
return (
<Cmp {…props} />
)
}
const foo2 = (Cmp) => (props) => {
return (
<Cmp {…props} />
)
}
export default function HocPage() {
const Foo = foo2(foo(Child))
return (
HocPage
)
}
HOC-装饰器写法
⾼阶组件本身是对装饰器模式的应⽤,⾃然可以利⽤ES7中出现的装饰器语法来更优雅的书写代码。 CRA项⽬中默认不⽀持js代码使⽤装饰器语法,可修改后缀名为tsx则可以直接⽀持
// 装饰器只能⽤在class上
// 执⾏顺序从下往上
@withLog
@withContent
class Lesson2 extends React.Component {
render() {
return (
{this.props.stage} - {this.props.title}
)
}
}
export default function HocTest() {
// 这⾥使⽤Lesson2
return (
{[0, 0, 0].map((item, idx) => (
))}
)
}
Hooks
Hook是React16.8⼀个新增项,它可以让你在不编写 class 的情况下使⽤ state 以及其他的 React 特性。
Hooks的特点:
-
使你在⽆需修改组件结构的情况下复⽤状态逻辑
-
可将组件中相互关联的部分拆分成更⼩的函数,复杂组件将变得
-
更容易理解
-
更简洁、更易理解的代码
State Hook-状态钩⼦
创建HookPage.js
import React, { useState, useEffect } from ‘react’
export default function HookPage() {
const [date, setDate] = useState(new Date())
useEffect(() => {
const timerId = setInterval(() => {
setDate(new Date())
}, 1000)
return () => clearInterval(timerId)
})
return (
Home ⻚⾯
)
}
更新函数类似setState,但它不会整合新旧状态
声明多个状态变量
import React, { useState, useEffect } from ‘react’
export default function HookPage() {
const [date, setDate] = useState(new Date())
const [fruits, setFruits] = useState([‘apple’, ‘banana’, ‘berry’])
useEffect(() => {
const timerId = setInterval(() => {
setDate(new Date())
}, 1000)
return () => clearInterval(timerId)
})
const del = (delIndex) => {
const tem = […fruits]
tem.splice(delIndex, 1)
setFruits(tem)
}
return (
Home ⻚⾯
)
}
function FruitList({ fruits, onSetFruits }) {
return (
<>
点击下⾯⽔果删除当前
{fruits.map((item, index) => {
return (
key={‘fruit’ + index}
onClick={() => onSetFruits(index)}
{item}
)
})}
</>
)
}
⽤户输⼊处理
import React, { useState, useEffect } from ‘react’
export default function HookPage() {
const [date, setDate] = useState(new Date())
const [fruits, setFruits] = useState([‘apple’, ‘banana’, ‘berry’])
useEffect(() => {
const timerId = setInterval(() => {
setDate(new Date())
}, 1000)
return () => clearInterval(timerId)
}) //副作⽤ , [date]);
const del = (delIndex) => {
const tem = […fruits]
tem.splice(delIndex, 1)
setFruits(tem)
}
return (
Home ⻚⾯
<FruitAdd onAdd={(item) => setFruits([…fruits, item])} />
)
}
function FruitList({ fruits, onSetFruits }) {
return (
<>
点击下⾯⽔果删除当前
{fruits.map((item, index) => {
return (
key={‘fruit’ + index}
onClick={() => onSetFruits(index)}
{item}
)
})}
</>
)
}
function FruitAdd(props) {
const [name, setName] = useState(‘’)
return (
增加⽔果
<input
type=“text”
value={name}
onChange={(e) => setName(e.target.value)}
/>
<button onClick={() => props.onAdd(name)}>add
)
}
Effect Hook-副作⽤钩⼦
useEffect:给函数组件增加了执⾏副作⽤操作的能⼒。
副作⽤(Side Effffect):是指⼀个 function 做了和本身运算返回值⽆关的事,⽐如:修改了全局变量、修改了传⼊的参数、甚⾄是console.log(),所以 ajax 操作,修改 dom 都是算作副作⽤。
异步数据获取,更新HooksTest.js
import { useEffect } from ‘react’
useEffect(() => {
setTimeout(() => {
setFruits([‘⾹蕉’, ‘⻄⽠’])
}, 1000)
})
测试会发现副作⽤操作会被频繁调⽤
设置依赖
// 设置空数组意为没有依赖,则副作⽤操作仅执⾏⼀次
useEffect(()=>{…}, [])
如果副作⽤操作对某状态有依赖,务必添加依赖选项
useEffect(() => {
document.title = fruit
}, [fruit])
清除⼯作:有⼀些副作⽤是需要清除的,清除⼯作⾮常重要的,可以防⽌引起内存泄露
useEffect(() => {
const timer = setInterval(() => {
console.log(‘msg’)
}, 1000)
return function () {
clearInterval(timer)
}
}, [])
组件卸载后会执⾏返回的清理函数
Hooks之useReducer
useReducer:useReducer是useState的可选项,常⽤于组件有复杂状态逻辑时,类似于redux中reducer概念。
商品列表状态维护
import React, { useReducer, useEffect } from ‘react’
import { FruitList, FruitAdd } from ‘./Fruit’
function fruitReducer(state, action) {
switch (action.type) {
case ‘init’:
case ‘replace’:
return action.payload
case ‘add’:
return […state, action.payload]
default:
return state
}
}
export default function HookReducer() {
const [fruits, dispatch] = useReducer(fruitReducer, [])
useEffect(() => {
setTimeout(() => {
dispatch({ type: ‘init’, payload: [‘apple’, ‘banana’] })
}, 1000)
}, [])
return (
User ⻚⾯
<FruitAdd
onAdd={(item) => dispatch({ type: ‘add’, payload: item })}
/>
<FruitList
fruits={fruits}
onSetFruits={(cur) =>
dispatch({ type: ‘replace’, payload: cur })
}
/>
)
}
Fruit.js
import React, { useState } from ‘react’
export function FruitList({ fruits, onSetFruits }) {
const delCur = (delIndex) => {
const tem = […fruits]
tem.splice(delIndex, 1)
onSetFruits(tem)
}
return (
<>
点击下⾯⽔果删除当前
{fruits.map((item, index) => {
return (
{item}
)
})}
</>
)
}
export function FruitAdd(props) {
const [name, setName] = useState(‘’)
return (
增加⽔果
<input
type=“text”
value={name}
onChange={(e) => setName(e.target.value)}
/>
<button onClick={() => props.onAdd(name)}>add
)
}
Hooks之useContext
useContext⽤于在快速在函数组件中导⼊上下⽂
import React, { useContext } from ‘react’
const Context = React.createContext()
const Provider = Context.Provider
export default function HookContext() {
const store = {
userName: ‘xiaoming’,
}
return (
HookContext ⻚⾯
)
}
function Child(props) {
const { userName } = useContext(Context)
return (
Child
)
}
Hook相关拓展
第三⽅库
// antd-pro安装:
yarn create umi
// 选择 ant-design-pro
npm install
npm start
React组件化大纲
-
课堂⽬标
-
知识要点
-
资源
-
起步
-
快速开始
-
组件跨层级通信 - Context
-
使⽤Context
-
组件复合-Composition
-
基本使⽤
-
⾼阶组件-HOC
-
基本使⽤
-
链式调⽤
-
装饰器写法
最后
前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
{
const { userName } = useContext(Context)
return (
Child
)
}
Hook相关拓展
第三⽅库
// antd-pro安装:
yarn create umi
// 选择 ant-design-pro
npm install
npm start
React组件化大纲
-
课堂⽬标
-
知识要点
-
资源
-
起步
-
快速开始
-
组件跨层级通信 - Context
-
使⽤Context
-
组件复合-Composition
-
基本使⽤
-
⾼阶组件-HOC
-
基本使⽤
-
链式调⽤
-
装饰器写法
最后
前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档
[外链图片转存中…(img-fNIh2z9h-1713276555820)]
[外链图片转存中…(img-MLgDRyYa-1713276555820)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-sAZyJh8R-1713276555821)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!