React全家桶详细讲解-图文并茂

outline: none;

}

.todo-container {

width: 600px;

margin: 0 auto;

}

.todo-container .todo-wrap {

padding: 10px;

border: 1px solid #ddd;

border-radius: 5px;

}

/header/

.todo-header input {

width: 560px;

height: 28px;

font-size: 14px;

border: 1px solid #ccc;

border-radius: 4px;

padding: 4px 7px;

}

.todo-header input:focus {

outline: none;

border-color: rgba(82, 168, 236, 0.8);

box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);

}

/main/

.todo-main {

margin-left: 0px;

border: 1px solid #ddd;

border-radius: 2px;

padding: 0px;

}

.todo-empty {

height: 40px;

line-height: 40px;

border: 1px solid #ddd;

border-radius: 2px;

padding-left: 5px;

margin-top: 10px;

}

/item/

li {

list-style: none;

height: 36px;

line-height: 36px;

padding: 0 5px;

border-bottom: 1px solid #ddd;

}

li label {

float: left;

cursor: pointer;

}

li label li input {

vertical-align: middle;

margin-right: 6px;

position: relative;

top: -1px;

}

li button {

float: right;

display: none;

margin-top: 3px;

}

li:before {

content: initial;

}

li:last-child {

border-bottom: none;

}

/footer/

.todo-footer {

height: 40px;

line-height: 40px;

padding-left: 6px;

margin-top: 5px;

}

.todo-footer label {

display: inline-block;

margin-right: 20px;

cursor: pointer;

}

.todo-footer label input {

position: relative;

top: -1px;

vertical-align: middle;

margin-right: 5px;

}

.todo-footer button {

float: right;

margin-top: 5px;

}

渲染列表


  • 在state中初始化评论列表数据

在这里插入图片描述

  • 使用数组的map方法遍历state中的列表数据

  • 给每一个被遍历的li元素添加key属性

  • 在render方法里的ul节点下嵌入表达式

render() {

const {todos,updateTodo,DeleteTodo} = this.props

return (

    {

    todos.map((todo)=> {

    return <Item key= {todo.id} {…todo} updateTodo = {updateTodo} DeleteTodo={DeleteTodo}/>

    })

    }

    )

    }

    添加任务


    addTodo用于添加一个todo,接收的参数是todo对象,将attTodo传递给heder

    import React, { Component } from ‘react’

    import ‘./index.css’

    export default class Header extends Component {

    // react生命周期-一般用在进入页面后,数据初始化,这种情况下和vue中的created挺相似的

    componentDidMount() {

    this.input.focus()

    }

    // input输入框

    handleKeyUp = (event)=> {

    // 结构赋值

    const {keyCode,target} = event

    // 判断是否是enter按键

    if(keyCode !== 13) return

    // 判断是否是空对象

    if (target.value.trim() === ‘’){

    alert(‘输入的不能为空’)

    return // 如果不return,有空对象那么提示完又继续执行了,没有达到一个拦截作用

    }

    // 准备一个todo对象

    const todoobj = {id:new Date().getTime(),name:target.value,done:false}

    // 父子组件传值

    this.props.addTodo(todoobj)

    // 情况输入的字符串

    target.value = ‘’

    }

    render() {

    return (

    <input ref={(input)=> this.input = input} onKeyUp = {this.handleKeyUp} type=“text” placeholder=“请输入你的任务名称,按回车键确认”/>

    )

    }

    }

    删除任务


    给list 绑定一个delete的事件

    在这里插入图片描述

    在这里插入图片描述

    三、React-组件进阶

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

    组件通讯介绍


    组件是独立且封闭的单元,默认情况下,只能使用组件自己的数据。在组件化过程中,我们将一个完整

    的功能拆分成多个组件,以更好的完成整个应用的功能。而在这个过程中,多个组件之间不可避免的要

    共享某些数据。为了实现这些功能,就需要打破组件的独立封闭性,让其与外界沟通,这个过程就是组

    件通讯

    组件的props


    基本使用

    • 组件时封闭的,要接受外部数据应该通过props来实现

    • props的作用:接收传递给组件的数据传递数据:给组件标签添加属性

    • 组件时封闭的,要接受外部数据应该通过props来实现

    • props的作用:接收传递给组件的数据

    • 传递数据:给组件标签添加属性

    接收数据:函数组件通过 参数 props接收数据,类组件通过 this.props接收数据

    1. 函数组件:

    function Hello(props) {

    return (

    接收到数据: {props.name}

    )

    }

    1. 类组件:

    class Hello extends React.Component {

    render() {

    return {

    接收到数据: this.props.age}

    }

    }

    }

    四、react-组件通讯的三种方式

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

    react-父组件传递数据给子组件


    • 父组件提供要传递的state数据

    • 给子组件标签添加属性,值为state中的数据

    • 子组件中通过props接收父组件中传递的数据

    在这里插入图片描述

    react-子组件传递数据给父组件


    • 利用回调函数,父组件提供回调,子组件调用,将要传递的数据作为回调函数的参数

    • 父组件提供一个回调函数,用来接收数据

    • 将该函数作为属性的值,传递给子组件

    在这里插入图片描述

    子组件通过props 调用回调函数

    在这里插入图片描述

    react-兄弟组件传递


    • 将共享状态(数据)提升到最近的公共父组件中,由公共父组件管理这个状态

    • 这个称为状态提升

    • 公共父组件职责:1. 提供共享状态 2.提供操作共享状态的方法

    • 要通讯的子组件只需要通过props接收状态或操作状态的方法

    在这里插入图片描述

    示例:

    • 定义布局结构,一个Counter里面包含两个子组件,一个是计数器的提示,一个是按钮

    class Counter extends React.Component {

    render() {

    return (

    )

    }

    }

    class Child1 extends React.Component {

    render() {

    return (

    计数器:

    )

    }

    }

    class Child2 extends React.Component {

    render() {

    return (

    +1

    )

    }

    }

    • 在父组件里定义共享状态,把这个状态传递给第一个子组件

    class Counter extends React.Component {

    // 提供共享的状态

    state = {

    count: 0

    }

    render() {

    return (

    {/* 把状态提供给第一个子组件 */}

    )

    }

    }

    • 在第一个子组件里面就能通过props获取到

    class Child1 extends React.Component {

    render() {

    return (

    计数器:{this.props.count}

    )

    }

    }

    • 在父组件中提供共享方法,通过属性传递给第二个子组件,方便第二个子组件来进行调用

    // 提供共享方法

    onIncrement = (res) => {

    // 只要第二个子组件调用了这个函数,就会执行里面代码

    this.setState({

    count: this.state.count + res

    })

    }

    render() {

    return (

    {/* 把共享方法提供给第二个子组件 */}

    )

    }

    • 在第二个子组件里面通过props来获取到对应函数,然后进行调用

    class Child2 extends React.Component {

    handleClick = () => {

    // 这里一旦调用,就会执行父组件里面 onIncrement函数

    this.props.onIncrement(2)

    }

    render() {

    return (

    +

    )

    }

    }

    五、react-生命周期

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

    1. 概述

    意义:组件的生命周期有助于理解组件的运行方式,完成更复杂的组件功能、分析组件错误原因等

    组件的生命周期: 组件从被创建到挂载到页面中运行,再到组件不在时卸载的过程

    生命周期的每个阶段总是伴随着一些方法调用,这些方法就是生命周期的钩子函数

    钩子函数的作用:为开发人员在不同阶段操作组件提供了时机

    1. 生命周期阶段

    在这里插入图片描述

    创建时(挂载阶段)


    在这里插入图片描述

    更新时


    • 执行时机: setState()、 forceUpdate()、 组件接收到新的props

    • 说明:以上三者任意一种变化,组件就会重新渲染

    • 执行顺序:

    在这里插入图片描述

    卸载时


    执行时机:组件从页面中消失

    作用:用来做清理操作

    在这里插入图片描述

    完整生命周期钩子函数


    在这里插入图片描述

    getDerivedStateFromProps()

    • getDerivedStateFromProps 会在调用 render 方法之前调用,并且在初始挂载及后续更新时都

    会被调用。它应返回一个对象来更新 state,如果返回 null 则不更新任何内容

    • 不管原因是什么,都会在每次渲染前触发此方法

    shouldComponentUpdate()

    • 根据 shouldComponentUpdate() 的返回值,判断 React 组件的输出是否受当前 state 或 props

    更改的影响。默认行为是 state 每次发生变化组件都会重新渲染

    • 当 props 或 state 发生变化时, shouldComponentUpdate() 会在渲染执行之前被调用。返回值

    默认为 true

    getSnapshotBeforeUpdate()

    • getSnapshotBeforeUpdate() 在最近一次渲染输出(提交到 DOM 节点)之前调用。它使得组

    件能在发生更改之前从 DOM 中捕获一些信息(例如,滚动位置)。此生命周期的任何返回值将作

    为参数传递给 componentDidUpdate()

    • 此用法并不常见,但它可能出现在 UI 处理中,如需要以特殊方式处理滚动位置的聊天线程等

    六、React-原理

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

    更新数据


    • setState() 更新数据是异步的

    • 注意:使用该语法,后面的 setState 不要依赖前面 setState 的值

    • 多次调用 setState ,只会触发一次render

    如下面在 changeContent 方法中,首先修改 nam 属性的值,然后根据此值的变化,设置 color 属性的

    发现结果并非预想中的一样,原因就在于 setState 方法是异步的

    import React, { Component } from ‘react’

    import ReactDOM from ‘react-dom’

    class App extends Component {

    constructor(props) {

    super(props)

    this.changeContent = this.changeContent.bind(this)

    this.state = {

    name: ‘yhb’,

    age: 20,

    color: ‘red’

    }

    }

    changeContent() {

    this.setState((state, props) => {

    return {

    name: ‘onlifes’

    }

    })

    if (this.state.name === ‘onlifes’) {

    this.setState({

    color: ‘blue’

    })

    }

    }

    render() {

    return (

    change

    )

    }

    }

    ReactDOM.render(, document.querySelector(‘#root’))

    推荐语法


    • 推荐:使用 setState((state,props) => {}) 语法

    • 参数state: 表示最新的state

    • 参数props: 表示最新的props

    在这里插入图片描述

    使用这种方法,可以保证拿到 state 或者 props 中的最新值,就可以解决上面的问题

    changeContent () {

    this.setState((state, props) => {

    return {

    name: ‘onlifes’

    }

    })

    this.setState((state, props) => {

    return {

    color: ‘blue’

    }

    })

    }

    第二个参数


    • 场景:在状态更新(页面完成重新渲染)后立即执行某个操作

    • 语法: setState(update[,callback])

    在这里插入图片描述

    使用回调函数的方式,也可以完成上面的功能

    changeContent () {

    this.setState((state, props) => {

    return {

    name: ‘onlifes’

    }

    }, () => {

    if (this.state.name === ‘onlifes’) {

    this.setState({

    color: ‘blue’

    })

    }

    })

    }

    JSX 的转化过程


    • JSX仅仅是 createElement() 方法的语法糖(简化语法)

    • JSX语法被 @babel/preset-react 插件编译为 createElement() 方法

    • React 元素: 是一个对象,用来描述你希望在屏幕上看到的内容

    在这里插入图片描述

    七、React-路由的介绍

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

    现代的前端应用大多数是SPA(单页应用程序),也就是只有一个HTML页面的应用程序。因为它的用户

    体验更好、对服务器压力更小,所以更受欢迎。为了有效的使用单个页面来管理多页面的功能,前端路

    由应运而生。

    • 前端路由功能:让用户从一个视图(页面)导航到另一个视图(页面)

    • 前端路由是一套映射规则,在React中,是URL路径与组件的对应关系

    • 使用React路由简单来说,就是配置路径和组件

    路由的基本使用


    • 安装

    npm install --save react-router-dom

    • 导入路由的三个核心组件: Router / Route / Link

    import {BrowserRouter as Router, Route, Link} from ‘react-router-dom’

    • 使用Router 组件包裹整个应用

    在这里插入图片描述

    • 使用Link组件作为导航菜单(路由入口)
    First Second
    • 使用Route组件配置路由规则和要展示的组件(路由出口)

    import React, { Component } from ‘react’

    import axios from ‘axios’

    // import {Button} from ‘antd-mobile’

    import { BrowserRouter as Router, Route, Link } from ‘react-router-dom’

    export default class app extends Component {

    getStudentDate = () => {

    axios.get(‘http://localhost:3001/students’).then(

    response => { console.log('成功了 ', response.data); },

    error => { console.log(‘失败了’, error) }

    最后

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

    深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

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

    img

    既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

    如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

    • 使用Link组件作为导航菜单(路由入口)
    First Second
    • 使用Route组件配置路由规则和要展示的组件(路由出口)

    import React, { Component } from ‘react’

    import axios from ‘axios’

    // import {Button} from ‘antd-mobile’

    import { BrowserRouter as Router, Route, Link } from ‘react-router-dom’

    export default class app extends Component {

    getStudentDate = () => {

    axios.get(‘http://localhost:3001/students’).then(

    response => { console.log('成功了 ', response.data); },

    error => { console.log(‘失败了’, error) }

    最后

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

    深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

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

    [外链图片转存中…(img-Zxk8wjRr-1714948704342)]

    [外链图片转存中…(img-zD4V13A8-1714948704343)]

    [外链图片转存中…(img-pSNDnJAR-1714948704343)]

    既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

    如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值