javascript - 如何在反应中将函数传递给另一个组件
问题描述
我是新手,所以我有以下组件:
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 函数,就像这样 <Nav onSearch={this.performSearch }/> {/*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;
解决方案
问题是您使用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
.
您还可以使用对象解构语法直接访问函数:
Header 组件(使用对象解构)
// 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>
);
};
推荐阅读
- ios - 像在 Safari 中一样将 UIProgressView 添加到 UISearchBar
- jenkins - 使用带有 config.xml 的 curl 创建作业将在单行的 Execute shell/Pipeline 部分下的代码没有缩进
- javascript - 如何在更新面板中更新谷歌地图标记?
- java - 使用 Jmeter 发送 SNMP 陷阱
- informix - 如何在informix中获取表的块列表?
- junit - 将 Powermock 与 Mockito 集成 - java.lang.NoSuchMethodError
- c# - 将有关字段日期时间的前后图像设置为字段文本
- reporting-services - 如何在 SSRS“Code.SumLookup(LookupSet)”函数中使用连接命令?
- latex - 删除 epslatex/gnuplot 中不必要的边距
- gmail-api - 如何使用发送日期时间创建电子邮件(稍后发送/预定)