簡體   English   中英

使用 React Hooks,我如何制作一個可重用的組件和父組件相互利用?

[英]Using React Hooks, how do I make a reusable component and parent component that utilize each other?

我想做什么?

根據父組件的需要,制作一個可以與父組件一起使用的可重用 React 組件。

當前嘗試執行此操作的代碼是什么?

可重用組件.js

import * from "react";

import MenuItem from "@material-ui/core/MenuItem";
import TextField from "@material-ui/core/TextField";

export default function ReusableComponent() {
    const [championClass, setChampionClass] = useState("");
        
    const handleChange = (e) => {
        setChampionClass(e.target.value);
    };

    return (
        <TextField
            onChange={handleChange}
            select
            value={championClass}
        >
            <MenuItem value={"Fighter"}>Fighter</MenuItem>
            <MenuItem value={"Mage"}>Mage</MenuItem>
            <MenuItem value={"Marksman"}>Marksman</MenuItem>
        </Textfield>
    );

父組件.js

import * from "react";

import ReusableComponent from "../ReusableComponent";

export default function ParentComponent() {
    // There's gonna be other parents such as forest, mountain, etc.)
    const [underwaterChampionClass, setUnderwaterChampionClass] 
        = useState("");

    const handleUnderwaterChampionClass = (e) => {
        setUnderwaterChampionClass(e.target.value)
        console.log(underwaterChampionClass);
    }

    return (
        <ReusableComponent 
            championClass={underwaterChampionClass} 
            setChampionClass={handleUnderwaterChampionClass}
        />
    )
}

我期望結果是什么?

當我從父級下拉列表中 select 一個值時,它通過“console.log”通過父組件反映。

實際結果是什么?

控制台中沒有填充任何內容。

我認為問題可能是什么?

我覺得我沒有正確連接組件,我不確定如何使用 React Hooks 解決這個問題,因為多個父組件將使用這個可重用的下拉組件。

您實際上並沒有使用從ParentComponent傳遞給ReusableComponent的道具,而是創建了兩個單獨的狀態。 您應該將ReusableComponent更改為:

import * from "react";

import MenuItem from "@material-ui/core/MenuItem";
import TextField from "@material-ui/core/TextField";

export default function ReusableComponent({
  value,
  handleChange
}) {
    return (
        <TextField
            onChange={e => handleChange(e.target.value)}
            select
            value={value}
        >
            <MenuItem value={"Fighter"}>Fighter</MenuItem>
            <MenuItem value={"Mage"}>Mage</MenuItem>
            <MenuItem value={"Marksman"}>Marksman</MenuItem>
        </Textfield>
    );

ParentComponent

import * from "react";

import ReusableComponent from "../ReusableComponent";

export default function ParentComponent() {
    // There's gonna be other parents such as forest, mountain, etc.)
    const [underwaterChampionClass, setUnderwaterChampionClass] 
        = useState("");

    const handleUnderwaterChampionClass = (newChampionClass) => {
        setUnderwaterChampionClass(newChampionClass)
        console.log(underwaterChampionClass);
    }

    return (
        <ReusableComponent 
            value={underwaterChampionClass} 
            handleChange={handleUnderwaterChampionClass}
        />
    )
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM