react函數組件的props,ref,state。

? ? ? ? ? ?react開發我們會把頁面分為一個個組件,組件是獨立而且可復用的重復代碼片段。具體來說組件可以是一個按鈕,一個輸入框。react組件有兩種定義方法,一種是函數組件,一種是類組件。我們這里說一下函數組件之間父子之間如何傳遞props參數,如果通過ref來獲取真實DOM元素,如何通過設置state這個react變量去動態展示頁面中的數據。

?1.props

import React from 'react'
import LogItem from './LogItem'
import './Log.css'
export default function Logs() {//模擬一組從服務器加載的數據const logsData = [{id: "001",data: new Date(2021, 9, 20, 19, 0),title: '學習九陽神功',time: 30},{id: "002",data: new Date(2021, 4, 20, 19, 0),title: '學習我我我功',time: 20},{id: "003",data: new Date(2021, 5, 20, 19, 0),title: '學習你你神功',time: 10},{id: "004",data: new Date(2022, 1, 20, 19, 0),title: '學習九大大滴神功',time: 34}]return (// 如果組件中的數據全部寫死會導致組件無法動態設置//希望組件數據可以由外部設置 在組件間父組件可以通過props給子組件傳遞數據<div className='logs'>{/* 在父組件給子組件設置屬性在函數組件中可以通過參數來保存 */}{logsData.map((item) => {return (<LogItem key={item.id} data={item.data} title={item.title} time={item.time} />// <LogItem {...item} />)})}</div>)
}

? ? ? ? 這里我們在組件中定義了一個數組對象,作為服務器返回的json數據。我們想要一個列表去展示這些數據,每個列表都是相同的,所以我們需要一個子組件展示內容,父組件遍歷展示子組件就可以了。我們需要把數據傳給子組件,通過props傳遞方法就是之間傳,通過key=value這種方式直接傳遞,key不會作為參數,會作為內部特殊屬性保留。然后傳遞過去之后子組件去獲取然后展示。?

import React from 'react'
import MyDate from './MyDate'
import './LogItem.css'
export default function LogItem(props) {// console.log(props);// console.log(props.data);return (//函數組件的行參定義一個props props指向一個對象 包含父組件傳遞所有參數<div className="item"><MyDate data={props.data} /><div className="content"><h2 className='title'>{props.title}</h2><div className="time">{props.time}</div></div></div>)
}

? ? ? ?函數組件直接在參數里面props接收就可以了。輸出的props就是傳過來的那些props參數。然后{}里面寫表達式就可以動態展示了。props是父組件給子組件傳遞的方式。

2.ref

? ? ? ? 我們在開發用react框架開發時,如果需要操作真實DOM,我們可以通過DOM對象(document)去操作DOM,也可以直接從react獲取DOM對象,首先用鉤子函數useRef()去創建一個存儲DOM對象的容器,其實就是一個非常普通的對象,里面有一個current屬性僅此而已。

import React, { useRef } from 'react'
import './App.css'
import { useState } from 'react'
let temp
export default function App() {console.log('函數執行了');const h1Ref = useRef()//創建一個容器// const h1Ref = { current: undefined }console.log(temp === h1Ref);temp = h1Ref//這里永遠不相等因為每次都是生成新對象//直接用這種創建一個有current屬性的對象也可以console.log(h1Ref);const clickHandler = () => {// const header = document.getElementById('header')// alert(header)// header.innerHTML = '哈哈'//原生DOM操作DOM元素h1Ref.current.innerHTML = 'hah'}return (<div className='app'><h1>{a}</h1><h1 id='header' ref={h1Ref}>為上標題</h1><button onClick={add}>加</button><h1>{user.name}-----{user.age}</h1><button onClick={go}>2</button><button onClick={clickHandler}>點完</button></div>)
}

? ? ? ? 比如我們希望用按鈕去操作h1標簽里面的文本改變,用document操作就需要設置id,然后通過id獲取元素對象賦值給header,然后調用header.innerText=‘haha’ ,但是我們在react盡量避免使用dom因為會脫離react掌控。我們這里用鉤子函數去定義一個容器h1Ref然后給我們想要操作的DOM一個ref屬性值是容器,那么就存到了這個容器對象的current里面,控制臺可以看,而且只是一個簡單的js對象。我們可以直接定義一個對象去代替,屬性就是current。然后直接h1Ref.current.innerHTML='hha'操作h1的文本內容,只不過需要注意的是useRef()創建的容器只會生成一次,如果直接創建對象的話每次重新渲染都需要重新生成一個新的對象。所以如果我們需要保持一個不變的對象或者值,多次渲染不丟失重置就可以用uesRef比如我們關閉定時器用到的id

function MyComponent() {const timerRef = useRef(null); // 創建一個持久的容器對象useEffect(() => {timerRef.current = setInterval(() => console.log('hi'), 1000);}, []);return <button onClick={() => clearInterval(timerRef.current)}>停止</button>;
}

3.state?

? ? ? ? 當我們想要設置一個變量,而且這個變量動態的展示到頁面上面,我們就需要去用鉤子函數useState()去創建一個數組,前面是我們的變量,后面是一個函數,調用之后可以用回調函數去更新我們的變量。

????????


import React, { useRef } from 'react'
import './App.css'
import { useState } from 'react'
let temp
export default function App() {console.log('函數執行了');console.log(h1Ref);// let a =1let [a, setA] = useState(2)console.log(useState());//輸出的是一個數組前面是初始值后面是函數const result = useState(1)console.log(result);let fn = result[1]console.log('fn', fn)const [user, setUser] = useState({ name: 'sun', age: 11 })//點擊加數字增加 點擊減數字減少const add = () => {// a++// setA(a++)setA((preState) => {return preState + 1})}const go = () => {// user.name = 'gou'// setUser(user) //不會重新渲染因為修改的是原對象// const newUser = Object.assign({}, user)// newUser.name = 'gou'// setUser(newUser)//這個方法可以因為淺復制給一個新對象復制,地址是改變的// setUser({ name: 'zhu', age: 19 })setUser({ ...user, name: 'gou' })}return (<div className='app'><h1>{a}</h1><h1 id='header' ref={h1Ref}>為上標題</h1><button onClick={add}>加</button><h1>{user.name}-----{user.age}</h1><button onClick={go}>2</button><button onClick={clickHandler}>點完</button></div>)
}

? ? ? ? 我們如果直接let a = 1 然后我們點擊按鈕其實a改變了,但是頁面a不會改變,因為沒有重新渲染頁面。所以a++執行成功但是頁面a沒有變化,這時候我們用我們的鉤子函數useState()并且用數組結構的方法去設置a。然后我們調用setA這個方法,里面設置一個回調函數,preState是當前的變量a,然后返回更新后的新的變量a。然后重新調渲染頁面。

????????

????????state特點。1.state是一個被react管理的變量 通過setState()修改變量的值會觸發重新渲染,重新調用一個render(),然后重新diff比較之后更新然后用DOM轉化虛擬DOM對象為真實DOM,只有state發生變化才會重新渲染。state是一個對象 修改時使用新的對象替換已有對象,直接修改原有對象 不會生效因為地址沒變,當通過setState去修改一個state時不表示修改當前state,修改的是組件下一次渲染的state值。

????????2.setState()會觸發組件重新渲染 它是異步的,會排隊讓同步代碼執行完以后再執行重新渲染,所以當調用setState()需要用到舊state值一定要注意 有可能出現計算錯誤的情況,為了避免這種情況可以傳遞回調函數的形式 箭頭函數參數為當前最新的state

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

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

相關文章

基于ARM+FPGA實現的BISS-C協議解決方案,適用于高精度光柵位移傳感器等

模塊簡介 本資源提供了專為FPGA設計的BISS-C接口協議發送模塊源碼。BISS-C模式作為一種高速、同步的串行通信協議&#xff0c;廣泛應用于高精度光柵位移傳感器的數據傳輸中&#xff0c;特別適用于需要精確位置信息的應用場景。此模式遵循主從架構&#xff0c;其中FPGA作為主控制…

spring中@Transactional注解和事務的實戰理解附代碼

文章目錄 前言一、事務是什么&#xff1f;二、事務的特性2.1隔離性2.2事務的隔離級別 三、Transactional注解Transactional注解簡介基本用法常用屬性配置事務傳播行為事務隔離級別異常處理與回滾性能優化建議 四、 事務不生效的可能原因方法訪問權限非public自調用問題異常被捕…

替代進口SCA7606【智芯微】國產高精度電流傳感器 工業新能源電網專用

SCA7606&#xff08;智芯微&#xff09;產品解析與推廣文案一、產品概述SCA7606 是 智芯微電子&#xff08;ZXMICRO&#xff09; 推出的一款 高精度數字隔離式電流傳感器芯片&#xff0c;采用 霍爾效應數字輸出 技術&#xff0c;專為 工業控制、新能源、智能電網 等領域的電流檢…

Java 與 Vue 全棧開發:“一課一得“ 學習筆記系統實戰

一、項目背景與核心價值 "一課一得" 是一個面向學習者的筆記管理平臺&#xff0c;旨在幫助用戶系統化記錄、整理和回顧學習內容。項目采用前后端分離架構&#xff1a;前端基于 Vue.js 構建交互式界面&#xff0c;后端使用 Java Spring Boot 實現業務邏輯&#xff0c…

百度文心大模型 4.5 開源深度測評:技術架構、部署實戰與生態協同全解析

聲明&#xff1a;本文只做實際測評&#xff0c;并非廣告 1.前言 2025 年 6 月 30 日&#xff0c;百度做出一項重大舉措&#xff0c;將文心大模型 4.5 系列正式開源&#xff0c;并選擇國內領先的開源平臺 GitCode 作為首發平臺。該模型也是百度在2025年3月16日發布的自研的新一…

力扣_鏈表_python版本

一、206. 反轉鏈表代碼&#xff1a; class Solution:def reverseList(self, head):dummy ListNode()cur headwhile cur:last cur.nextcur.next dummy.nextdummy.next curcur lastreturn dummy.next二、92. 反轉鏈表 IIclass Solution:def reverseBetween(self, head: Opt…

[netty5: WebSocketProtocolHandler]-源碼分析

在閱讀這篇文章前&#xff0c;推薦先閱讀&#xff1a;[netty5: MessageToMessageCodec & MessageToMessageEncoder & MessageToMessageDecoder]-源碼分析 WebSocketProtocolHandler WebSocketProtocolHandler 是 WebSocket 處理的基礎抽象類&#xff0c;負責管理 Web…

[2025CVPR]一種新穎的視覺與記憶雙適配器(Visual and Memory Dual Adapter, VMDA)

引言 多模態目標跟蹤&#xff08;Multi-modal Object Tracking&#xff09;旨在通過結合RGB模態與其他輔助模態&#xff08;如熱紅外、深度、事件數據&#xff09;來增強可見光傳感器的感知能力&#xff0c;尤其在復雜場景下顯著提升跟蹤魯棒性。然而&#xff0c;現有方法在頻…

理想汽車6月交付36279輛 第二季度共交付111074輛

理想汽車-W(02015)發布公告&#xff0c;2025年6月&#xff0c;理想汽車交付新車36279輛&#xff0c;第二季度共交付111074輛。截至2025年6月30日&#xff0c;理想汽車歷史累計交付量為133.78萬輛。 在成立十周年之際&#xff0c;理想汽車已連續兩年成為人民幣20萬元以上中高端市…

MobileNets: 高效的卷積神經網絡用于移動視覺應用

摘要 我們提出了一類高效的模型&#xff0c;稱為MobileNets&#xff0c;專門用于移動和嵌入式視覺應用。MobileNets基于一種簡化的架構&#xff0c;利用深度可分離卷積構建輕量級的深度神經網絡。我們引入了兩個簡單的全局超參數&#xff0c;能夠有效地在延遲和準確性之間進行…

SDP服務發現協議:動態查詢設備能力的底層邏輯(面試深度解析)

SDP的底層邏輯揭示了物聯網設備交互的本質——先建立認知,再開展協作。 一、SDP 核心知識點高頻考點解析 1.1 SDP 的定位與作用 考點:SDP 在藍牙協議棧中的位置及核心功能 解析:SDP(Service Discovery Protocol,服務發現協議)位于藍牙協議棧的中間層,依賴 L2CAP 協議傳…

CppCon 2018 學習:GIT, CMAKE, CONAN

提到的&#xff1a; “THE MOST COMMON C TOOLSET” VERSION CONTROL SYSTEM BUILDING PACKAGE MANAGEMENT 這些是 C 項目開發中最核心的工具鏈組成部分。下面我將逐一解釋每部分的作用、常見工具&#xff0c;以及它們如何協同構建現代 C 項目。 1. VERSION CONTROL SYSTEM&am…

使用tensorflow的線性回歸的例子(五)

我們使用Iris數據&#xff0c;Sepal length為y值而Petal width為x值。import matplotlib.pyplot as pltimport numpy as npimport tensorflow as tffrom sklearn import datasetsfrom tensorflow.python.framework import opsops.reset_default_graph()# Load the data# iris.d…

虛幻基礎:動作——蒙太奇

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 動作——蒙太奇如果動作被打斷&#xff0c;則后續的動畫通知不會執行 動作——蒙太奇 如果動作被打斷&#xff0c;則后續的動畫通知不會執行

[工具系列] 開源的 API 調試工具 Postwoman

介紹 隨著 Web 應用的復雜性增加&#xff0c;API 測試已成為開發中不可或缺的一部分&#xff0c;無論是前端還是后端開發&#xff0c;確保 API 正常運行至關重要。 Postman 長期以來是開發者進行 API 測試的首選工具&#xff0c;但是很多基本功能都需要登陸才能使用&#xff…

【力扣 簡單 C】746. 使用最小花費爬樓梯

目錄 題目 解法一 題目 解法一 int min(int a, int b) {return a < b ? a : b; }int minCostClimbingStairs(int* cost, int costSize) {const int n costSize; // 樓頂&#xff0c;第n階// 爬到第n階的最小花費 // 爬到第n-1階的最小花費從第n-1階爬上第n階的花費…

python+django開發帶auth接口

pythondjango開發帶auth接口 # coding utf-8 import base64 from django.contrib import auth as django_authfrom django.core.exceptions import ObjectDoesNotExist from django.http import JsonResponsefrom sign.models import Eventdef user_auth(request):"&quo…

RBAC權限模型如何讓API訪問控制既安全又靈活?

url: /posts/9f01e838545ae8d34016c759ef461423/ title: RBAC權限模型如何讓API訪問控制既安全又靈活? date: 2025-07-01T04:52:07+08:00 lastmod: 2025-07-01T04:52:07+08:00 author: cmdragon summary: RBAC權限模型通過用戶、角色和權限的關聯實現訪問控制,核心組件包括用…

安達發|告別低效排產:APS高級排程如何助力電池企業智造升級?

在全球能源轉型的背景下&#xff0c;動力電池、儲能電池等市場需求快速增長&#xff0c;電池制造企業面臨著訂單波動大、工藝復雜、交期嚴格等挑戰。傳統的手工排產或基于ERP的簡單計劃模式已難以滿足高效、精準的生產需求。APS高級排程通過智能算法優化生產計劃&#xff0c;實…

數據結構20250620_數據結構考試

試卷01 天津金海通軟件筆試題 選擇題(4*416) 對于雙向循環鏈表,在p指針所指的結點之后插入s指針所指結點的操作應為 p->nexts; s->prip; p->next->pris; s->nextp->nextp->nexts; p->next->pris; s->prip; s->nextp->nexts->pri …