react入门到实战-day2-7.21

昨天晚上刚学完已经一点了,来不及写笔记,主要是想睡觉哈,所以今天补上,我发现效率还挺高的,今天重新做笔记,加固了昨天的知识点,要不以后都这样子哈,学完第二天再写哈,要是大家有推荐的vue项目练手可不可以分享给我,跪求


React表单控制

受控绑定

概念:使用React组件的状态(useState)控制表单的状态

受控表单:

第一步:声明一个react状态--useState

第二步:通过value属性绑定react状态

第三步:绑定onChange事件,通过事件参数e拿到输入框的最新值,反向修改到react状态中

import {useState} from 'react'
function App(){const [value, setValue] = useState('')return (<input type="text" value={value} onChange={e => setValue(e.target.value)}/>)
}

非受控绑定

概念:通过获取DOM的方式获取表单的输入数据

react 获取dom

第一步:useRef生成ref对象,绑定到dom标签上

第二步:dom可用时(渲染完毕之后dom生成之后才可用),ref.current获取dom

import {useRef} from 'react'
function App(){const inputRef = useRef(null)const onChange = ()=>{console.log(inputRef.current.value)}return (<input type="text" ref={inputRef}onChange={onChange}/>)
}


React组件通信

概念:组件通信就是组件之间的数据传递, 根据组件嵌套关系的不同,有不同的通信手段和方法

父子通信-父传子

实现步骤

  1. 父组件传递数据 - 在子组件标签上绑定属性

  2. 子组件接收数据 - 子组件通过props参数接收数据

  3. props:对象里面包含了父组件的传递过来的所有数据

function Son(props){return <div>{ props.v }</div>
}function App(){const name = 'this is app name'return (<div><Son v={name}/></div>)
}

props说明

props可以传递任意的合法数据,比如数字、字符串、布尔值、数组、对象、函数、JSX

props是只读对象子组件只能读取props中的数据,不能直接进行修改, 父组件的数据只能由父组件修改


父传子 - 特殊的prop children

当我们把内容嵌套在组件的标签内部时,组件会自动在名为children的prop属性中接收该内容



父子通信-子传父

核心思路:在子组件中调用父组件中的函数并传递参数

首先给子组件标签传递一个父组件中的函数,传过去之后子组件接收,在子组件通过某些事件调用起来,同时把自己的数据当作实参,传给父组件,父组件中的函数写一个形参接收

function Son({ onGetMsg }){const sonMsg = 'this is son msg'return (<div>{/* 在子组件中执行父组件传递过来的函数 */}<button onClick={()=>onGetMsg(sonMsg)}>send</button></div>)
}function App(){
//加一个状态数据
const {value,setSa}=useState('')const getMsg = (msg)=>{console.log(msg)setSa(msg)}return (<div>{/* 传递父组件中的函数到子组件 */}<Son onGetMsg={ getMsg }/>{msg}</div>)
}


兄弟组件通信

实现思路: 借助 状态提升 机制,通过共同的父组件进行兄弟之间的数据传递

  1. A组件先通过子传父的方式把数据传递给父组件App

  2. App拿到数据之后通过父传子的方式再传递给B组件

// A->App 
import { useState } from "react"function A({ i }) {const n = 'this A'return (<div>this is A compnent,<button onClick={() => i(n)}>123</button></div>)
}function B() {return (<div>this is B compnent,</div>)
}function App() {const [name, setAa] = useStateconst getAname = (name) => {setAa(name)console.log(name);}return (<div>this is App<A i={getAname}></A></div>)
}export default App

// A->App App->B
import { useState } from "react"function A({ i }) {const n = 'this A'return (<div>this is A compnent,<button onClick={() => i(n)}>123</button></div>)
}// 解构出来的x
function B({ x }) {return (<div>this is B compnent,{x}</div>)
}function App() {// 要想把a的数据传给B,则app要准备一个数据用来接受a传过来的数据,
//并且希望b可以动态的显示这个数据,则需要状态变量const [name, setAa] = useState('')const getAname = (name) => {console.log(name);setAa(name)}return (<div>this is App<A i={getAname}></A><B x={name}></B></div>)
}export default App


跨层组件通信

实现步骤:

  1. 使用 createContext方法创建一个上下文对象Ctx

  2. 在顶层组件(App)中通过 Ctx.Provider 组件提供数据

  3. 在底层组件(B)中通过 useContext 钩子函数获取消费数据

//App->A->Bimport { createContext, useContext } from "react"// 1. createContext方法创建一个上下文对象
const Asdf = createContext()function A() {return (<div>this is A compnent,<B></B></div>)
}function B() {
// 3. 在底层组件 通过useContext钩子函数使用数据const qwe = useContext(Asdf)return (<div>this is B compnent,{qwe}</div>)
}function App() {const qwe = 'this App'return (<div>{/* 2. 在顶层组件 通过Provider组件提供数据 */}<Asdf.Provider value={qwe}>this is App<A></A></Asdf.Provider></div>)
}export default App


React副作用管理-useEffect

概念理解

useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作(副作用), 比如发送AJAX请求,更改DOM等等

说明:

  1. 参数1是一个函数,可以把它叫做副作用函数,在函数内部可以放置要执行的操作

  2. 参数2是一个数组(可选参),在数组里放置依赖项,不同依赖项会影响第一个参数函数的执行,当是一个空数组的时候,副作用函数只会在组件渲染完毕之后执行一次

import { useEffect, useState } from 'react'const URL = 'http://geek.itheima.net/v1_0/channels'function App() {// 之后才创建一个状态const [list, setSt] = useState([])useEffect(() => {async function getL() {const res = await fetch(URL)const i = await res.json()console.log(i);setSt(i.data.channels)}getL()}, [])return (<div>this is app<ul>{list.map(item => <li key={item.id}>{item.name}</li>)}</ul></div>)
}export default App

useEffect依赖说明

useEffect副作用函数的执行时机存在多种情况,根据传入依赖项的不同,会有不同的执行表现

依赖项副作用功函数的执行时机
没有依赖项组件初始渲染 + 组件更新时执行
空数组依赖只在初始渲染时执行一次
添加特定依赖项组件初始渲染 + 依赖项变化时执行
import { useEffect, useState } from 'react'function App() {const [count, setCount] = useState(0)//useEffect(() => {// console.log('fu');//})// useEffect(() => {//   console.log('fu');// }, [])useEffect(() => {console.log('fu');}, [count])return (<div>this is app<button onClick={() => setCount(count + 1)}>++{count}</button></div>)
}export default App

清除副作用

概念:在useEffect中编写的由渲染本身引起的对接组件外部的操作,社区也经常把它叫做副作用操作,比如在useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器再清理掉,这个过程就是清理副作用

说明:清除副作用的函数最常见的执行时机是在组件卸载时自动执行

import { useEffect, useState } from "react"function Son () {// 1. 渲染时开启一个定时器useEffect(() => {const timer = setInterval(() => {console.log('定时器执行中...')}, 1000)return () => {// 清除副作用(组件卸载时)clearInterval(timer)}}, [])return <div>this is son</div>
}function App () {// 通过条件渲染模拟组件卸载const [show, setShow] = useState(true)return (<div>{show && <Son />}<button onClick={() => setShow(false)}>卸载Son组件</button></div>)
}export default App

 


自定义Hook实现

概念:自定义Hook是以 use打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用

import { useEffect, useState } from 'react'function App() {const [show, setShow] = useState(true)const v = () => setShow(!show)return (<div>{show && <div>显示与隐藏</div>}<button onClick={v} >asd</button></div>)
}export default App

封装自定义hook通用思路

1. 声明一个以use打头的函数

 2. 在函数体内封装可复用的逻辑(只要是可复用的逻辑)

 3. 把组件中用到的状态或者回调return出去(以对象或者数组)

4. 在哪个组件中要用到这个逻辑,就执行这个函数,解构出来状态和回调进行使用
 

import { useEffect, useState } from 'react'// 封装自定义Hook// 问题: 布尔切换的逻辑 当前组件耦合在一起的 不方便复用// 解决思路: 自定义hookfunction useToggle() {// 可复用的逻辑代码const [show, setShow] = useState(true)const v = () => setShow(!show)// 哪些状态和回调函数需要在其他组件中使用 returnreturn { show, v }}function App() {const { show, v } = useToggle()return (<div>{show && <div>显示与隐藏</div>}<button onClick={v} >asd</button></div>)
}export default App

React Hooks使用规则

  1. 只能在组件中或者其他自定义Hook函数中调用

  2. 只能在组件的顶层调用,不能嵌套在if、for、其它的函数中

 


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

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

相关文章

中断相关驱动详解

1. 中断的硬件框架 1.1 中断路径上的3个部件 中断源 中断源多种多样&#xff0c;比如GPIO、定时器、UART、DMA等等。 它们都有自己的寄存器&#xff0c;可以进行相关设置&#xff1a;使能中断、中断状态、中断类型等等。 中断控制器 各种中断源发出的中断信号&#xff0c;汇聚…

python实现盲反卷积算法

python实现盲反卷积算法 盲反卷积算法算法原理算法实现Python实现详细解释优缺点应用领域盲反卷积算法 盲反卷积算法是一种图像复原技术,用于在没有先验知识或仅有有限信息的情况下,估计模糊图像的原始清晰图像和点扩散函数(PSF)。盲反卷积在摄影、医学成像、天文学等领域…

Tinygrad,llama3,Reward Model

目录 Tinygrad 与其他框架的比较 llama3 Reward Model Tinygrad 是一个轻量级的深度学习框架,由George Hotz(也被称为geohot)开发。以下是对Tinygrad的详细介绍: 与其他框架的比较 与PyTorch、TensorFlow等更全面的深度学习框架相比,Tinygrad在功能上可能有所限制,…

基于opencv的答题卡识别

文章目录 一、背景需求二、处理步骤图片预处理检测到答题卡轮廓透视变换找每个圆圈的轮廓轮廓排序判断是否答题正确 一、背景需求 传统的手动评分方法耗时且容易出错&#xff0c;自动化评分可以可以显著提高评分过程的速度和准确性、减少人工成本。 答题卡图片处理效果如下&am…

Unity Android接入SDK 遇到的问题

1. buildtools、platformtools、commandline tools 以及compiled sdk version、buildtools sdk version、target sdk version 的说明 Android targetSdkVersion了解一下 - 简书 2. 查看.class 和.jar文件 jd_gui 官网地址&#xff1a; 下载jd_gui 工具 &#xff0c;或者 idea 下…

【Django】anaconda环境变量配置及配置python虚拟环境

文章目录 配置环境变量配置python虚拟环境查看conda源并配置国内源在虚拟环境中安装django 配置环境变量 control sysdm.cpl,,3笔者anaconda安装目录为C:\ProgramData\anaconda3 那么需要加入path中的有如下三个 C:\ProgramData\anaconda3 C:\ProgramData\anaconda3\Scripts C:…

收银系统源码视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)

目录 搭建本地私有知识问答系统:MaxKB、Ollama 和 Llama3 实现指南引言MaxKB+Ollama+Llama 3 Start buildingMaxKB 简介:1.1、docker部署 MaxKB(方法一)1.1.1、启用wls或是开启Hyper使用 WSL 2 的优势1.1.2、安装docker1.1.3、docker部署 MaxKB (Max Knowledge Base)MaxKB …

聚观早报 | 微软邀测AI摘要功能;百川智能完成A轮融资

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月26日消息 微软邀测AI摘要功能 百川智能完成A轮融资 苹果地图网页版上线公测 郭明錤剧透iPhone 17 Slim 马斯…

DeviceNet转Profinet协议网关

怎么样才能把DeviceNet和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题&#xff0c;作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为JM-PN-DNTM&#xff0c;下面是详细介绍。 一&#xff0c;产品主要功能‌ 1、捷米特…

【BUG】已解决:The above exception was the direct cause of the following exception:

The above exception was the direct cause of the following exception: 目录 The above exception was the direct cause of the following exception: 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c…

【Java版数据结构】初识泛型

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 br />个人主页&#xff1a;Gu Gu Study专栏&#xff1a;Java版数据结构 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1…

数据安全检查方兴未艾,天空卫士领跑检查工具市场

近日&#xff0c;数世咨询正式发布了《数据安全检查工具市场洞察报告》&#xff0c;其中&#xff0c;天空卫士的数据安全检查工具箱——数据安全扫描仪&#xff08;DSS)&#xff0c;以30.04%的市场份额位列第一。 图例&#xff1a;数据安全检查工具箱市场概况 此前&#xff0c…

Python字符串编解码,解决字符串乱码问题

目录 1、编码与解码基础 &#x1f4dd; 1.1 字符集与编码概念 1.2 Python中的str与bytes类型 2、使用str.encode()方法 &#x1f527; 2.1 encode()方法详解 2.2 实战&#xff1a;字符串转字节串 3、利用bytes.decode()方法 &#x1f527; 3.1 decode()方法解析 3.2 实…

数据恢复教程:如何从硬盘、SD存储卡、数码相机中恢复误删除数据。

您正在摆弄 Android 设备。突然&#xff0c;您意外删除了一张或多张图片。不用担心&#xff0c;您总能找到一款价格实惠的数据恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的数据。 Android 上数据被删除的主要原因 在…

鸿蒙配置生产证书打包准备

1、生成P12文件 2、新增cer证书&#xff1a;https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/harmonyOSDevPlatform/9249519184596237889 3、证书名称&#xff1a;xxxx&#xff1b;证书类型&#xff1a;发布证书&#xff1b;证书请求文件&#x…

【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

C++ 红黑树插入的实现

文章目录 前言一、红黑树有什么性质&#xff1f;二、插入的原理即步骤1.新增结点为红色2.寻找叔叔结点1.叔叔为红色2.叔叔不存在为nullptr3.叔叔存在且为黑 三、代码实现1.叔叔为红2.叔叔为空或者叔叔为黑 四、验证是否为红黑树1.代码实现2.测试1.测试代码2.测试结果 总结 前言…

系留无人机在技术上有哪些优势或创新点

系留无人机在技术上具有显著的优势和创新点&#xff0c;主要体现在以下几个方面&#xff1a; 1. 长航时飞行作业&#xff1a; - 系留无人机系统由地面通过市电、发电机或电池组供电&#xff0c;并通过系留线缆将电力传输至无人机&#xff0c;实现了不间断供电。 - 这种供电方式…

虚拟机复制后网络不可用,报错“network.service - LSB: Bring up/down networking”

查询IP地址&#xff0c;eth33 没有显示IP地址 尝试重启&#xff0c;有报错&#xff0c;并且有提示&#xff0c;按照提示执行下看看 解决办法 chkconfig NetworkManager offsystemctl disable NetworkManager.serviceservice NetworkManager stopservice network restart 之后检…