React脚手架+组件化开发+组件生命周期+组件通信

news2025/5/24 4:47:17

react脚手架(create-react-app)

1.作用: 帮助我们生成一个通用的目录结构,并且已经将我们所需的工程环境配置好
2.依赖环境
脚手架都是使用node编写的,并且都是基于webpack的;
3.安装node
4.安装脚手架

npm install -g create-react-app

5.检查脚手架版本

create-react-app --version

创建项目

create-react-app 项目名称

跑项目

yarn start

目录
在这里插入图片描述

React组件化开发

类组件
定义:

  • 组件的名称是大写字符开头的(无论类组件还是函数组件)
  • 类组件需要继承自React.Component
  • 类组件必须实现render函数

使用class定义一个组件:
constructor是可选的,我们通常在constructor中初始化一些数据
this.state中维护的就是我们组件内部的数据
render()方法是class组件中

函数式组件

/**
 * 
 * 函数式组件的特点:
 * 1.没有this对象
 * 2.没有内部的状态
 * 3.没有生命周期
 * 
 */
export default function App(){
  return (
    <div>我是function组件</div>
  )
}

类组件

import React, { Component } from "react";

export default class App extends Component {
  constructor() {
    super();

    this.state = {
      message: 'hello'
    }
  }
  render () {
    return (
      <div>
        <div>app组件</div>
        {/* alt+shift+f  代码格式化*/}
        <h2>{this.state.message}</h2>
      </div>
    )
  }
}

render函数的返回值

  • React元素:通常通过JSX创建
  • 数组或fragments
  • portals:可以渲染子节点到不同的DOM子树中
  • 字符串或数值类型
  • 布尔类型或null:什么都不渲染

生命周期

很多事物从创建到销毁的整个过程,这个过程称之为生命周期。

constructor
如果不初始化state或不进行方法绑定,则不需要为React组件实现构造函数。
constructor中通常只做两件事情:

  • 通过给this.state赋值对象来初始化内部的state
  • 为事件绑定实例(this)

componentDidMount
componentDidMount()会在组件挂在后(插入DOM树中)立即调用
操作:

  • 依赖于DOM的操作可以在这里进行
  • 在此处发送网络请求就最好的地方(官方建议)
  • 可以在此处添加一些订阅(会在componentWillUnmount取消订阅)

componentDidUpdate
componentDidUpdate()会在更新后会被立即调用,首次渲染不会执行此方法。
当组件更新后,可以在此处对DOM进行操作。
如果你对更新前后的props进行了比较,也可以选择在此处进行网络请求;(例如,当props未发生变化时,则不会执行网络请求)

componentWillUnmount
componentWillUnmount() 会在组件卸载及销毁之前直接调用。
在此方法中执行必要的清理操作;
例如:清除timer,取消网络请求或清楚
在componentDidMount()中创建的订阅等;

import React, { Component } from 'react'

class Cpn extends Component {
  render () {
    return <h2>我是cpn组件</h2>
  }
  componentWillUnmount () {
    console.log('我调用了componentWillUnmount')
  }
}

export default class App extends Component {

  constructor() {
    super();

    this.state = {
      count: 1,
      isShow: true
    }
    console.log('执行了组件的constructor')
  }

  render () {
    console.log('执行了组件的render函数')

    return (
      <div>
        我是App组件
        <h2>当前计数:{this.state.count}</h2>
        <button onClick={e => { this.increment() }}>+1</button>
        <hr />
        <button onClick={e => { this.changeShow() }}>切换</button>
        {this.state.isShow && <Cpn />}
      </div>
    )
  }

  increment () {
    this.setState({
      counter: this.state.counter + 1
    })
  }
  changeShow () {
    this.setState({
      isShow: !this.state.isShow
    })
  }

  componentDidMount () {
    console.log('执行了componentDidMount方法')
  }

  componentDidUpdate (previProps,preState,snapshot) {
    console.log('执行了componentDidUpdate方法')
  }
}

组件通信

父->子 props
子->父 itemOnclock

1.父传子-类组件

import React, { Component } from 'react'

class ChilCpn extends Component{
  // constructor(props){
  //   super(props);
  // }
  render(){
    const {name,age,height} = this.props
    return(
      <h2>子组件展示数据:{name+' '+age+' '+height}</h2>
    )
  }
}

export default class App extends Component {
  render() {
    return (
      <div>
        <ChilCpn name='guo' age='18' height='1.55'/>
      </div>
    )
  }
}

2.父传子-函数组件-- 参数验证
效果:
在这里插入图片描述

import React, { Component } from 'react'

import PropTypes from 'prop-types'

function ChildCpn(props){
  const {name,age,height} = props
  const {names} = props
  return (
    <div>
      <h2>{name+' '+ age+' '+height}</h2>

      {/*参数验证 */}
      <ul>
        {
           names.map((item,index)=>{
            return <li>{item}</li>
          })
        }
      </ul>
    </div>
  )
}
ChildCpn.propTypes = {
  name:PropTypes.string.isRequired, // 必传
  age:PropTypes.number,
  height:PropTypes.number,
  names:PropTypes.array
}

// 默认值
ChildCpn.defaultProps = {
  name:'wen',
  age:20,
  height:1.75,
  names:['111']
}

export default class App extends Component {
  render() {
    return (
      <div>
        <ChildCpn name='guo' age={18} height={1.55} names={['abc','mab']}/>
        <ChildCpn/>
      </div>
    )
  }
}

类组件的参数校验

class ChildCpn extends Component{
  // es6中class fields写法
  static propTypes = {

  }

  static defaultProps = {

  }
}

3.子组件传递父组件

import React, { Component } from 'react'

class CounterButton extends Component{
  render(){
    const {onClick} = this.props;
    return <button onClick= {onClick}>+1</button>
  }
}

export default class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      counter:0
    }
  }
  render() {
    return (
      <div>
        <h2>当前计数{this.state.counter}</h2>
        <button onClick= {e=>this.increment()}>+</button>
        <CounterButton onClick={this.increment.bind(this)} />
        <CounterButton onClick={e=>this.increment()} />
      </div>
    )
  }
  increment(){
    this.setState({
      counter:this.state.counter + 1
    })
  }
}

4.组件通信案例
APP.js

import React, { Component } from 'react'

import TabControl from "./TabControl"

export default class App extends Component {
  constructor(props){
    super(props);
    this.titles = ['精选','流行','新款']

    this.state = {
      currentTitle:'精选'
    }

  }
  render() {
    const {currentTitle} = this.state
    return (
      <div>
        <TabControl itemClick={index=>this.itemClick(index)} titles={this.titles}/>
        <h2>{currentTitle}</h2>
      </div>
    )
  }
  itemClick(index){
    console.log(index)
    this.setState({
      currentTitle:this.titles[index]
    })
  }
}

tabcontrol.js

import React, { Component } from 'react'
import PropTypes from 'prop-types'

export default class TabControl extends Component {
  constructor() {
    super()
    this.state = {
      currentIndex: 1
    }
  }
  render () {
    const { titles } = this.props;
    const { currentIndex } = this.state

    return (
      <div className="tab-control">
        {
          titles.map((item, index) => {
            return (
              <div key={index}
              className={'tab-item ' + (index === currentIndex ? 'active' : '')}
              onClick={e => this.itemClick(index)}>
              <span>{item}</span>
            </div>
            )
          })
        }
      </div>
    )
  }

  itemClick (index) {
    this.setState({
      currentIndex: index
    })
    const {itemClick} = this.props
    itemClick(index)
  }
}
TabControl.propTypes = {
  titles: PropTypes.array.isRequired
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在哔站黑马程序员学习Spring—Spring Framework—(一)核心容器(core container)学习笔记

一、spring介绍 spring是一个大家族全家桶&#xff0c;spring技术是JavaEE开发必备技能。spring技术解决的问题&#xff1a;一是简化开发&#xff0c;降低企业级开发的复杂性。二是框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用开发与运行效率。 spring技术…

git revert和git reset的差异点和区别

git revert 定义 撤销某次提交,此次撤销操作和之前的commit记录都会保留。 git revert会根据commitid找到此次提交的变更内容&#xff0c;并撤销这些变更并作为一次新commit提交。 ps:此次commit和正常commit相同&#xff0c;也可以被revert revert和reset有本质的差别&#…

使用C#开发ChatGPT聊天程序

使用C#开发ChatGPT聊天程序 总体效果如下&#xff1a; 源码下载 关键点1&#xff1a;无边框窗口拖动 Window中设置AllowsTransparency"True"、 Background"Transparent"以及WindowStyle"None"这样设置的话默认窗口的标题栏为不可见状态&…

cocos tween

缓动接口Tween 属性和接口说明接口说明接口功能说明tag为当前缓动添加一个数值类型&#xff08;number&#xff09;的标签to添加一个对属性进行 绝对值 计算的间隔动作by添加一个对属性进行 相对值 计算的间隔动作set添加一个 直接设置目标属性 的瞬时动作delay添加一个 延迟时…

Spring Cloud服务发现组件Eureka

简介 Netflix Eureka是微服务系统中最常用的服务发现组件之一&#xff0c;非常简单易用。当客户端注册到Eureka后&#xff0c;客户端可以知道彼此的hostname和端口等&#xff0c;这样就可以建立连接&#xff0c;不需要配置。 Eureka 服务端 添加Maven依赖&#xff1a; <…

菜谱分享APP/基于android菜谱分享系统

摘 要随着现代生活水平的不断提升&#xff0c;人们越来越关注健康,关注美食,大部分人都希望吃得美味的同时也要吃得健康,所以,有的人喜欢在家自己动手制作美食,但是却缺少这方面的资讯来源。菜谱分享APP是一个使用Hbuildex作为手机客户端和后台服务系统的开发环境, MySQL作为后…

Node.js+Vue.js全栈开发王者荣耀手机端官网和管理后台(一)

文章目录【全栈之巅】Node.jsVue.js全栈开发王者荣耀手机端官网和管理后台(一)工具安装和环境搭建初始化项目基于ElementUI的后台管理基础界面搭建创建分类&#xff08;客户端&#xff09;创建分类&#xff08;服务端&#xff09;分类列表分类编辑分类删除子分类【全栈之巅】No…

Bubbles原理解析

官方文档 https://developer.android.com/develop/ui/views/notifications/bubbles#the_bubble_api 气泡使用户可以轻松查看和参与对话。 气泡内置于通知系统中。 它们漂浮在其他应用程序内容之上&#xff0c;无论用户走到哪里都会跟随他们。 气泡可以展开以显示应用程序功能和…

如何搭建春节值班智能通知方案

春节期间&#xff0c;为了保证业务的正常运转&#xff0c;或者及时响应用户/客户需求&#xff0c;许多公司会安排一些人员轮流进行值班&#xff0c;解决一些突发情况或者问题。在过去&#xff0c;一般是排好值班表后&#xff0c;全靠人工自觉上线进行值班&#xff0c;容易遗忘或…

干货,游戏DDoS攻击趋势及原因分析,附防御案例

我曾看到充满激情的创业团队、一个个玩法很有特色的产品&#xff0c;被这种互联网攻击问题扼杀在摇篮里&#xff1b; 也看到过一个运营很好的产品&#xff0c;因为遭受DDoS攻击&#xff0c;而一蹶不振。这也是为什么想把自己6年做游戏行业DDoS的经验&#xff0c;与大家一起分享…

网络的基础认知

日升时奋斗&#xff0c;日落时自省 目录 1、网络发展史 1.1、独立模式 1.2、局域网 1.3、广域网 2、网络通信基础 2.1、IP地址 2.2、端口号 2.3、协议 2.4、网络协议分层 2.4.1、协议类别 2.4.2、TCP和UDP区别 2.5、分层理解事例 2.5.1 封装 2.5.2分用 2.5.3、总…

114. 二叉树展开为链表

114. 二叉树展开为链表 难度中等 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先…

04 链式队列的实现

带头节点的链式队列&#xff1a; 初始化&#xff1a;rear和front指针都指向头节点入队&#xff1a;向rear指向的节点后插入新节点&#xff0c;并让rear指针移动指向新的队尾节点出队&#xff1a;front指针始终指向头节点&#xff0c;即删除头节点后一个节点&#xff1b;最后一个…

Arduino,Nodemcu,ESP8266网络连接(局域网),网页控制内部LED状态变化

整体思路&#xff08;无线终端模式&#xff09; 需要注意&#xff1a;esp8266是 802.11n⽀支持**(2.4GHz )&#xff0c;也就是平常说的wifi4&#xff0c;WiFi5G是连不上的** 配置指定的LED接口&#xff0c;配置网络的WiFi&#xff0c;记录ESP8266模块做为服务器的IP&#xff0…

2022某站百大up主公布名单,python如何快速获取up名单

前言 2022年已经过去&#xff0c;各大厂商都在做年度总结。某站在1月13日中午19点30分公布了2022百大UP主名单&#xff0c;那么今年的某站年度UP主都是谁呢&#xff1f;接下来就让我们一起了解一下吧。不过&#xff0c;我们去用python获取名单&#xff0c;是非常有成就的。 环…

Git(1)基础命令

Git基础知识总结 Author&#xff1a;onceday date&#xff1a;2022年8月8日 满满长路有人对你微笑过嘛… Modified date&#xff1a;2022年11月22日&#xff0c;完成第一章部分内容。 windows安装可参考文章&#xff1a;git简易配置_onceday_CSDN博客 參考文档&#xff1a…

腾讯云短信服务——获取验证码

引言 之前介绍过阿里云短信服务&#xff0c;传送门&#xff1a;阿里云短信服务——短信发送验证码&#xff0c;但是由于阿里云现在短信调用门槛较高&#xff0c;申请有很多限制&#xff08;我申请好几次都没有通过&#xff09;&#xff0c;所以只能使用测试账号给固定的手机号…

2023速卖通开店入驻流程及费用,新店运营思路

开店前准备 从卖家开始注册账户起&#xff0c;需速卖通平台的销售政策和全球速卖通平台规则。平台要求卖家在速卖通经营需遵循公平、诚实的行事原则&#xff0c;以确保安全的购买及销售体验。 1.注册账号 注册账户前&#xff0c;以下所有资料都是必须提供的资料。若资料不完…

AtCoder Beginner Contest 044(4/4)

Tak and Hotels (ABC Edit)前k晚花费x&#xff0c;k1晚以后花费yAC代码&#xff1a;import java.util.*; import java.io.*; public class Main {public static void main(String[] args) {InputStream inputStream System.in;OutputStream outputStream System.out;InputRea…

喜报 | 迅镭激光荣获2022年度江苏省科学技术奖

1月6日&#xff0c;江苏省科技厅发布了2022年度江苏省科学技术奖综合评审结果公示名单&#xff0c;迅镭激光与江苏师范大学等单位合作的“高功率2微米激光器关键技术及应用”项目&#xff0c;荣获2022年度江苏省科学技术二等奖。 江苏省科学技术奖是省内科技领域最高级别的奖项…