如何使用 React Hooks 在另一个组件中获取表单的输入值

Posted

技术标签:

【中文标题】如何使用 React Hooks 在另一个组件中获取表单的输入值【英文标题】:How to fetch the input value of a form in another component with React Hooks 【发布时间】:2021-08-01 17:32:53 【问题描述】:

我已将 Axios 与 Reach Hooks 一起使用。有什么方法可以从 form.js 文件中获取更新的输入值,以便我可以使用它来更新 ApiData.js 文件中的 axios.get 链接?当用户键入一个值时,我想获取该值并在 ApiData.js 文件中使用,以便可以在 axios.get 中更新该值。我尝试了很多方法来做到这一点,将 form.js 文件中的 updatedInputVal 传递给一个函数,然后尝试在 ApiData.js 文件中访问它。没有任何效果。我是初学者。因此,如果您不清楚这个问题,请告诉我。提前致谢

这是 form.js 文件

import React, useState from 'react';

function UseForm()
    const[inputValue, setInputValue] = useState(
        search: "",
        contactName:"",
        contact:""
    )

    function handleChange(e)
        const name, value = e.target;
        setInputValue(previousValue=>
            if(name === "search")
                return
                    search: value,
                    contactName:previousValue.contactName,
                    contact:previousValue.contact   
                
            
        )
    

    function onFormSubmit(event)
        let updatedInputVal = setInputValue(inputValue.search)
        event.preventDefault();
        return updatedInputVal;//Want to fetch this value and use it in the ApiData.js component
    



    return ( 
        <div className="form-container">
            <div className="input-div">
                <form onSubmit=onFormSubmit>
                    <input className="form-input" onChange=handleChange type="text" name="search" value=inputValue.search placeholder="Search TV Shows"/>
                </form>
            </div>
            <div className="btn-div">
                <button type="submit" className="btn">Submit</button>    
            </div>
        </div>)




export default UseForm;

这是 ApiData.js 文件

import React, useState, useEffect from 'react';
import axios from 'axios';
    

const FetchApiData = () =>
    const [data, setData] = useState([])
    useEffect(()=>
        async function fetchData()
        const resquest =  await axios.get(`http://api.tvmaze.com/search/shows?q=$//want to insert here the updated input value the user types`)
        const appData =  resquest.data[0].show.image.medium;
        setData(appData)
        return appData
      fetchData()
    , [])
    
    return (
            <div className="section-image">
                <img src=data />
            </div>
            ) 


export default FetchApiData

App.js 文件

import React from 'react';
import Nav from "./Nav";
import UseForm from "./Form"
import FetchApiData from './ApiData'


function App()
    return (
    <div>
        <Nav 
        src=`$process.env.PUBLIC_URL/images/logo.png`
        title = "CONTACT US"
        />
        <UseForm/>
        <FetchApiData/>
    </div>)


export default App

【问题讨论】:

【参考方案1】:

您需要将inputValue 状态提升App 组件并通过props 传递它:

function App()
    const [inputValue, setInputValue] = useState(
        search: "",
        contactName:"",
        contact:""
    )
    return (
    <div>
        <Nav 
        src=`$process.env.PUBLIC_URL/images/logo.png`
        title = "CONTACT US"
        />
        <UseForm inputValue=inputValue setInputValue=setInputValue/>
        <FetchApiData inputValue=inputValue/>
    </div>)


function UseForm(inputValue, setInputValue)
 // ...

此外,像Redux 这样的状态管理解决方案还可以帮助管理与组件分开的状态,这样您就不需要像上面显示的那样通过道具传递状态。

【讨论】:

【参考方案2】:

因为App 组件是FetchApiDataUseForm 的父组件,您可以简单地使用App 组件处理此值的状态并将此属性传递给两个子组件。

App组件:

function App()

    // declare state object here
    const [inputValue, setInputValue] = useState(
        search: "",
        contactName:"",
        contact:""
    );

    return (
    <div>
        <Nav 
        src=`$process.env.PUBLIC_URL/images/logo.png`
        title = "CONTACT US"
        />
        /* Pass props to each component */
        <UseForm inputValue=inputValue setInputValue=setInputValue/>
        <FetchApiData inputValue=inputValue/>
    </div>)

UseForm组件:

function UseForm(inputValue, setInputValue)
    // Remove this
    // const[inputValue, setInputValue] = useState(
    //     search: "",
    //     contactName:"",
    //     contact:""
    // )

    // keep everything else the same

FetchApiData组件:

const FetchApiData = (inputValue) =>
    const [data, setData] = useState([])
    useEffect(()=>
        async function fetchData()
        const resquest =  await axios.get(`http://api.tvmaze.com/search/shows?q=$inputValue`)
        const appData =  resquest.data[0].show.image.medium;
        setData(appData)
        return appData
      fetchData()
    , [inputValue])
    
    return (
            <div className="section-image">
                <img src=data />
            </div>
            ) 

FetchApiData 将在每次 inputValue 更改时重新渲染。请注意这一点,除非它是预期的行为。

【讨论】:

太棒了!很高兴听到它?

以上是关于如何使用 React Hooks 在另一个组件中获取表单的输入值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 react-hooks (useEffect) 缓冲流数据以便能够一次更新另一个组件以避免多次重新渲染?

使用 React-Hooks 单击按钮后如何显示不同的组件?

如何使用 React Hooks 实现复杂组件的状态管理

使用 React Hooks 卸载组件时如何访问状态?

React Hooks-当我在另一个选择上选择一个选项时更改选择选项

如何使用 React Hooks 将具有构造函数的类转换为功能组件?