React學習筆記——Day2打卡

1、React表單控制

1.1 受控綁定

概念:使用React組件的狀態(useState)控制表單的狀態

在這里插入圖片描述

完整示例:

function App(){/* 1. 準備一個React狀態值 */ const [value, setValue] = useState('')return (/* 2. 通過value屬性綁定狀態,通過onChange屬性綁定狀態同步的函數*/<input type="text" value={value} onChange={e => setValue(e.target.value)}/>)
}

1.2 非受控綁定

概念:通過獲取DOM的方式獲取表單的輸入數據

  1. 使用useRef創建 ref 對象,并與 JSX 綁定
const inputRef = useRef(null)
<input  type="text" ref={inputRef} />
  1. 在DOM可用時,通過 inputRef.current 拿到 DOM 對象
console.log(inputRef.current)

示例:

// 渲染完畢之后dom才可用
function App() {const inputRef = useRef(null)const showDom = () => {// console.log(inputRef.current);console.dir(inputRef.current);  }return (<div className="App"><input type="text" ref={inputRef} /><button onClick={showDom}>點擊</button></div>)
}

在這里插入圖片描述

2、案例-B站評論案例

在這里插入圖片描述

  1. 輸入框評論內容,并發布評論

核心代碼:

const App = () => {// 使用useState維護評論列表const [commentList, setCommentList] = useState(_.orderBy(defaultList,'like','desc'))// 1. 獲取評論內容const[content, setContent] = useState('')// 2.點擊發布評論內容const handPublish=()=>{// 在原始的評論列表中添加新增的setCommentList(...commentList,{rpid: 100,user: {uid: '30009257',avatar,uname: '學習前端',},content: content,ctime: '10-19 09:00',like: 66,})}return (<div className="app"><div className="reply-box-wrap">{/* 評論框 */}<textareaclassName="reply-box-textarea"placeholder="發一條友善的評論"value={content}onChange={(e)=>setContent(e.target.value)}/>{/* 發布按鈕 */}<div className="reply-box-send"><div className="send-text" onClick={handPublish}>發布</div></div></div></div>}
  1. id處理和時間處理(uuid 和 day.js),使用方法看官方文檔(安裝—>導入–>使用)

核心代碼:

// 1. 導入生成隨機id的插件
import { v4 as uuid4 } from "uuid";
// 2.導入時間格式化插件
import dayjs from "dayjs";const handPublish=()=>{// 在原始的評論列表中添加新增的setCommentList(...commentList,{rpid: uuid4(),user: {uid: '30009257',avatar,uname: '黑馬前端',},content: content,ctime: dayjs(new Date()).format('MM-DD HH:mm'), //時間格式化為  ’月-日 時:分‘like: 66,})}
  1. 清空內容并重新聚焦
	const textRef = useRef(null)//1. 清空內容 - 把控制input框的value狀態設置為空串setContent('')// 2. 重新聚焦 - 拿到input的dom元素,調用focus方法textRef.current.focus(){/*評論區*/}<textareaclassName="reply-box-textarea"placeholder="發一條友善的評論"value={content}ref={textRef} //綁定refonChange={(e)=>setContent(e.target.value)}/>

3、React組件通信

概念:組件通信就是組件之間的數據傳遞, 根據組件嵌套關系的不同,有不同的通信手段和方法

在這里插入圖片描述

  1. A-B 父子通信
  2. B-C 兄弟通信
  3. A-E 跨層通信

4、父子通信-父傳子

在這里插入圖片描述

4.1 基礎實現

**實現步驟 **

  1. 父組件傳遞數據 - 在子組件標簽上綁定屬性
  2. 子組件接收數據 - 子組件通過props參數接收數據
// 子組件
function Son(props) {// console.log(props); // {name: '這是父組件的內容,將其綁定到子組件'}return <div>this is son,{props.name}</div>
}function App() {// 父組件定義變量const name = '這是父組件的內容,將其綁定到子組件'return (<div className="App"><Son name={name} /></div>)
}

4.2 props說明

props可以傳遞任意的合法數據,比如數字、字符串、布爾值、數組、對象、函數、JSX
在這里插入圖片描述
需要使用什么,就在子組件里調用{props. } ,比如{props.age}
props是只讀對象
子組件只能讀取props中的數據,不能直接進行修改, 父組件的數據只能由父組件修改

4.3 特殊的prop-chilren

場景:當我們把內容嵌套在組件的標簽內部時,組件會自動在名為children的prop屬性中接收該內容


function Son(props) {console.log(props);//使用return <div>this is son,{ props.children}</div> 
}function App() {return (<div className="App"><Son>// 傳入特殊的prop-chilren<span>this is span</span></Son></div>)
}

在這里插入圖片描述

5、父子通信-子傳父

在這里插入圖片描述
在這里插入圖片描述

核心思路:在子組件中調用父組件中的函數并傳遞參數

function Son({ongetMsg}) {const sonMsg = 'this is son msg'return <div>this is son// 傳遞參數<button onClick={()=>{ongetMsg(sonMsg)}}>點擊</button></div>
}function App() {const [msgs, setMsgs] = useState('')const getMsg = (msg) => {console.log(msg);setMsgs(msg)}return (<div className="App">{msgs}// 在子組件中傳遞父組件的函數<Son ongetMsg={ getMsg } /></div>)
}

6、兄弟組件通信

在這里插入圖片描述

實現思路: 借助 狀態提升 機制,通過共同的父組件進行兄弟之間的數據傳遞

  1. A組件先通過子傳父的方式把數據傳遞給父組件App
  2. App拿到數據之后通過父傳子的方式再傳遞給B組件

子傳父–>父傳子


// 1. 通過子傳父 A -> App
// 2. 通過父傳子 App -> B
import { useState } from "react"function A({onGetname}) {const aname = 'this is A name'return <div>this is A component,{/* 子傳父,傳入參數 */}<button onClick={()=>onGetname(aname)}>send</button></div>
}
function B(props) {// 父傳子,接收傳遞的數據return <div>this is B component,{props.name}</div>
}function App() {const[name, setName] = useState('')const getName = (fname)=> {console.log(fname);setName(fname)}return (<div className="App">this is app,{/* 子傳父 ,定義函數*/}<A onGetname={getName} />{/* 父傳子 */}<B name={name}/></div>)
}export default App

7、跨層組件通信

在這里插入圖片描述
使我們App里得數據,跨過A直接傳遞給B
實現步驟:

  1. 使用 createContext方法創建一個上下文對象Ctx(這個名字可以隨便取)
  2. 在頂層組件(指App)中通過 Ctx.Provider 組件提供數據
  3. 在底層組件(B)中通過 useContext 鉤子函數獲取消費數據
// App -> A -> Bimport { createContext, useContext } from "react"// 1. createContext方法創建一個上下文對象const MsgContext = createContext()function A () {return (<div>this is A component<B /></div>)
}function B () {// 3. 在底層組件 通過useContext鉤子函數使用數據const msg = useContext(MsgContext)return (<div>this is B compnent,{msg}</div>)
}function App () {const msg = 'this is app msg'return (<div>{/* 2. 在頂層組件 通過Provider組件提供數據 */}<MsgContext.Provider value={msg}>this is App<A /></MsgContext.Provider></div>)
}export default App

8、React副作用管理-useEffect

8.1 概念理解

useEffect是一個React Hook函數,用于在React組件中創建不是由事件引起而是由渲染本身引起的操作(副作用), 比 如發送AJAX請求,更改DOM等等
在這里插入圖片描述

說明:上面的組件中沒有發生任何的用戶事件,組件渲染完畢之后就需要和服務器要數據,整個過程屬于“只由渲染引起的操作”

8.2 基礎使用

需求:在組件渲染完畢之后,立刻從服務端獲取平道列表數據并顯示到頁面中

在這里插入圖片描述

說明:

  1. 參數1是一個函數,可以把它叫做副作用函數,在函數內部可以放置要執行的操作
  2. 參數2是一個數組(可選參),在數組里放置依賴項,不同依賴項會影響第一個參數函數的執行,當是一個空數組的時候,副作用函數只會在組件渲染完畢之后執行一次

接口地址:http://geek.itheima.net/v1_0/channels

import { useEffect,useState } from "react";function App() {const[list, setList]=useState([])const URL = 'http://geek.itheima.net/v1_0/channels'useEffect(() => {// 放置要執行的操作async function getlist() {const res = await fetch(URL)// console.log(res);// 轉json字符串const jsonList = await res.json()console.log(jsonList);setList(jsonList.data.channels)}getlist()},[])return (<div className="App">this is app<ul>{list.map(item=><li key={item.id}>{item.name}</li>)}</ul></div>)
}

8.3 useEffect依賴說明

useEffect副作用函數的執行時機存在多種情況,根據傳入依賴項的不同,會有不同的執行表現

依賴項副作用功函數的執行時機
沒有依賴項組件初始渲染 + 組件更新時執行
空數組依賴只在初始渲染時執行一次
添加特定依賴項組件初始渲染 + 依賴項變化時執行

8.4 清除副作用

概念:在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

?????

此處沒弄明白為什么沒在第一次運行的時候就執行return?

9、自定義Hook實現

概念:自定義Hook是以 use打頭的函數,通過自定義Hook函數可以用來實現邏輯的封裝和復用

在這里插入圖片描述

封裝自定義hook通用思路

  1. 聲明一個以use打頭的函數
  2. 在函數體內封裝可復用的邏輯(只要是可復用的邏輯)
  3. 把組件中用到的狀態或者回調return出去(以對象或者數組)
  4. 在哪個組件中要用到這個邏輯,就執行這個函數,解構出來狀態和回調進行使用
// 封裝自定義Hook// 問題: 布爾切換的邏輯 當前組件耦合在一起的 不方便復用// 解決思路: 自定義hookimport { useState } from "react"function useToggle () {// 可復用的邏輯代碼const [value, setValue] = useState(true)const toggle = () => setValue(!value)// 哪些狀態和回調函數需要在其他組件中使用 returnreturn {value,toggle}
}function App () {const { value, toggle } = useToggle()return (<div>{value && <div>this is div</div>}<button onClick={toggle}>toggle</button></div>)
}export default App

10、React Hooks使用規則

  1. 只能在組件中或者其他自定義Hook函數中調用
  2. 只能在組件的頂層調用,不能嵌套在if、for、其它的函數中

在這里插入圖片描述

11、案例-優化B站評論案例

在這里插入圖片描述

  1. 使用請求接口的方式獲取評論列表并渲染
  2. 使用自定義Hook函數封裝數據請求的邏輯
  3. 把評論中的每一項抽象成一個獨立的組件實現渲染

準備工作:

  1. 使用 json-server (訪問json-server 的 github官網進行安裝、準備db.json文件)工具模擬接口服務,安裝好后,在package.json文件下添加:
    在這里插入圖片描述
    執行:npm ren serve
    返回的接口鏈接,蓋鏈接就是下面axios需要使用的接口鏈接

  2. 通過 axios 發送接口請求,axios是一個廣泛使用的前端請求庫(安裝axios:npm install axios

  3. 使用 useEffect 調用接口獲取數據
    在這里插入圖片描述

實現:
1.使用請求接口的方式獲取評論列表并渲染
在這里插入圖片描述

2.使用自定義Hook函數封裝數據請求的邏輯
在這里插入圖片描述
3. 把評論中的每一項抽象成一個獨立的組件實現渲染
核心技術:
抽離評論列表
在這里插入圖片描述
通過父傳子,將父組件(App)的方法傳遞給子組件(Item)——>然后通過子傳父,將子組件的item.rpid傳遞給父組件
在這里插入圖片描述在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915117.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915117.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915117.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用例測試方法5,6:狀態遷移圖和因果圖

狀態遷移圖通過描繪系統的狀態及引起狀態轉換的事件&#xff0c;來表示系統的行為例如&#xff1a;訂機票l向航空公司打電話預定機票—>此時機票信息處于“完成”狀態顧客支付了機票費用后—>機票信息就變為“已支付”狀態旅行當天到達機場后&#xff0c;拿到機票后—>…

linux 腳本解釋

if [ $? -ne 0 ]; thenecho "錯誤: 無法關閉現有 Tomcat 實例&#xff0c;終止啟動流程!" >&2exit 1fi$? 是shell中的特殊變量&#xff0c;表示上一個命令的退出狀態碼-ne 0 表示"不等于0"(在Unix/Linux中&#xff0c;0通常表示成功&#xff0c;非…

Glary Utilities(系統優化工具) v6.20.0.24 專業便攜版

GlaryUtilities 允許你清理系統垃圾文件&#xff0c;無效的注冊表&#xff0c;上網記錄&#xff0c;刪除插件&#xff0c;查找重復文件&#xff0c;優化內存&#xff0c;修理或刪除快捷方式&#xff0c;管理windows啟動程序&#xff0c;卸載軟件&#xff0c;安全刪除文件&#…

VScode鏈接服務器一直卡在下載vscode服務器/scp上傳服務器,無法連接成功

終極方案&#xff08;強力推薦&#xff0c;親測有效&#xff0c;鏈接只需5秒鐘&#xff09;&#xff1a;本地下載復制到mkdir -p ~/.vscode-server/bin/<commit_hash>里面 <commit_hash>可以從幫助->關于里面找到&#xff0c;如下所示 版本: 1.96.2 提交: fa…

基于Spring Boot的農村農產品銷售系統設計與實現

隨著現代農業的快速發展,傳統農產品的銷售模式逐漸暴露出信息閉塞、流通效率低和中間環節多等問題。為了打破這些瓶頸,我基于Spring Boot框架開發了一套農產品銷售系統,旨在構建一座連接農民與消費者之間的數字橋梁,讓優質農產品更高效地直達用戶餐桌。 一、項目背景與目標…

Mysql默認存儲引擎InnoDB和底層數據結構

在黑馬點評項目實戰中&#xff1a;談到了為什么不推薦使用mysql的字段自增作為訂單id傳遞給客戶端&#xff0c;讓我想到了Mysql的??存儲引擎??和??底層數據結構??究竟是什么&#xff1f;它是如何實現自增的&#xff1f;本文主要是深度解析 MySQL 默認存儲引擎 InnoDB 與…

原點安全簽約金網絡數科,共建一體化數據安全防護體系

金網絡正式攜手原點安全&#xff0c;基于原點安全一體化數據安全平臺&#xff08;uDSP&#xff09;&#xff0c;啟動企業數據安全平臺建設項目&#xff0c;圍繞數據資產盤點、敏感數據識別與分類分級、數據訪問權限管控、數據動態脫敏、數據安全審計與風險監測等關鍵能力建設&a…

mix-blend-mode的了解使用

mix-blend-mode 是 CSS 的一個屬性&#xff0c;用于控制元素的內容&#xff08;如文本、圖像、背景等&#xff09;如何與其 父元素 或 背景 進行混合。它類似于圖形設計軟件&#xff08;如 Photoshop&#xff09;中的圖層混合模式&#xff0c;可以實現各種視覺效果&#xff1b;…

vue自定義指令bug

問題描述&#xff1a;頁面加載時&#xff0c;報已下錯誤。同時&#xff0c;頁面數據不顯示環境介紹&#xff1a;已經添加了vue自定義指令permission&#xff0c;實現如下&#xff0c;用以控制元素顯示權限app.directive(permission, (el, binding) > {if (!store.hasPermiss…

Vue3 + WebSocket

Vue3與WebSocket結合能夠很好地滿足實時通訊的需求。通過合理設計和管理WebSocket連接的生命周期&#xff0c;以及實現必要的重連邏輯和心跳檢測機制&#xff0c;可以構建出響應迅速且穩定的實時應用。WebSocketWebSocket允許服務端主動向客戶端發送數據&#xff0c;無需客戶端…

IPSec和HTTPS對比(一)

IPSec&#xff08;Internet Protocol Security&#xff09;是網絡層&#xff08;OSI第3層&#xff09;的加密協議&#xff0c;其核心機制和與HTTPS的區別如下&#xff1a;&#x1f512; ?一、IPSec的核心機制解析??1. 安全封裝結構?┌──────────┬───────…

關于 c、c#、c++ 三者區別

1. 起源與定位語言起源時間開發者定位/特點C1972年Dennis Ritchie面向過程的編程語言&#xff0c;強調底層控制與高效性能C1983年Bjarne Stroustrup在 C 的基礎上加入 面向對象編程&#xff08;OOP&#xff09;C#2000年微軟&#xff08;Microsoft&#xff09;類似 Java&#xf…

項目總體框架(servlet+axios+Mybatis)

項目總體框架 先暫時這樣子&#xff08;后續發現錯誤的話就改&#xff09; com.hope-tieba/ ← 項目根 ├─ .idea/ ← IDEA 工程配置 ├─ src/ │ ├─ main/ │ │ ├─ java/ │ │ │ └─ com/hope/ │ │ …

RestTemplate 實現后端 HTTP 調用詳解

1. 方法簽名解析方法名和返回類型說明了這個方法的業務意圖和數據結構。Override 表示實現接口方法&#xff0c;利于規范開發和自動檢查。Override public List<RobotInfo> listRobots() {這里 RobotInfo 是假設的業務數據結構&#xff0c;實際項目中按你的類名即可。2. …

Python單例模式詳解:從原理到實戰的完整指南

引言 單例模式是軟件設計中最常用的模式之一&#xff0c;它確保一個類只有一個實例&#xff0c;并提供全局訪問點。在Python中&#xff0c;實現單例模式有多種優雅的方式&#xff0c;本文將詳細講解6種主流實現方法&#xff0c;包含完整代碼示例和注釋。 一、模塊級單例&#x…

拼團系統中的冪等性防護 , 前置性查詢,Redis 庫存預判

這段內容涉及兩個關鍵點&#xff1a;冪等性防護 和 拼團目標量判斷&#xff0c;下面我將分別解釋這兩個問題&#xff0c;并重點說明&#xff1a; “如果沒有攔截&#xff0c;最終訪問數據&#xff0c;也會有數量判斷攔截。” 這句話的意思。 ? 1. 查詢外部交易 outTradeNo 是…

【Python】LEGB作用域 + re模塊 + 正則表達式

文章目錄一 LEGB作用域二 re&#xff08;Regular Expression&#xff09;預覽1. re.match() —— 從字符串開頭匹配2. re.search() —— 搜索整個字符串3. re.findall() —— 返回所有匹配的字符串列表4. re.finditer() —— 返回所有匹配的迭代器5. re.sub() —— 替換匹配的字…

JavaSE -- 數據操作流

6. 數據操作流在執行文件存儲一個對象的時候&#xff0c;如果該對象只有少量屬性需要存儲&#xff0c;并且這些屬性的類型都是基本數據類型&#xff0c;此時則不需要對象序列化技術。使用數據操作流既可以實現。 DataOutputStreamDataInputStream 注意&#xff1a; 讀取數據的時…

GI6E 加密GRID電碼通信SHELLCODE載入

GI6E https://github.com/MartinxMax/gi6e 「它似乎能從特製的音訊信號中提取敏感資訊。」 HEX-GRID CODEX&#xff08;簡稱 HGC&#xff09;是一種自定義的 6 位元結構編碼系統&#xff0c;使用三位元的群組識別碼&#xff08;Group Bits&#xff09;加上三位元的索引識別碼…

實習十三——傳輸層協議

補充子網劃分的主要目的就是為了節約IP&#xff0c;降低成本&#xff0c;但是如果劃分私有IP網段&#xff0c;則完全沒有意義&#xff0c;因為私有IP可重復&#xff0c;不要錢&#xff0c;所以私有IP嚴禁進行子網掩碼劃分傳輸層協議TCP三次握手TCP協議數據格式第一次握手&#…