先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
/*
从JSX中抽离事件处理程序
*/
class App extends React.Component {
state = {
count: 0
}
// 事件处理程序
onIncrement() {
console.log(‘事件处理程序中的this:’, this)
this.setState({
count: this.state.count + 1
})
}
render() {
return (
计数器:{this.state.count}
+1
{/* <button onClick={() => {
this.setState({
count: this.state.count + 1
})
}}>+1 */}
)
}
}
// 渲染组件
ReactDOM.render(, document.getElementById(‘root’))
- 原因:事件处理程序中 this 的值为
undefined
,在JSX中我们写的事件处理函数可以找到this,原因在于在JSX中我们利用箭头函数,箭头函数是不会绑定this,所以会向外一层去寻找,外层是render方法,在render方法里面的this刚好指向的是当前实例对象;
(6)事件绑定 this 指向
6.1 箭头函数
-
利用箭头函数自身不绑定this的特点
-
render() 方法中的 this 为组件实例,可以获取到 setState()
完整代码演示如下:
import React from ‘react’
import ReactDOM from ‘react-dom’
/*
从JSX中抽离事件处理程序
*/
class App extends React.Component {
state = {
count: 0
}
// 事件处理程序
onIncrement() {
console.log(‘事件处理程序中的this:’, this)
this.setState({
count: this.state.count + 1
})
}
render() {
return (
计数器:{this.state.count}
<button onClick={() => this.onIncrement()}>+1
{/* +1 */}
)
}
}
// 渲染组件
ReactDOM.render(, document.getElementById(‘root’))
6.2 Function.prototype.bind()
利用原型bind方法是可以更改函数里面this的指向的,所以我们可以在构造中调用bind方法,然后把返回的值赋值给我们的函数即可。
完整代码演示如下:
import React from ‘react’
import ReactDOM from ‘react-dom’
/*
从JSX中抽离事件处理程序
*/
class App extends React.Component {
constructor() {
super()
this.state = {
count: 0
}
// 通过bind方法改变了当前函数中this的指向
this.onIncrement = this.onIncrement.bind(this)
}
// 事件处理程序
onIncrement() {
console.log(‘事件处理程序中的this:’, this)
this.setState({
count: this.state.count + 1
})
}
render() {
return (
计数器:{this.state.count}
+1
)
}
}
// 渲染组件
ReactDOM.render(, document.getElementById(‘root’))
6.3 class 的实例方法
-
利用箭头函数形式的class实例方法
-
注意:该语法是实验性语法,但是,由于babel的存在可以使用
完整代码演示如下:
import React from ‘react’
import ReactDOM from ‘react-dom’
/*
从JSX中抽离事件处理程序
*/
class App extends React.Component {
state = {
count: 0
}
// 事件处理程序
onIncrement = () => {
console.log(‘事件处理程序中的this:’, this)
this.setState({
count: this.state.count + 1
})
}
render() {
return (
计数器:{this.state.count}
+1
)
}
}
// 渲染组件
ReactDOM.render(, document.getElementById(‘root’))
(7)表单处理
7.1 受控组件
-
HTML中的表单元素是可输入的,也就是有自己的可变状态;
-
而React中可变状态通常保存在state中,并且只能通过
setState()
方法来修改; -
React讲state与表单元素值value绑定在一起,由state的值来控制表单元素的值;
-
受控组件:值受到react控制的表单元素;
步骤及示例代码演示如下:
-
在 state 中添加一个状态,作为表单元素的value值(控制表单元素值的来源);
-
给表单元素绑定 change 事件,将 表单元素的值 设置为 state 的值(控制表单元素值的变化);
import React from ‘react’
import ReactDOM from ‘react-dom’
/*
受控组件:其值受到React控制的表单元素
操作文本框的值:
*/
class App extends React.Component {
state = {
txt: ‘’
}
handleChange = e => {
this.setState({
txt: e.target.value
})
}
render() {
return (
/* 把state的值设置给输入框的value,绑定change事件,这样用户在输入内容的时候
调用相应函数,在函数里面把当前设置的值赋值给state,从而达到数据的统一 */
)
}
}
// 渲染组件
ReactDOM.render(, document.getElementById(‘root’))
7.1.1 受控组件示例
文本框、富文本框、下拉框、复选框
完整代码演示如下:
import React from ‘react’
import ReactDOM from ‘react-dom’
/*
受控组件示例
*/
class App extends React.Component {
state = {
txt: ‘’,
content: ‘’,
city: ‘bj’,
isChecked: false
}
handleChange = e => {
this.setState({
txt: e.target.value
})
}
// 处理富文本框的变化
handleContent = e => {
this.setState({
content: e.target.value
})
}
// 处理下拉框的变化
handleCity = e => {
this.setState({
city: e.target.value
})
}
// 处理复选框的变化
handleChecked = e => {
this.setState({
isChecked: e.target.checked
})
}
render() {
return (
{/* 文本框 */}
{/* 富文本框 */}
{/* 下拉框 */}
上海 北京 广州{/* 复选框 */}
)
}
}
// 渲染组件
ReactDOM.render(, document.getElementById(‘root’))
7.1.2 多表单元素优化
多表单元素优化:
-
问题:每个表单元素都有一个单独的事件处理程序处理太繁琐;
-
优化:使用一个事件处理程序同时处理多个表单元素;
多表单元素优化步骤:
-
给表单元素添加name属性,名称与 state 相同;
-
根据表单元素类型获取对应值;
-
在 change 事件处理程序中通过 [name] 来修改对应的state;
完整代码演示如下:
import React from ‘react’
import ReactDOM from ‘react-dom’
/*
受控组件示例
*/
class App extends React.Component {
state = {
txt: ‘’,
content: ‘’,
city: ‘bj’,
isChecked: false
}
handleForm = e => {
// 获取当前DOM对象
const target = e.target
// 根据类型获取值
const value = target.type === ‘checkbox’
-
? target.checked
- target.value
// 获取name
const name = target.name
this.setState({
})
}
render() {
return (
{/* 文本框 */}
{/* 富文本框 */}
{/* 下拉框 */}
上海 北京 广州{/* 复选框 */}
)
}
}
// 渲染组件
ReactDOM.render(, document.getElementById(‘root’))
7.2 非受控组件(了解即可)
-
说明:借助于ref,使用元素DOM方式获取表单元素值
-
ref的作用:获取DOM或者组件
使用步骤:
-
调用
React.createRef()
方法创建ref对象; -
将创建好的 ref 对象添加到文本框中;
-
通过ref对象获取到文本框的值;
完整代码演示如下:
import React from ‘react’
import ReactDOM from ‘react-dom’
/*
非受控组件:
*/
class App extends React.Component {
constructor() {
super()
// 1.调用 React.createRef() 方法创建一个 ref 对象
this.txtRef = React.createRef()
}
// 3. 通过 ref 对象获取到文本框的值
getTxt = () => {
console.log(‘文本框值为:’, this.txtRef.current.value);
}
render() {
return (
// 2.将创建好的 ref 对象添加到文本框中
获取文本框的值
)
}
}
// 渲染组件
ReactDOM.render(, document.getElementById(‘root’))
(8)案例分析:评论列表
需求分析:
-
渲染评论列表(列表渲染);
-
没有评论数据时渲染:暂无评论(条件渲染);
-
获取评论信息,包括评论人和评论内容(受控组件);
-
发表评论,更新评论列表(setState());
实现步骤:
1️⃣ 渲染评论列表
-
在 state 中初始化评论列表数据;
-
使用数组的map方法遍历state中的列表数据;
-
给每个被遍历的li元素添加key属性;
2️⃣ 渲染暂无评论
-
判断列表数据的长度是否为0;
-
如果为0,则渲染暂无评论;
3️⃣ 获取评论信息
- 使用受控组件方式处理表单元素;
4️⃣ 发表评论
-
给按钮绑定单击事件;
-
在事件处理程序中,通过state获取评论信息;
-
将评论信息添加到state中,并调用 setState() 方法更新state;
-
边界情况:清空文本框;
-
边界情况:非空判断;
完整代码演示如下:
/* index.css */
.app {
width: 300px;
padding: 10px;
border: 1px solid #999;
}
.user {
width: 100%;
box-sizing: border-box;
margin-bottom: 10px;
}
.content {
width: 100%;
box-sizing: border-box;
margin-bottom: 10px;
}
.no-comment {
text-align: center;
margin-top: 30px;
}
// index.js
import React from ‘react’
import ReactDOM from ‘react-dom’
/*
评论列表案例
*/
import ‘./index.css’
class App extends React.Component {
// 初始化状态
state = {
comments: [
{ id: 1, name: ‘jack’, content: ‘必须支持一波’ },
{ id: 2, name: ‘rose’, content: ‘我又偷偷的过来啦’ },
{ id: 3, name: ‘tom’, content: ‘感谢博主的日常分享’ }
],
// 评论人
userName: ‘’,
// 评论内容:
userContent: ‘’
}
// 渲染评论列表:
renderList() {
const { comments } = this.state
if (comments.length === 0) {
return
}
return (
{comments.map(item => (
评论人:{item.name}
评论内容:{item.content}
))}
)
}
// 处理表单元素值
handleForm = e => {
const { name, value } = e.target
this.setState({
})
}
// 发表评论:
addComment = () => {
const { comments, userName, userContent } = this.state
// 非空校验
if (userName.trim() === ‘’ || userContent.trim() === ‘’) {
alert(‘请输入评论人和评论内容’)
return
}
// 将评论信息添加到state中
const newComments = [
{
id: Math.random(),
name: userName,
content: userContent
},
…comments
]
// 文本框的值如何清空? 要清空文本框只需要将其对应的state清空即可
this.setState({
comments: newComments,
userName: ‘’,
userContent: ‘’
})
}
render() {
const { userName, userContent } = this.state
return (
<input
className=“user”
type=“text”
placeholder=“请输入评论人”
value={userName}
name=“userName”
onChange={this.handleForm}
/>
发表评论 {/* 通过条件渲染决定渲染什么内容: */} {this.renderList()} ### 刷面试题 刷题的重要性,不用多说。对于应届生或工作年限不长的人来说,刷面试题一方面能够尽可能地快速自己对某个技术点的理解,另一方面在面试时,有一定几率被问到相同或相似题,另外或多或少也能够为自己面试增加一些自信心,可见适当的刷题是很有必要的。 * **前端字节跳动真题解析** ![](https://img-blog.csdnimg.cn/img_convert/8d27500df7b25342f252bca635ca0ab3.png) * **【269页】前端大厂面试题宝典** ![](https://img-blog.csdnimg.cn/img_convert/eac3322374bd31596de9bf548f6ce47f.png) 最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。 **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。** **需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)** ![img](https://img-blog.csdnimg.cn/img_convert/786eba44fd014cf774abd09e370dffdd.png) **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!** userContent: '' }) } render() { const { userName, userContent } = this.state return (
发表评论