【问题标题】:How to pass a function into another component in react如何在反应中将函数传递给另一个组件
【发布时间】:2019-06-16 13:17:43
【问题描述】:

我是新手,所以我有以下组件:

App组件这个组件有一个叫做performSearch的函数,它还渲染了一个Header组件

//this function will create the search feature
  performSearch = (text = 'dogs') => { //include text parameter from flickr api on url, and provide a default value for text parameter to display dog pics when the page first loads
     //fetch data from flickr
     axios
     .get(
       `https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=${apiKey}&text=${text}&per_page=24&format=json&nojsoncallback=1`
     )
     .then(response => {
       this.setState({
         pics: response.data.photos.photo
       });
     })
     .catch(error => {
       console.log("Something went wrong, could not access data", error);
     });
  };


  render() {
    //console.log(this.state.pics);
    return (
      //JSX inside ()
      <BrowserRouter>
        <div>
          <Header  //Render Header Component
          />

          <GalleryItem data={this.state.pics} />
          {/*pass data array to GalleryItem component */}
        </div>
      </BrowserRouter>
    );
  }
} //closes App

这是 Header 组件,我想做的是为 Header 内的 Nav 组件提供来自 App 组件的 performSearch 函数,例如 &lt;Nav onSearch={this.performSearch }/&gt; {/*Render Nav menu and pass performSearch function */} 我试图将该函数传递给位于 Header 中的 Nav,但它不是工作中,有人可以帮忙吗?

/* import react*/
import React from "react";

//import modules
import Form from "./Form";
import Nav from "./Nav";
import Gallery from "./Gallery";
// import Galleryitem from './Galleryitem'

/*Create a Header component that could store things 
like an app title, logo, nav and search bar.
 */
const Header = () => {
  return (
    //JSX inside ()
    <header>
      <Form /> {/*render the search bar*/}
       <Nav /> {/*Render Nav menu */}
      <Gallery /> {/*Render Gallery component  */}
    </header>
  );
};

/*Now export Header component so that we are able to import it 
  and use it within other components or modules of our app*/
export default Header;

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    问题是你使用this.performSearch 好像这样的函数是在Nav 组件中定义的,但事实并非如此。您必须performSearch 函数从App 传递给Nav

    应用组件

    render() {
        //console.log(this.state.pics);
        return (
            //JSX inside ()
            <BrowserRouter>
                <div>
                    {/* Pass the function as a prop down to Header */}
                    <Header onSearch={this.performSearch}/>
    
                    <GalleryItem data={this.state.pics} />
                    {/*pass data array to GalleryItem component */}
                </div>
            </BrowserRouter>
        );
    }
    

    标题组件

    // Accept component properties as first parameter
    const Header = (props) => {
        return (
            //JSX inside ()
            <header>
                <Form /> {/*render the search bar*/}
                    <Nav onSearch={props.onSearch}/> {/*Render Nav menu */}
                <Gallery /> {/*Render Gallery component  */}
            </header>
        );
    };
    

    请注意,您需要将props 定义为功能性Header 组件的参数才能访问performSearch

    您也可以使用对象解构语法直接访问函数:

    头组件(使用对象解构)

    // Accept component properties as first parameter
    const Header = ({ onSearch }) => {
        return (
            //JSX inside ()
            <header>
                <Form /> {/*render the search bar*/}
                    <Nav onSearch={onSearch}/> {/*Render Nav menu */}
                <Gallery /> {/*Render Gallery component  */}
            </header>
        );
    };
    

    【讨论】:

    • 这真的很有帮助!
    【解决方案2】:

    您需要将执行搜索传递给您的标题组件,然后再传递给您的导航组件。否则,您的导航组件无法访问 performSeach。此外,在传递 performSearch 时使用 bind 或箭头函数,否则 perFormSearch 将不会在您的应用组件上下文中执行。

    //this function will create the search feature
      performSearch = (text = 'dogs') => { //include text parameter from flickr api on url, and provide a default value for text parameter to display dog pics when the page first loads
         //fetch data from flickr
         axios
         .get(
           `https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=${apiKey}&text=${text}&per_page=24&format=json&nojsoncallback=1`
         )
         .then(response => {
           this.setState({
             pics: response.data.photos.photo
           });
         })
         .catch(error => {
           console.log("Something went wrong, could not access data", error);
         });
      };
    
    
      render() {
        //console.log(this.state.pics);
        return (
          //JSX inside ()
          <BrowserRouter>
            <div>
              <Header performSearch={this.performSearch.bind(this)}  //Render Header Component
              />
    
              <GalleryItem data={this.state.pics} />
              {/*pass data array to GalleryItem component */}
            </div>
          </BrowserRouter>
        );
      }
    } //closes
    
    import React from "react";
    
    //import modules
    import Form from "./Form";
    import Nav from "./Nav";
    import Gallery from "./Gallery";
    // import Galleryitem from './Galleryitem'
    
    /*Create a Header component that could store things 
    like an app title, logo, nav and search bar.
     */
    const Header = ({ performSearch, }) => {
      return (
        //JSX inside ()
        <header>
          <Form /> {/*render the search bar*/}
           <Nav onSearch={performSearch}/> {/*Render Nav menu */}
          <Gallery /> {/*Render Gallery component  */}
        </header>
      );
    };
    
    /*Now export Header component so that we are able to import it 
      and use it within other components or modules of our app*/
    export default Header;
    
    
    

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 2020-09-10
      • 2021-05-06
      • 2020-07-25
      • 2021-03-01
      • 1970-01-01
      • 2018-04-25
      • 2014-11-05
      • 2015-09-28
      相关资源
      最近更新 更多