react 初体验

news2024/11/18 19:43:51

react笔记

创建一个项目

npm install -g create-react-app // 全局安装脚手架
create-react-app  react-01 // 新建一个项目
npm start

快捷定义组件

在这里插入图片描述

  • 安装组件后,快捷命令 rcc :类式组件 rfc:函数式组件

axios开启代理

  • 在package.json中新增
{
	proxy:"http:192.168.2.107:8080"
}

如何开启服务运行项目打包后的dist包

  • 全局安装 serve npm i serve -g
  • serve 文件夹名 serve dist

父子组件传值

  • 父传子:子组件this.props接收
  • 子传父:父组件定义方法接收参数,将方法传给子组件;子组件在合适时机调取改方法并传参
// 父组件
class App extends Component {
  addList = (item) => { // 1.定义方法
  }
  render() {
    return (
      <div>      
          <Add addList={this.addList} />   // 2.传递方法     
      </div >
    );
  }
}
// 子组件
export default class Add extends Component {
  add = (e) => {
    if (e.keyCode == 13) {
      this.props.addList(e.target.value)  // 3.调用方法
    }
  }
  render() {
    return (
      <div>
        <input type="text" placeholder='新增' onKeyUp={this.add} />
      </div>
    )
  }
}

任意组件通信——订阅发布机制

  • 安装库 npm i pubsub-js
  • 需要接收信息的组件订阅消息
import PubSub from 'pubsub-js'

export default class Foot extends Component {
  componentDidMount() { // 组件渲染完成创建订阅 (消息名字,收到消息回调(消息名字,数据))
    this.sub = PubSub.subscribe('getData', (name, data) => {
      console.log(name, data)
    })
  }
  componentWillUnmount() {
    PubSub.unsubscribe(this.sub) // 组件卸载前取消订阅
  }
  render() {
    return (
      <div></div>
    )
  }
}
  • 发送数据的组件在合适实际发布订阅消息
import PubSub from 'pubsub-js'
export default class Add extends Component {
  add = (e) => {
    PubSub.publish('getData', e.target.value) // 发布订阅消息
  }
  render() {
    return (
      <div>
        <input type="text" placeholder='新增' onKeyUp={this.add} />
      </div>
    )
  }
}

spa 单页面应用(vue、react)

在这里插入图片描述

git提交代码报错

报错信息:Git: husky > pre-commit (node v14.16.1)
错误原因:项目中使用了husky, 这个会在你git commit的时候先执行里面的严谨模式, 对代码进行检查, 有error就会终止提交
git commit前检测husky与pre-commit

  • 解决方法
 git commit -m "提交页面备注 绕过eslint检查" --no-verify

table添加序号

 	{
      title: '序号',
      render: (text, record, index) => {
        return (
          `${(searchParam.pageIndex || 1 - 1) * (searchParam.pageSize) + (index + 1)}`//当前页数减1乘以每一页页数再加当前页序号+1
        )
      }
    },

普通方法中this的指向

  • 方法里this指向window
  • 但是当开启局部严格模式,this就指向undefined
  • class类中方法自动开启严格模式,所以类中的方法如果不是实例调用,this是undefined;若是实例调用则指向实例对象
  • bind可以改变this指向为传进去的参数,并且返回一个新的函数
function qu() {
  console.log('this', this)
}
qu()  // 打印 undefined
let qu1 = qu.bind(window) // 改变了this指向
qu1()  // 打印 window对象

class类中可以写什么——赋值语句

  • constructor构造器
  • 方法
  • 变量赋值 例如 a = 1
class Car {
  a = 1, //直接变量赋值,代表给实例添加一个属性
}
const car = new Car()
console.log(22, car) //{a:1}

…展开运算符使用

  • 只能展开数组,不能展开对象
  • 可用于合并数组
let arr1 = [1, 2, 3, 4]
let arr2 = [6, 7, 8, 9]
console.log(...arr1) // 1 2 3 4
console.log([...arr1, ...arr2]) //合并数组 [1, 2, 3, 4, 6, 7, 8, 9]
  • 可用于接收所有参数为数组
function sum(...v) {
  console.log(v) //[1, 2, 3, 4]
  return v.reduce((s, c) => {
    return s + c
  })
}
let ss = sum(1, 2, 3, 4)
console.log(ss) // 10
  • 可用于克隆一个对象,类似深拷贝,并且可以修改或添加新属性
  • 可用于合并对象,属性名相同的会被覆盖,不同的会新增
let obj1 = {
  name: 'rose',
  age: 18
}
let obj2 = {
  name1: 'jack',
  age1: 13
}
let obj = { ...obj1 }
console.log(obj)  // 类似深拷贝 {name: 'rose', age: 18}
console.log({ ...obj1, name: 'sunny', sex:'1' })  // 克隆并修改属性 {name: 'sunny', age: 18 , sex:'1'}
console.log({ ...obj1, ...obj2 })  // 合并对象 {name: 'rose', age: 18, name1: 'jack', age1: 13}

对象的键名取变量 【】

let obj = { name:'张三' }  // {name: '张三'}
let name = 'key';
obj = { [name] : '张三'}  // obj[name] = '张三'
console.log(obj)  // {key: '张三'}

连续解构赋值并取别名

	let obj = {
      a: { b: 1 }
    }
    let { a: { b } } = obj  //连续解构,直接拿到b
    console.log(b) 
    let { a: { b: data } } = obj  // 变量取别名  变量:别名
    console.log(data)

虚拟DOM中key 的作用

  • key 是虚拟 DOM 对象的标识,可提高页面更新渲染的效率。
  • 当状态中的数据发生变化时,React 会根据新数据生成新的虚拟 DOM ,接着对新旧虚拟 DOM 进行 Diff 比较,规则如下:

旧虚拟 DOM 找到和新虚拟 DOM 相同的 key: 若内容没变,直接复用真实 DOM;若内容改变,则生成新的真实 DOM,替换页面中之前的真实DOM
旧虚拟 DOM 未找到和新虚拟 DOM 相同的 key:根据数据创建新的真实 DOM ,渲染到页面

使用 index 作为 key 可能引发的问题:

  • 若对数据进行逆序添加、逆序删除等破坏顺序的操作,会进行没有必要的真实 DOM 更新。界面效果没问题,但效率低下。
  • 如果结构中包含输入类的DOM(如 input 输入框) ,则会产生错误的 DOM 更新。
  • 若不存在对数据逆序添加、逆序删除等破坏顺序的操作,且没有输入类DOM,使用index则没有问题。
    在这里插入图片描述

在input上绑定enter键回车事件,并清空input

  • 绑定onKeyUp方法
  • 在参数e中,e.keyCode代表每个键的键码,e.target.value代表输入的值
  • 单选框的值是 e.target.checked
export default class Add extends Component {
  add = (e) => {
    console.log(e.target.value, e.keyCode) //  13
    e.target.value = '' // 清空input
  }
  render() {
    return (
      <div>
        <input type="text" placeholder='新增' onKeyUp={this.add} />
      </div>
    )
  }
}

根据id匹配来修改、删除、新增数组,统计数组选中的个数

state = {
    list: [
      { id: 1, value: '吃饭', checked: true },
      { id: 2, value: '睡觉', checked: false },
      { id: 3, value: '打豆豆', checked: false }
    ]
  }
  addList = (item) => {
    let { list } = this.state
    this.setState({
      list: [{ id: list.length + 1, value: item, checked: false }, ...list] // 1.数组前边新增一条数据
    })
  }
  delList = (id) => {
    let { list } = this.state
    this.setState({
      list: list.filter(item => item.id != id) // 2.删除数组某一项,根据id匹配
    })
  }
  changeList = (id, checked) => {
    let { list } = this.state
    this.setState({
      list: list.map(item => {   // 3. 修改数组某一项的checked属性值,根据id匹配
        if (item.id === id) {
          return { ...item, checked }  //原理:合并对象,属性名相同会覆盖
        } else {
          return item
        }
      })
    })
  }
  getNum = () => {
  	 let { list } = this.state
	 let num = list.reduce((pre, item) => {  // 4.统计选中的个数,reduce(回调(累计值,当前项), [初始值])
      	return pre + (item.checked ? 1 : 0)
     }, 0)
     return num
 }

数组的循环some、find、filter、map比较

  • some 判断数组这种是否有符合条件的项
  • find 返回第一个符合条件的项
  • filter 返回所有符合条件的的项集合
[1,2,3,4].some(item=>item>2)  // true
[1,2,3,4].find(item=>item>2)  // 3
[1,2,3,4].filter(item=>item>2)  // [3, 4]
[{type:'ss1',id:1},{type:'ss2',id:2},{type:'ss3',id:3}].map(item=>item.type) // ['ss1', 'ss2', 'ss3']

只有数组的for循环和对象的 for…in 循环中使用 break 结束循环,使用continue跳出本次循环,其他循环方法均不行

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

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

相关文章

为什么我推荐你一定要学Python?

很多初学者都听说python很火&#xff0c;可是为啥要学Python&#xff0c;下面谈谈我的感悟 python语言是我目前为止用的最爽的语言&#xff0c;因为它真的很优美.虽然c,c,java也非常的强大和伟大&#xff0c;但是每一种语言伟大的背后都是有一定的时代背景。 说起Python这门编…

VINS学习02——VINS系列代码所有依赖库安装(保姆级)

0.简介 在学习视觉SLAM过程中&#xff0c;先后用了VINS_mono,VINS_Fusion,Omni_swarm,因为是第一次做视觉相关定位&#xff0c;所以大部分库都是第一次装&#xff0c;中间还从虚拟机换到双系统&#xff0c;意识到记录的重要行性&#xff0c;所以在此记录安装相关依赖库的教程。…

python 练习题

for 循环 和 while 循环 判断101-200之间有多少个素数&#xff0c;并输出所有素数。 &#xff08;什么是素数(质数): 除了1和它本身&#xff0c;不能被其他的数整除&#xff09; 方法1&#xff1a; count 0 # 设定素数的初始个数为0 for num in range…

MySql使用MyCat分库分表(四)分片规则

视频学习地址&#xff1a;17-尚硅谷-垂直分库_哔哩哔哩_bilibili 笔记参考地址&#xff1a;MySQL 分库分表 | xustudyxus Blog (frxcat.fun) 分片规则 范围分片 介绍 根据指定的字段及其配置的范围与数据节点的对应情况&#xff0c; 来决定该数据属于哪一个分片。 配置 …

Angular 应用开发里使用 ForRoot 解决 Lazy Loaded Module 里单例行为丢失的问题

笔者在 Angular 实际项目开发中曾经遇到这样一个需求&#xff1a; 我们想创建一个共享模块&#xff0c;它将包含一个配置来设置布尔值&#xff08;作为标志&#xff09;以启用或禁用其他模块的某些功能。 其他模块可以在 Angular 应用程序的引导期间加载&#xff0c;也可以是延…

JVM基本常识

目录 内存区域划分 类加载 何时触发类加载&#xff1f; 双亲委派模型 GC GC回收那部分内存&#xff1f; 怎么回收&#xff1f; 怎么找垃圾(判定某个对象是否是垃圾) 具体怎么回收&#xff1f; 我的GitHub&#xff1a;Powerveil GitHub 我的Gitee&#xff1a;Powercs12…

痞子衡嵌入式:浅析IAR下调试信息输出机制之半主机(Semihosting)

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家分享的是IAR下调试信息输出机制之半主机(Semihosting)。 在嵌入式世界里&#xff0c;输出打印信息是一种非常常用的辅助调试手段&#xff0c;借助打印信息&#xff0c;我们可以比较容易地定位和…

由浅到深-模拟实现list

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一 、见见…

Acrel-2000Z电力监控系统在某数据中心的应用-Susie 周

1、概述 随着网络和信息技术的快速发展&#xff0c;人们对“大数据”业务需求不断增长&#xff0c;为了满足日益增长的应用需求&#xff0c;数据的建设规模也在向超大型、园区级数据方向发展。通信、金融、商业等行业&#xff0c;面对未来数据业务的爆发式增长需求&#xff0c…

Go cobra 库学习

cobra既是一个用于创建强大现代CLI应用程序的库&#xff0c;也是一个生成应用程序和命令文件的程序。cobra被用在很多go语言的项目中&#xff0c;比如 Kubernetes、Docker、Istio、ETCD、Hugo、Github CLI等等 其实简单的来说&#xff0c;cobra就是一个自定义命令工具&#xff…

从IPC到分布式软总线的随笔

在Linux 系统中&#xff0c; 客观来说&#xff0c;缺乏相对开发者比较友好的进程间通信框架。谈到Linux上进程间通信&#xff0c;一般都会想起管道&#xff08;匿名、有名&#xff09;、信号/信号灯、共享内存、消息队列和socket。这些都是偏低层的技术&#xff0c;有没有方便开…

HummerRisk 入门3:开发手册

本文是 HummerRisk 的开发手册&#xff0c;介绍项目的结构及如何配置 HummerRisk 的开发环境和开发中的注意事项&#xff0c;快速参与到 HummerRisk 项目的开发中来。 一、项目结构 二、配置开发环境 1、环境准备 后端 HummerRisk 后端使用了 Java 语言的 Spring Boot 框架…

从今天起真正释放创造力 | Werner Vogels 在 re:Invent 2022带来多项开发者福音

对于开发者而言&#xff0c;成就感来自于每一次敲下代码后可实现的创造力&#xff0c;而不是把时间和精力消耗在写千篇一律又无法复用的“胶水”代码&#xff0c;或是在越来越复杂的软件栈面前&#xff0c;疲惫地写业务流程并尽量减少 Bug。 更加不堪的是&#xff0c;有时仅仅…

软件测试工程师涨薪攻略!3年如何达到30K!

1.软件测试如何实现涨薪 首先涨薪并不是从8000涨到9000这种涨薪&#xff0c;而是从8000涨到15K加到25K的涨薪。基本上三年之内就可以实现。 如果我们只是普通的有应届毕业生或者是普通本科那我们就只能从小公司开始慢慢往上走。 有些同学想去做测试&#xff0c;是希望能够日…

[附源码]计算机毕业设计基于springboot架构的博客平台设计

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【电力系统】基于两阶段鲁棒优化算法的微网多电源容量配置附matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

01 初识HTML5

HTML5结构组成 HTML5主要是由标签组成的&#xff0c;如下代码就是HTML5的主要组成部分&#xff1a;<!DOCTYPE html> <!-- 文档声明标签&#xff0c;表示用html5解析 --> <html lang"zh-CN"> <!-- languangen 表示英文 “…

【保姆级·创建对象】如何通过Supplier创建对象

Spring创建对象的主要方式有 通过自定义BeanPostProcessor&#xff0c;生成代理对象InstantiationAwareBeanPostProcessor createBean() -> resolveBeforeInstantiation() 通过supplier创建对象 createBean() -> doCreateBean() -> createBeanInstance() -> obtai…

行业寒冬下逆势拿到50万offer,看看大牛是怎么做到的

年薪50万&#xff0c;这个薪水我以前想都不敢想&#xff0c;我一直以为月薪2万就是软件测试的天花板。当越来越多的同行拿到更高的薪水&#xff0c;我才明白&#xff0c;限制我薪水的不是行业天花板&#xff0c;而是我的技术实力。 每天陀螺一样两点一线的在家和公司之间往返&…

Nature文章使用认证Kamiya艾美捷抗胸腺嘧啶二聚体单抗方案

细胞内、外部环境中普遍存在的DNA损伤因素会破坏遗传信息的稳定性。紫外线损伤皮肤的机制之一是损伤细胞的DNA&#xff0c;形成“晒伤细胞”&#xff0c;诱发细胞内DNA产生丰富的变异&#xff0c;主要包括环丁烷嘧啶二聚体&#xff08;CPD&#xff0c;Cyclobutane pyrimidine d…