从0到1教你学会 react

width: 100,

height: 100,

backgroundColor: ‘green’,

“:hover”: {

backgroundColor: ‘yellow’

},

“@media (max-width: 1000px)”: {

width: 300

}

}

function App() {

return

样式处理2

}

export default Radium(App);

import React from ‘react’;

import ReactDOM from ‘react-dom’;

import App from ‘./App’;

import {StyleRoot} from ‘radium’

ReactDOM.render(

<React.StrictMode>

</React.StrictMode>,

document.getElementById(‘root’)

);

  1. 案例

import Radium from ‘radium’

const ButtonStyle = {

base: {

width: 150,

height: 40,

fontSize: 20,

background: ‘#ffff’

},

login: {

background: ‘green’

},

logout: {

background: ‘orange’

}

}

const isLogin = false

function App() {

return

<button style={[

ButtonStyle.base,

isLogin ? ButtonStyle.login : ButtonStyle.logout

]}>按钮

}

export default Radium(App);

JSX 添加外联样式


  1. 全局外联样式

  2. 所有组件当中都可以直接进行使用

  3. 再添加 class 时,需要使用 className

// App.js

function App() {

return <div className={‘box’}>

外联样式

}

export default App;

// Test,js

import React from ‘react’

function Test () {

return <div className={‘box’}>Test.js

}

export default Test

// index.js

import React from ‘react’;

import ReactDOM from ‘react-dom’;

import App from ‘./App’;

import Test from ‘./test’

import ‘./style.css’

ReactDOM.render(

<React.StrictMode>

</React.StrictMode>,

document.getElementById(‘root’)

);

  1. 组件级别的外联样式

  2. 只有某一个组件可以进行使用

  3. 组件名.module.css

// Test.module.css

.item {

background-color: red;

width: 200px;

height: 200px;

}

// test.js

import React from ‘react’

import style from ‘./Test.module.css’

function Test () {

return (

Test.js

这里使用了自己的样式

)

}

export default Test

  1. 借助第三方工具在 JS 中编写 CSS

  2. (CSS-IN-JS)

  3. npm i styled-components

import React from ‘react’

import style from ‘./Test.module.css’

import styled from ‘styled-components’

// 自定义标签

const SectionDiv = styled.div.attrs({

className: ‘box1 box2’

})`

width: 100px;

height: 100px;

background-color: pink;

`

function Test () {

return (

Test.js

这里使用了自己的样式

)

}

export default Test

组件的创建

===============================================================

创建函数式组件


function App() {

return

我就是函数式组件

}

export default App;

创建类式组件


  1. 必须继承 Compnent

  2. 必须实例化 render

  3. 组件名称首字母必须大写,在 React 中可以用于区分组件和普通的标记

import React, {Component} from ‘react’

class About extends Component {

render () {

return (

我是类式组件

)

}

}

export default About

  1. 必须有且只能有一个根元素,同时支持占位符(两种方式)

import React, {Component, Fragment} from ‘react’

class About extends Component {

render () {

return (

// 方式一

我是类式组件

// 方式二

<>我是类式组件</>

)

}

}

export default About

组件传参

==============================================================

函数式组件传参


在函数组件内可以接到外部的数据,内部直接访问即可

import About from ‘./About’

function App() {

return

<About name={‘GD’} age={100}/>

}

export default App;

// About.js

import React from ‘react’

function About(props) {

console.log(props);

return (

{props.a}

{props.b}

)

}

export default About

import About from ‘./About’

const obj = {

name: ‘rookie’,

age: 18

}

function App() {

return

<About {…obj}/>

}

export default App;

// About.js

import React from ‘react’

function About({name, age}) {

return (

{name}

{age}

)

}

export default About

类式组件传参


类式组件内部的内部存在一个 props属性,外部传递的数据都放在这里保存,我们可以直接进行使用

import Header from ‘./Header’

function App() {

return

}

export default App;

// Header.js

import React, { Component } from ‘react’

class Header extends Component {

render() {

return (

{this.props.name}

{this.props.age}

)

}

}

export default Header

import About from ‘./About’

const obj = {

name: ‘rookie’,

age: 18

}

function App() {

return

}

export default App;

// Header.js

import React, { Component } from ‘react’

class Header extends Component {

render() {

const {name, age} = this.props

return (

{name}

{age}

)

}

}

export default Header

组件设置默认值及类型校验


  1. 针对于函数组件来说,如果想要设置默认的 props 属性值,则直接通过 组件名称.defaultProps 来设置一个对象

  2. 针对于类组件来说,我们可以直接定义 static defaultProps 来管理需要设置默认值的属性即可

为什么要对 props 中的属性进行校验

JS 本身是弱类型语言,它里边的参数或者方法,在定义形参的时候我们没有办法直接对类型进行设置,这时候对于我们的使用来说有利有弊,比如说我这里的参数需要接受一个 number 类型的,但是传入的却是 string 类型的,那么一定会影响后续逻辑代码的实现,所以需要类型校验

import About from ‘./About’

function App() {

return

}

export default App;

// App.js

import React from ‘react’

import PropTypes from “prop-types”;

function About({name, age}) {

return (

{name}

{age}

)

}

About.defaultProps = {

name: 111,

age: 188

}

About.propTypes = {

name: PropTypes.string

}

export default About

函数式组件设置默认值

import About from ‘./About’

function App() {

return

}

export default App;

// About.js

import React from ‘react’

function About({name, age}) {

return (

{name}

{age}

)

}

About.defaultProps = {

name: ‘dgd’,

age: 188

}

export default About

类式组件设置默认值

import Header from ‘./Header’

const obj = {

name: ‘rookie’,

age: 18

function App() {

return

}

export default App;

// Header.js

import React, { Component } from ‘react’

class Header extends Component {

static defaultProps = {

name: ‘拉勾’,

age: 3

}

render() {

const {name, age} = this.props

return (

{name}

{age}

)

}

}

export default Header

向组件传递 JSX


类组件传递 JSX

import Header from ‘./Header’

function App() {

return

Header 中的 P 标签

}

export default App;

// Header.js

import React, { Component } from ‘react’

class Header extends Component {

render() {

return (

{this.props.children}

)

}

}

export default Header

函数组件传递 JSX

import About from ‘./About’

function App() {

return

About 中的 P 标签

}

export default App;

// About.js

import React from ‘react’

function About(props) {

return (

{props.children}

)

}

export default About

组件布局实例

================================================================

预期结构图

在这里插入图片描述

  • header.js

function Header() {

return (<div className={“header”}>Header组件)

}

export default Header

  • home.js | list.js

// home.js

import Layout from ‘./Layout’

function Home() {

return (

当前是 Home 页面

)

}

export default Home

// list.js

import Layout from ‘./Layout’

function List() {

return (

当前是 List 页面

)

}

export default List

  • footer.js

function Footer() {

return (<div className={“footer”}>Footer组件)

}

export default Footer

  • layout.js

/**

  • 当前组件作用就是将 header 与 footer 显示出来,同时中的 main 内容空出来

  • 将来我们传入什么样的 JSX 那么就显示什么样的 DOM

*/

import Header from ‘./Header’

import Footer from ‘./Footer’

function Layout(props) {

return(<>

{props.children}

</>)

}

export default Layout

  • App.js

import Home from ‘./components/Home’

import List from ‘./components/List’

function App() {

return ()

}

export default App;

  • style.css

html, body {

height: 100%;

}

body {

margin: 0;

padding: 0;

}

.header, .footer {

width: 100%;

height: 80px;

position: absolute;

left: 0;

line-height: 80px;

text-align: center;

font-size: 18px;

color: #fff;

}

.header {

background-color: skyblue;

top: 0;

}

.footer {

background-color: purple;

bottom: 0;

}

.main {

width: 100%;

position: absolute;

top: 80px;

bottom: 80px;

padding: 20px 0;

text-align: center;

background: khaki;

}

  • 案例效果

在这里插入图片描述

组件状态

==============================================================

  • 组件状态

  • 状态就是数据,因此组件状态指的就是某一个组件自己的数据

  • 数据驱动 DOM

  • 当我们修改某一个数据的时候,界面上的 DOM 中数据展示也会自动更新

  • 组件状态管理

import React, {Component} from ‘react’

class Header extends Component {

// 在类组件当中默认就存在一个 state 属性,他是一个对象,可以用于保存当前组件的数据

// 还可以通过 setState 方法来修改数据的值,最后修改之后的状态会自动展示在 DOM 上

state = {

name: ‘xgd’,

age: 18

}

handler = () => {

// 在 react 当中是不能够直接来修改 state 值得

this.setState({

name: ‘xxxgd’

})

}

render () {

return (<>

{this.state.name}

{this.state.age}

点击更改

</>)

}

}

export default Header

setState 使用细节


setState 是异步函数

  • 使用 async…await 解决

  • 调用 setState 的时候可以传入回调函数,在它里边就可以使用修改之后的数据

// 方法1

class Header extends Component {

state = {

name: ‘xgd’,

age: 18

}

handler = async () => {

await this.setState({

name: ‘xxxgd’

})

console.log(this.state.name)

}

}

// 方法2

class Header extends Component {

state = {

name: ‘xgd’,

age: 18

}

handler = () => {

this.setState({

name: ‘xxxgd’

}, () => {

console.log(this.state.name, 222)

})

console.log(this.state.name, 111)

}

}

setState 在使用的时候除了可以传入对象之外还能够传入一个函数

class Header extends Component {

state = {

count: 0

}

handler = () => {

this.setState((state)=> ({

count: state.count + 1

}))

}

render () {

return (<>

{this.state.count}

点击更改

</>)

}

}

setState 在使用的时候既可以传入函数,也可以传入对象,且两者具有不同点的

  • 传入对象时,从性能的角度考虑,自己会在内部做出一个合并,所以在使用的时候需要注意

  • 传入函数时,会依次执行,推荐使用

组件中的 this


在组件中直接使用 this 会报 undefined,可以通过箭头函数或事件触发时书写箭头函数传值或 bind 方法传值来解决

import React, {Component} from ‘react’

class Header extends Component {

handler = function() {

console.log(this);

}

render () {

return (

{this.state.count}

点击更改 undefined

<button onClick={() => {this.handler()}}>点击更改 正常

点击更改 正常

)

}

}

export default Header

单向数据流


什么是单向数据流

单项数据流的设计原则要求我们将不同组件之间共享的数据都定义在上层

import C1 from ‘./c1’

import React, { Component } from ‘react’

class App extends Component {

// 在类组件当中更可以使用 state 定义状态

state = {

name: ‘gd’,

age: 40

}

render() {

return (<>

<C1 {…this.state}/>

</>)

}

}

export default App;

// C2.js

import React from ‘react’

import C2 from ‘./c2’

function C1(props) {

console.log(props)

return (<>

C1 组件

<C2 {…props}/>

</>)

}

export default C1

单向数据流如何修改

import C1 from ‘./c1’

import React, { Component } from ‘react’

class App extends Component {

// 在类组件当中更可以使用 state 定义状态

state = {

name: ‘gd’,

age: 40

}

// 定义状态的更新方法,当前只负责定义,在想要修改数据的地方进行调用

// handler = (target) => {

// this.setState({

// name: target.name,

// age: target.age

// })

// }

// handler 可以通过解构赋值简化操作

handler = ({name, age}) => {

this.setState({ name, age })

}

render() {

return (<>

<C1 {…this.state} change={this.handler}/>

</>)

}

}

export default App;

// C1.js

import React from ‘react’

import C2 from ‘./c2’

function C1(props) {

console.log(props)

return (<>

{props.name}

{props.age}

C1 组件

<C2 {…props}/>

<button onClick={() => {props.change({name: ‘修改了’, age: 188888})}}>点击更改

</>)

}

export default C1

特点

  1. 单向数据流,自顶向下,从父到子

  2. 基于单向数据流动,要求我们将共享的数据定义在上层组件中

  3. 子组件通过调用父组件传递过来的方法可以更改数据

  4. 当数据发生更改之后,React 会重新渲染组件树

受控表单

==============================================================

  • 受控表单:

  • 表单元素的值全部由 React 来进行管理,此时表单元素中的值都放在 state 中,所以表单元素里的值,也需要从 state 当中进行获取

  • 非受控表单:

  • 不受 react 管理,表单元素的数据由 DOM 元素本身来进行管理,表单元素的值也是存放在 DOM 元素里,获取的时候需要操作 DOM 元素

受控表单绑定与更新


  • 将 state 中的状态与表单的 value 值进行绑定 value={this.state.xxxx}

  • 如何更新状态值 onChange={方法} ev.target.value

  • ev.target.name === [prop]: this.setState({})

  • 只绑定了值,但是没有修改方法时提示的警告处理

  • readOnly(设置为只读属性)

  • defaultValue(只是想要拿到 state 里边的状态)

import React, { Component } from ‘react’

class App extends Component {

state = {

name: ‘gd’,

age: 18

}

// 定义方法用于处理状态里数据值的修改

handler = (ev) => {

let prop = ev.target.name

this.setState({

})

}

render() {

return (<>

</>)

}

}

export default App;

受控表单之下拉菜单


import React, { Component } from ‘react’

class App extends Component {

state = {

subject: ‘java’

}

render() {

return (<>

<select value={this.state.subject} onChange={(ev)=>{this.setState({subject: ev.target.value})}}>

JS java python

<button onClick={()=>{console.log(this.state)}}>点击打印

</>)

}

}

export default App;

受控表单之单选框


import React, { Component } from ‘react’

class App extends Component {

state = {

sex: ‘女’

}

render() {

return (<>

<input

type=“radio”

name=“sex”

value=“男”

defaultChecked={this.state.sex == ‘男’}

onChange={(ev)=>{this.setState({sex: ev.target.value})}}

/>男

<input

type=“radio”

name=“sex”

value=“女”

defaultChecked={this.state.sex == ‘女’}

onChange={(ev)=>{this.setState({sex: ev.target.value})}}

/>女

<button

onClick={()=>{console.log(this.state);}}

点击更改

</>)

}

}

export default App;

受控表单之复选框


import React, { Component } from ‘react’

class App extends Component {

// 定义状态

state = {

name: ‘gd’,

age: 18

}

hobbies = [

{

id: 1,

title: ‘Vue’,

isChecked: true

},

{

id: 2,

title: ‘React’,

isChecked: false

},

{

id: 3,

title: ‘Angular’,

isChecked: false

}

]

handler (index, ev) {

this.hobbies[index].isChecked = ev.target.checked

}

submit = (ev)=> {

ev.preventDefault()

let ret = this.hobbies

.filter(hobby => hobby.isChecked)

.map(hobby => hobby.id)

ret = {

…this.state, ret

}

console.log(ret)

}

render() {

return (<>

{this.submit(ev)}}>

{

this.hobbies.map((hobby, index) => {

return (

<input type=“checkbox” defaultChecked={hobby.isChecked} onChange={this.handler.bind(this, index)} /> {hobby.title}

)

})

}


<button onClick={()=>{console.log(this.hobbies)}}>点击获取

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

img

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)


完整版面试题资料免费分享,只需你点赞支持,动动手指点击此处就可免费领取了

前端实习面试的套路


回顾项目

往往在面试时,面试官根据你简历中的项目由点及面地展开问答,所以请对你做过的最好的项目进行回顾和反思。回顾你做过的工作和项目中最复杂的部分,反思你是如何完成这个最复杂的部分的。

面试官会重点问你最复杂的部分的实现方法和如何优化。重点要思考如何优化,即使你项目中没有对那部分进行优化,你也应该预先思考有什么优化的方案。如果这部分答好了,会给面试官留下很不错的印象。

重点在于基础知识

这里指的基础知识包括:前端基础知识和学科基础知识。

前端基础知识:html/css/js 的核心知识,其中 js 的核心知识尤为重要。比如执行上下文、变量对象/活动对象(VO/AO)、作用域链、this 指向、原型链等。

学科基础知识:数据结构、计算机网络、算法等知识。你可能会想前端不需要算法,那你可能就错了,在大公司面试,面试官同样会看重学生这些学科基础知识。
你可能发现了我没有提到React/Vue这些框架的知识,这里得说一说,大公司不会过度的关注这方面框架的知识,他们往往更加考察学生的基础。
这里我的建议是,如果你至少使用或掌握其中一门框架,那是最好的,可以去刷刷相关框架的面试题,这样在面试过程中即使被问到了,也可以回答个 7788。如果你没有使用过框架,那也不需要太担心,把重点放在基础知识和学科基础知识之上,有其余精力的话可以去看看主流框架的核心思想。

.isChecked = ev.target.checked

}

submit = (ev)=> {

ev.preventDefault()

let ret = this.hobbies

.filter(hobby => hobby.isChecked)

.map(hobby => hobby.id)

ret = {

…this.state, ret

}

console.log(ret)

}

render() {

return (<>

{this.submit(ev)}}>

{

this.hobbies.map((hobby, index) => {

return (

<input type=“checkbox” defaultChecked={hobby.isChecked} onChange={this.handler.bind(this, index)} /> {hobby.title}

)

})

}


<button onClick={()=>{console.log(this.hobbies)}}>点击获取

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

[外链图片转存中…(img-nte1s70D-1713644693191)]

[外链图片转存中…(img-G26x5OVj-1713644693192)]

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

[外链图片转存中…(img-jzKU1gkT-1713644693192)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

[外链图片转存中…(img-teClItyK-1713644693193)]

完整版面试题资料免费分享,只需你点赞支持,动动手指点击此处就可免费领取了

前端实习面试的套路


回顾项目

往往在面试时,面试官根据你简历中的项目由点及面地展开问答,所以请对你做过的最好的项目进行回顾和反思。回顾你做过的工作和项目中最复杂的部分,反思你是如何完成这个最复杂的部分的。

面试官会重点问你最复杂的部分的实现方法和如何优化。重点要思考如何优化,即使你项目中没有对那部分进行优化,你也应该预先思考有什么优化的方案。如果这部分答好了,会给面试官留下很不错的印象。

重点在于基础知识

这里指的基础知识包括:前端基础知识和学科基础知识。

前端基础知识:html/css/js 的核心知识,其中 js 的核心知识尤为重要。比如执行上下文、变量对象/活动对象(VO/AO)、作用域链、this 指向、原型链等。

学科基础知识:数据结构、计算机网络、算法等知识。你可能会想前端不需要算法,那你可能就错了,在大公司面试,面试官同样会看重学生这些学科基础知识。
你可能发现了我没有提到React/Vue这些框架的知识,这里得说一说,大公司不会过度的关注这方面框架的知识,他们往往更加考察学生的基础。
这里我的建议是,如果你至少使用或掌握其中一门框架,那是最好的,可以去刷刷相关框架的面试题,这样在面试过程中即使被问到了,也可以回答个 7788。如果你没有使用过框架,那也不需要太担心,把重点放在基础知识和学科基础知识之上,有其余精力的话可以去看看主流框架的核心思想。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值