【React入门必备知识篇02】--- React 组件基础,2024年最新我想谈谈关于前端面试那些事

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

【React入门必备知识篇02】— React 组件基础

    • 一、React 组件基础
    • (1)React 组件介绍
  • (2)React 组件的两种创建方式

    • 2.1 使用函数创建组件
  • 2.2 使用类创建组件

  • 2.3 抽离为独立 JS 文件

  • (3)React 事件处理

    • 3.1 事件绑定
  • 3.2 事件对象

  • (4)有状态组件和无状态组件

  • (5)组件中的 state 和 setState()

    • 5.1 state的基本使用
  • 5.2 setState()修改状态

  • 5.3 从 JSX 中抽离事件处理程序

  • (6)事件绑定 this 指向

    • 6.1 箭头函数
  • 6.2 Function.prototype.bind()

  • 6.3 class 的实例方法

  • (7)表单处理

    • 7.1 受控组件
    • 7.1.1 受控组件示例
  • 7.1.2 多表单元素优化

  • 7.2 非受控组件(了解即可)

  • (8)案例分析:评论列表

  • 二、总结

一、React 组件基础


(1)React 组件介绍

  • 组件是 React 的一等公民,使用 React 就是在用组件;

  • 组件表示页面中的部分功能;

  • 组合多个组件实现完整的页面功能;

  • 特点:可复用、独立、可组合;


(2)React 组件的两种创建方式

2.1 使用函数创建组件
  • 函数组件:使用JS的函数创建组件;

  • 约定1:函数名称必须以大写字母开头React 据此区分 组件 和 普通的React 元素;

  • 约定2:函数组件必须有返回值,表示该组件的结构;

  • 如果返回值为null,表示不渲染任何内容;

代码演示如下:

/*

函数组件:

*/

// 渲染结构:

function Hello() {

return (

这是我的第一个函数组件

)

}

// 不渲染结构:

function Hello() {

return null

}

// 使用箭头函数创建组件:

const Hello = () =>

这是我的第一个函数组件

  • 渲染函数组件:用函数名作为组件标签名;

  • 组件标签可以是单标签也可以是双标签;

代码演示如下:

// 渲染结构:

function Hello() {

return (

这是我的第一个函数组件

)

}

// 渲染组件

ReactDOM.render(, document.getElementById(‘root’))

2.2 使用类创建组件
  • 使用ES6语法的class创建的组件;

  • 约定1:类名称也必须要大写字母开头

  • 约定2:类组件应该继承React.Component父类,从而可以使用父类中提供的方法或者属性;

  • 约定3:类组件必须提供 render() 方法;

  • 约定4:render() 方法必须有返回值,表示该组件的结构;

完整代码演示如下:

import React from ‘react’

import ReactDOM from ‘react-dom’

/*

类组件:

*/

// 创建类组件

class Hello extends React.Component {

render() {

return (

这是我的第一个类组件

)

}

}

// 渲染组件

ReactDOM.render(, document.getElementById(‘root’))

2.3 抽离为独立 JS 文件
  • 思考:项目中组件多了之后,该如何组织这些组件?

  • 选择一:将所有的组件放在同一个JS文件中

  • 选择二:将每个组件放到单独的JS文件中

  • 组件作为一个独立的个体,一般都会放到一个单独的JS文件中

步骤及示例代码演示如下:

  1. 创建Hello.js

  2. 在 Hello.js 中导入React

  3. 创建组件(函数 或 类)

  4. 在 Hello.js 中导出该组件

  5. 在 index.js 中导入 Hello 组件

  6. 渲染组件

完整代码演示如下:

// Hello.js

import React from ‘react’

// 创建组件

class Hello extends React.Component {

render() {

return (

这是我的第一个抽离到js文件中的组件

)

}

}

// 导出组件

export default Hello

完整代码演示如下:

import React from ‘react’

import ReactDOM from ‘react-dom’

/*

抽离组件到独立的JS文件中

*/

// 导入Hello组件

import Hello from ‘./Hello’

// 渲染组件

ReactDOM.render(, document.getElementById(‘root’))


(3)React 事件处理

3.1 事件绑定
  • React事件绑定语法与DOM事件语法相似

  • 语法:on+事件名称={事件处理程序},比如 onClick = function(){}

  • 注意:React事件采用驼峰命名法,比如:onMouseEnter、onFocus

完整代码演示如下:

import React from ‘react’

import ReactDOM from ‘react-dom’

/*

React事件处理

*/

class App extends React.Component {

// 事件处理程序

handleClick() {

console.log(‘单击事件触发了’)

}

render() {

return (

点我,点我

)

}

}

// 渲染组件

ReactDOM.render(, document.getElementById(‘root’))

完整代码演示如下:

import React from ‘react’

import ReactDOM from ‘react-dom’

/*

React事件处理

*/

// 通过函数组件绑定事件:

function App() {

// 事件处理程序

function handleClick() {

console.log(‘函数组件中的事件绑定,事件触发了’)

}

return (

点我

)

}

// 渲染组件

ReactDOM.render(, document.getElementById(‘root’))

3.2 事件对象
  • 可以通过事件处理函数的参数获取到事件对象;

  • React中的事件对象叫做:合成事件;

  • 合成事件:兼容所有浏览器,无需担心跨浏览器兼容问题;

  • 除兼容所有浏览器外,它还拥有和浏览器原生事件相同的接口,包括 stopPropagation()preventDefault()

  • 如果你想获取到原生事件对象,可以通过 nativeEvent 属性来进行获取;

完整代码演示如下:

import React from ‘react’

import ReactDOM from ‘react-dom’

/*

React事件对象

*/

class App extends React.Component {

handleClick(e) {

// 阻止浏览器的默认行为

e.preventDefault()

console.log(‘a标签的单击事件触发了’)

}

render() {

return (

我的博客

)

}

}

// 渲染组件

ReactDOM.render(, document.getElementById(‘root’))


(4)有状态组件和无状态组件

  • 函数组件又叫做 无状态组件,类组件又叫做 有状态组件;

  • 状态(state) 即数据;

  • 函数组件没有自己的状态,只负责数据展示;

  • 类组件有自己的状态,负责更新UI,让页面动起来;

比如计数器案例中,点击按钮让数值加 1 。0 和 1 就是不同时刻的状态,而由 0 变为 1 就表示状态发生了变化。状态变化后,UI 也要相应的更新。React 中想要实现该功能,就要使用有状态组件来完成。


(5)组件中的 state 和 setState()

5.1 state的基本使用
  • 状态(state)即数据,是组件内部的私有数据,只能在组件内部使用;

  • state的值是对象,表示一个组件中可以有多个数据;

  • 通过this.state来获取状态;

完整代码演示如下:

import React from ‘react’

import ReactDOM from ‘react-dom’

/*

state的基本使用

*/

class App extends React.Component {

/* constructor() {

super()

// 初始化state

this.state = {

count: 0

}

} */

// 简化语法初始化state(推荐)

state = {

count: 10

}

render() {

return (

计数器:{this.state.count}

)

}

}

// 渲染组件

ReactDOM.render(, document.getElementById(‘root’))

5.2 setState()修改状态
  • 状态是可变的;

  • 语法:this.setState({要修改的数据})

  • 注意:不要直接修改state中的值,这是错误的;

  • setState() 作用:1.修改 state 2.更新UI;

  • 思想:数据驱动视图;

完整代码演示如下:

import React from ‘react’

import ReactDOM from ‘react-dom’

/*

state的基本使用

*/

class App extends React.Component {

state = {

count: 0

}

render() {

return (

计数器:{this.state.count}

<button onClick={() => {

this.setState({

count: this.state.count + 1

})

// 错误!!!

// this.state.count += 1

}}>+1

)

}

}

// 渲染组件

ReactDOM.render(, document.getElementById(‘root’))

5.3 从 JSX 中抽离事件处理程序
  • JSX 中掺杂过多 JS 逻辑代码,会显得非常混乱;

  • 推荐:将逻辑抽离到单独的方法中,保证 JSX 结构清晰;

完整代码演示如下:

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

{/* <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控制的表单元素;

步骤及示例代码演示如下:

  1. 在 state 中添加一个状态,作为表单元素的value值(控制表单元素值的来源);

  2. 给表单元素绑定 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’))

前端资料汇总

我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。

更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ge 事件,将 表单元素的值 设置为 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’))

前端资料汇总

我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。

更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-RZDgQKh1-1713213761296)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值