亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
首頁 > web前端 > js教程 > 正文

React組件間通信:從子組件向父組件傳遞數(shù)據(jù)實(shí)踐

DDD
發(fā)布: 2025-10-16 11:30:01
原創(chuàng)
458人瀏覽過

react組件間通信:從子組件向父組件傳遞數(shù)據(jù)實(shí)踐

本教程詳細(xì)講解如何在React中實(shí)現(xiàn)子組件向父組件傳遞數(shù)據(jù)。通過在父組件定義回調(diào)函數(shù)并作為props傳遞給子組件,子組件在事件觸發(fā)時(shí)調(diào)用該回調(diào),將數(shù)據(jù)回傳。父組件使用狀態(tài)管理接收數(shù)據(jù),并可利用`useEffect`響應(yīng)數(shù)據(jù)變化,實(shí)現(xiàn)動態(tài)數(shù)據(jù)請求,避免直接調(diào)用組件函數(shù)。

在React應(yīng)用開發(fā)中,組件之間的數(shù)據(jù)流通常是單向的,即數(shù)據(jù)從父組件流向子組件(通過props)。然而,在許多場景下,我們需要子組件將數(shù)據(jù)或事件通知給父組件。例如,一個(gè)表單輸入組件(子組件)在用戶提交數(shù)據(jù)后,需要將輸入值傳遞給其父組件進(jìn)行處理。本文將以一個(gè)具體的示例,詳細(xì)闡述如何實(shí)現(xiàn)這種“子組件向父組件傳遞數(shù)據(jù)”的通信模式。

理解React數(shù)據(jù)流與組件通信

React的核心思想是單向數(shù)據(jù)流。父組件通過props將數(shù)據(jù)傳遞給子組件。當(dāng)子組件需要與父組件通信時(shí),它不能直接修改父組件的狀態(tài)。正確的做法是,父組件傳遞一個(gè)回調(diào)函數(shù)給子組件作為prop,子組件在需要通信時(shí)調(diào)用這個(gè)回調(diào)函數(shù),并將數(shù)據(jù)作為參數(shù)傳遞給它。這樣,父組件就能在其回調(diào)函數(shù)中接收到子組件傳來的數(shù)據(jù),并更新自己的狀態(tài)。

示例場景:從輸入框組件獲取數(shù)據(jù)到應(yīng)用主組件

假設(shè)我們有一個(gè)InputField組件用于用戶輸入地址,并有一個(gè)App組件作為主應(yīng)用,需要在InputField提交數(shù)據(jù)后,使用該地址進(jìn)行API請求。

1. 修改子組件:InputField.js

首先,我們需要修改InputField組件,使其能夠接收一個(gè)回調(diào)函數(shù)作為prop。當(dāng)用戶提交表單時(shí),InputField會調(diào)用這個(gè)回調(diào)函數(shù),并將輸入值傳遞出去。

// InputField.js
import React from 'react';

export default function InputField({ onSubmit }) { // 接收一個(gè)名為 onSubmit 的 prop
  function handleSubmit(e) {
    e.preventDefault(); // 阻止瀏覽器默認(rèn)的表單提交行為

    const form = e.target;
    const inputVal = form.myInput.value; // 獲取輸入框的值

    console.log("子組件獲取到的輸入值:", inputVal);

    // 調(diào)用父組件傳遞進(jìn)來的回調(diào)函數(shù),并將輸入值作為參數(shù)傳遞
    if (onSubmit && typeof onSubmit === 'function') {
      onSubmit(inputVal); 
    }
  }

  return (
    <form method="post" onSubmit={handleSubmit}>
      <input name="myInput" id="adress-field" placeholder="Enter adress" autoComplete="on" />
      <button type="submit" id="adress-button">Send</button>
    </form>
  );
}
登錄后復(fù)制

關(guān)鍵點(diǎn):

  • InputField組件現(xiàn)在接受一個(gè)名為onSubmit的prop。
  • 在handleSubmit函數(shù)中,獲取到inputVal后,我們調(diào)用了onSubmit(inputVal)。這意味著當(dāng)表單提交時(shí),InputField會將inputVal“回傳”給父組件。
  • 添加了類型檢查if (onSubmit && typeof onSubmit === 'function')以增強(qiáng)健壯性。

2. 修改父組件:App.js

接下來,我們需要在App組件中定義一個(gè)狀態(tài)來存儲從InputField接收到的數(shù)據(jù),并創(chuàng)建一個(gè)回調(diào)函數(shù)傳遞給InputField。

小鴿子助手
小鴿子助手

一款集成于WPS/Word的智能寫作插件

小鴿子助手13
查看詳情 小鴿子助手
// App.js
import './App.css';
import AccountNumber from "./components/AccountNumber";
import InputField from "./components/InputField";
import { useEffect, useState } from "react";

function App() {
  // 狀態(tài)用于存儲從 InputField 接收到的地址值
  const [searchValue, setSearchValue] = useState(null); 

  // 狀態(tài)用于存儲API返回的tokens數(shù)據(jù)
  const [tokens, setTokens] = useState([]);
  // 狀態(tài)用于管理加載狀態(tài)
  const [loading, setLoading] = useState(false);

  // 定義一個(gè)回調(diào)函數(shù),用于接收 InputField 傳遞過來的值
  const handleSearchSubmit = (val) => {
    setSearchValue(val); // 更新 searchValue 狀態(tài)
  };

  // useEffect 鉤子用于在 searchValue 變化時(shí)觸發(fā)數(shù)據(jù)請求
  useEffect(() => {
    // 只有當(dāng) searchValue 不為 null 且不為空字符串時(shí)才進(jìn)行數(shù)據(jù)請求
    if (searchValue) { 
      setLoading(true);
      fetch(`https://api.multiversx.com/accounts/${searchValue}/tokens`)
        .then(response => response.json())
        .then(json => setTokens(json))
        .finally(() => {
          setLoading(false);
        });
      console.log("App組件發(fā)起請求,searchValue:", searchValue);
    }
    // 依賴數(shù)組包含 searchValue,確保當(dāng) searchValue 改變時(shí) useEffect 重新運(yùn)行
  }, [searchValue]); 

  // ... (其他輔助函數(shù),如 round, numberWithSpaces 保持不變)

  return (
    <content className="content">
        <div className="up-side">
            <div className="account-number-box">
                <p id="p-account-number">Total number of accounts</p>
                <p id="account-number"><AccountNumber/></p>
            </div>
            <div className="adress-search">
                {/* 將 handleSearchSubmit 函數(shù)作為 onSubmit prop 傳遞給 InputField */}
                <InputField onSubmit={handleSearchSubmit} /> 
            </div>
            {/* 可以顯示當(dāng)前 searchValue 進(jìn)行調(diào)試 */}
            <p>當(dāng)前搜索地址: {searchValue || '未輸入'}</p>
        </div>
        <div className="down-side">
            <table className="Token-section-output">
              {loading ? (
                <div>Loading...</div>
              ) : (
                <>
                  <h1>Tokens</h1>
                  <table className='Token-section-output' border={0}>
                    <tr className='token-row-type'>
                      <th className='token-column'>Name</th>
                      <th className='center-column'>Price</th>
                      <th>Hold</th>
                    </tr>
                    <tr className="space20"/>
                    {tokens.map(token => (
                      <tr className='token-row' key={token.id}>
                        <td className='token-column'>
                        <img className="img-Tokens" src = {token?.assets?.pngUrl ?? "img/Question.png"} /> 
                          <p>{token.name}</p> 
                        </td>
                        <td className='center-column'> <p>${round(token.price, 10000000)}</p> </td>
                        <td> 
                          <p>{round(token.balance / Math.pow(10, token.decimals), 10000000)}</p> 
                          <p className='token-hold'>${round(token.valueUsd, 10000000)}</p>
                        </td>
                      </tr>
                    ))}
                  </table>
                </>
              )}
            </table>
        </div>   
    </content>
  );
}

// 輔助函數(shù)(保持不變)
function round(nr, ten) { 
    return Math.round(nr * ten) / ten;
}

function numberWithSpaces(nr) { 
    return nr.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
}

export default App;
登錄后復(fù)制

關(guān)鍵點(diǎn):

  • useState(null): App組件引入了一個(gè)新的狀態(tài)變量searchValue,初始值為null,用于存儲從InputField獲取的地址。
  • handleSearchSubmit回調(diào)函數(shù): 定義了一個(gè)名為handleSearchSubmit的函數(shù)。當(dāng)InputField調(diào)用它時(shí),會將傳入的val更新到searchValue狀態(tài)。
  • <InputField onSubmit={handleSearchSubmit} />: 在渲染InputField時(shí),將handleSearchSubmit函數(shù)作為onSubmit prop傳遞給它。這是實(shí)現(xiàn)子組件向父組件通信的關(guān)鍵。
  • useEffect依賴項(xiàng): useEffect現(xiàn)在依賴于searchValue。這意味著每當(dāng)searchValue狀態(tài)更新時(shí)(即用戶提交了新的地址),useEffect中的數(shù)據(jù)請求邏輯就會重新執(zhí)行,使用新的地址發(fā)起API請求。
  • 條件請求: 在useEffect內(nèi)部添加了if (searchValue)的判斷,確保只有當(dāng)searchValue有實(shí)際值時(shí)才發(fā)起API請求,避免在組件首次渲染時(shí)(searchValue為null)立即請求。
  • 組件渲染方式: 重要提示:在JSX中渲染React組件時(shí),應(yīng)使用標(biāo)簽語法<InputField />,而不是像調(diào)用普通函數(shù)那樣InputField()。InputField()會直接執(zhí)行組件函數(shù)并返回JSX元素,而<InputField />則會觸發(fā)React的組件生命周期和優(yōu)化機(jī)制。原始問題代碼中的{InputField()}是一個(gè)常見的誤區(qū),應(yīng)修正為<InputField onSubmit={handleSearchSubmit} />。

總結(jié)與注意事項(xiàng)

通過以上步驟,我們成功地實(shí)現(xiàn)了React中子組件向父組件傳遞數(shù)據(jù)的功能。這種模式是React應(yīng)用中組件間通信的基石,被稱為“提升狀態(tài)”(Lifting State Up)。

核心概念回顧:

  1. 單向數(shù)據(jù)流: 數(shù)據(jù)從父組件流向子組件。
  2. 回調(diào)函數(shù): 父組件定義一個(gè)回調(diào)函數(shù),并通過props傳遞給子組件。
  3. 子組件調(diào)用回調(diào): 子組件在需要傳遞數(shù)據(jù)時(shí),調(diào)用父組件傳遞過來的回調(diào)函數(shù),并將數(shù)據(jù)作為參數(shù)傳入。
  4. 父組件更新狀態(tài): 父組件在回調(diào)函數(shù)中接收到數(shù)據(jù)后,更新自己的狀態(tài),從而觸發(fā)重新渲染。
  5. useEffect與依賴項(xiàng): 當(dāng)父組件的狀態(tài)(如searchValue)更新時(shí),可以使用useEffect來響應(yīng)這些變化,執(zhí)行副作用(如API請求)。useEffect的依賴項(xiàng)數(shù)組確保了其在正確的時(shí)間點(diǎn)執(zhí)行。

注意事項(xiàng):

  • 避免直接調(diào)用組件函數(shù): 始終使用JSX標(biāo)簽語法<Component />來渲染React組件,而不是Component()。
  • 狀態(tài)管理: 在父組件中管理從子組件接收到的數(shù)據(jù),是React數(shù)據(jù)流的推薦實(shí)踐。
  • 清晰的命名: 為回調(diào)函數(shù)和props使用清晰、描述性的名稱,提高代碼可讀性。例如,onSubmit明確表示這是一個(gè)提交事件的回調(diào)。

掌握這種通信模式對于構(gòu)建復(fù)雜的、交互性強(qiáng)的React應(yīng)用至關(guān)重要。

以上就是React組件間通信:從子組件向父組件傳遞數(shù)據(jù)實(shí)踐的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級免費(fèi)優(yōu)化軟件
最佳 Windows 性能的頂級免費(fèi)優(yōu)化軟件

每個(gè)人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號