React - this.props.appRecommendData.map is not a function
I am a beginner at ReactJS, I aim to make an app searching web application. Here is my idea:
In app.js
, I have a state: appRecommendData
which retrieve the result from the app store API and do searching by a function filterAppRecommend()
, and then rendered by a component called AppRecommend
, I found that I cannot render the result initially, but it works after typing, because of the async problem(when I still fetching the data, the export function have started), then I tried to add async
and await
to solve it, it works but the props.map
is not function, can anyone help to solve it/suggest other way to fix it? below is my code:
app.js
:
class App extends Component {
constructor(props) {
super(props);
this.state = {
filteredAppList: ,
filteredRecommend:filterAppRecommend("",10)
};
}
handleSearchChange = event =>{
this.setState({
filteredRecommend:filterAppRecommend(event.target.value,10)
});
}
render() {
return (
<div className="App">
<header className="App-header">
<div className="search-bar"><SearchInput textChange={this.handleSearchChange} /></div>
<div className="App-recommendation">
<AppRecommend appRecommendData={this.state.filteredRecommend}/>
</div>
</header>
</div>
);
}
}
}
InfilterAppRecommend.js
:
export default async function filterAppRecommend(searchText, maxResults) {
console.log("maxResults is"+maxResults);
const api = await fetch("https://itunes.apple.com/hk/rss/topgrossingapplications/limit=10/json")
.then(results=>results.json());
console.log(api);
let datas = api.feed.entry;
console.log(datas);
return datas.filter(data => {
if(searchText===""){
return true;
}
if (data["im:name"].label.toLowerCase().includes(searchText.toLowerCase())) {
return true;
}
if (data["im:name"].label.includes(searchText)) {
return true;
}
return false;
})
.slice(0, maxResults);
}
In Component AppRecommend
:
class AppRecommmend extends PureComponent{
constructor(props){
super(props);
this.state = {
isLoading:false,
};
}
render(){
console.log(this.props.appRecommendData.type); //will show undefined
return(
<div className="component-AppRecommend">
{this.props.appRecommendData.map(appRecommendData=>(
<AppRecommmendCol
imgSource={appRecommendData["im:image"][1].label}
title={appRecommendData["im:name"].label}/>
))}
</div>
);}
}
AppRecommmend.propTypes = {
appRecommendData: PropTypes.oneOfType([
PropTypes.object,
PropTypes.array
])
}
export default AppRecommmend
javascript ajax reactjs web-applications async-await
add a comment |
I am a beginner at ReactJS, I aim to make an app searching web application. Here is my idea:
In app.js
, I have a state: appRecommendData
which retrieve the result from the app store API and do searching by a function filterAppRecommend()
, and then rendered by a component called AppRecommend
, I found that I cannot render the result initially, but it works after typing, because of the async problem(when I still fetching the data, the export function have started), then I tried to add async
and await
to solve it, it works but the props.map
is not function, can anyone help to solve it/suggest other way to fix it? below is my code:
app.js
:
class App extends Component {
constructor(props) {
super(props);
this.state = {
filteredAppList: ,
filteredRecommend:filterAppRecommend("",10)
};
}
handleSearchChange = event =>{
this.setState({
filteredRecommend:filterAppRecommend(event.target.value,10)
});
}
render() {
return (
<div className="App">
<header className="App-header">
<div className="search-bar"><SearchInput textChange={this.handleSearchChange} /></div>
<div className="App-recommendation">
<AppRecommend appRecommendData={this.state.filteredRecommend}/>
</div>
</header>
</div>
);
}
}
}
InfilterAppRecommend.js
:
export default async function filterAppRecommend(searchText, maxResults) {
console.log("maxResults is"+maxResults);
const api = await fetch("https://itunes.apple.com/hk/rss/topgrossingapplications/limit=10/json")
.then(results=>results.json());
console.log(api);
let datas = api.feed.entry;
console.log(datas);
return datas.filter(data => {
if(searchText===""){
return true;
}
if (data["im:name"].label.toLowerCase().includes(searchText.toLowerCase())) {
return true;
}
if (data["im:name"].label.includes(searchText)) {
return true;
}
return false;
})
.slice(0, maxResults);
}
In Component AppRecommend
:
class AppRecommmend extends PureComponent{
constructor(props){
super(props);
this.state = {
isLoading:false,
};
}
render(){
console.log(this.props.appRecommendData.type); //will show undefined
return(
<div className="component-AppRecommend">
{this.props.appRecommendData.map(appRecommendData=>(
<AppRecommmendCol
imgSource={appRecommendData["im:image"][1].label}
title={appRecommendData["im:name"].label}/>
))}
</div>
);}
}
AppRecommmend.propTypes = {
appRecommendData: PropTypes.oneOfType([
PropTypes.object,
PropTypes.array
])
}
export default AppRecommmend
javascript ajax reactjs web-applications async-await
Please try and format your code, as it's quite hard to read.filterAppRecommend
is asynchronous, so you can't usex
directly the way you do in the constructor ofApp
.
– Tholle
Nov 15 '18 at 14:55
Formatted some of them, see if it is better. Thank you so much!
– Eric Kwan
Nov 15 '18 at 15:00
add a comment |
I am a beginner at ReactJS, I aim to make an app searching web application. Here is my idea:
In app.js
, I have a state: appRecommendData
which retrieve the result from the app store API and do searching by a function filterAppRecommend()
, and then rendered by a component called AppRecommend
, I found that I cannot render the result initially, but it works after typing, because of the async problem(when I still fetching the data, the export function have started), then I tried to add async
and await
to solve it, it works but the props.map
is not function, can anyone help to solve it/suggest other way to fix it? below is my code:
app.js
:
class App extends Component {
constructor(props) {
super(props);
this.state = {
filteredAppList: ,
filteredRecommend:filterAppRecommend("",10)
};
}
handleSearchChange = event =>{
this.setState({
filteredRecommend:filterAppRecommend(event.target.value,10)
});
}
render() {
return (
<div className="App">
<header className="App-header">
<div className="search-bar"><SearchInput textChange={this.handleSearchChange} /></div>
<div className="App-recommendation">
<AppRecommend appRecommendData={this.state.filteredRecommend}/>
</div>
</header>
</div>
);
}
}
}
InfilterAppRecommend.js
:
export default async function filterAppRecommend(searchText, maxResults) {
console.log("maxResults is"+maxResults);
const api = await fetch("https://itunes.apple.com/hk/rss/topgrossingapplications/limit=10/json")
.then(results=>results.json());
console.log(api);
let datas = api.feed.entry;
console.log(datas);
return datas.filter(data => {
if(searchText===""){
return true;
}
if (data["im:name"].label.toLowerCase().includes(searchText.toLowerCase())) {
return true;
}
if (data["im:name"].label.includes(searchText)) {
return true;
}
return false;
})
.slice(0, maxResults);
}
In Component AppRecommend
:
class AppRecommmend extends PureComponent{
constructor(props){
super(props);
this.state = {
isLoading:false,
};
}
render(){
console.log(this.props.appRecommendData.type); //will show undefined
return(
<div className="component-AppRecommend">
{this.props.appRecommendData.map(appRecommendData=>(
<AppRecommmendCol
imgSource={appRecommendData["im:image"][1].label}
title={appRecommendData["im:name"].label}/>
))}
</div>
);}
}
AppRecommmend.propTypes = {
appRecommendData: PropTypes.oneOfType([
PropTypes.object,
PropTypes.array
])
}
export default AppRecommmend
javascript ajax reactjs web-applications async-await
I am a beginner at ReactJS, I aim to make an app searching web application. Here is my idea:
In app.js
, I have a state: appRecommendData
which retrieve the result from the app store API and do searching by a function filterAppRecommend()
, and then rendered by a component called AppRecommend
, I found that I cannot render the result initially, but it works after typing, because of the async problem(when I still fetching the data, the export function have started), then I tried to add async
and await
to solve it, it works but the props.map
is not function, can anyone help to solve it/suggest other way to fix it? below is my code:
app.js
:
class App extends Component {
constructor(props) {
super(props);
this.state = {
filteredAppList: ,
filteredRecommend:filterAppRecommend("",10)
};
}
handleSearchChange = event =>{
this.setState({
filteredRecommend:filterAppRecommend(event.target.value,10)
});
}
render() {
return (
<div className="App">
<header className="App-header">
<div className="search-bar"><SearchInput textChange={this.handleSearchChange} /></div>
<div className="App-recommendation">
<AppRecommend appRecommendData={this.state.filteredRecommend}/>
</div>
</header>
</div>
);
}
}
}
InfilterAppRecommend.js
:
export default async function filterAppRecommend(searchText, maxResults) {
console.log("maxResults is"+maxResults);
const api = await fetch("https://itunes.apple.com/hk/rss/topgrossingapplications/limit=10/json")
.then(results=>results.json());
console.log(api);
let datas = api.feed.entry;
console.log(datas);
return datas.filter(data => {
if(searchText===""){
return true;
}
if (data["im:name"].label.toLowerCase().includes(searchText.toLowerCase())) {
return true;
}
if (data["im:name"].label.includes(searchText)) {
return true;
}
return false;
})
.slice(0, maxResults);
}
In Component AppRecommend
:
class AppRecommmend extends PureComponent{
constructor(props){
super(props);
this.state = {
isLoading:false,
};
}
render(){
console.log(this.props.appRecommendData.type); //will show undefined
return(
<div className="component-AppRecommend">
{this.props.appRecommendData.map(appRecommendData=>(
<AppRecommmendCol
imgSource={appRecommendData["im:image"][1].label}
title={appRecommendData["im:name"].label}/>
))}
</div>
);}
}
AppRecommmend.propTypes = {
appRecommendData: PropTypes.oneOfType([
PropTypes.object,
PropTypes.array
])
}
export default AppRecommmend
javascript ajax reactjs web-applications async-await
javascript ajax reactjs web-applications async-await
edited Nov 15 '18 at 14:56
Eric Kwan
asked Nov 15 '18 at 14:52
Eric KwanEric Kwan
11
11
Please try and format your code, as it's quite hard to read.filterAppRecommend
is asynchronous, so you can't usex
directly the way you do in the constructor ofApp
.
– Tholle
Nov 15 '18 at 14:55
Formatted some of them, see if it is better. Thank you so much!
– Eric Kwan
Nov 15 '18 at 15:00
add a comment |
Please try and format your code, as it's quite hard to read.filterAppRecommend
is asynchronous, so you can't usex
directly the way you do in the constructor ofApp
.
– Tholle
Nov 15 '18 at 14:55
Formatted some of them, see if it is better. Thank you so much!
– Eric Kwan
Nov 15 '18 at 15:00
Please try and format your code, as it's quite hard to read.
filterAppRecommend
is asynchronous, so you can't use x
directly the way you do in the constructor of App
.– Tholle
Nov 15 '18 at 14:55
Please try and format your code, as it's quite hard to read.
filterAppRecommend
is asynchronous, so you can't use x
directly the way you do in the constructor of App
.– Tholle
Nov 15 '18 at 14:55
Formatted some of them, see if it is better. Thank you so much!
– Eric Kwan
Nov 15 '18 at 15:00
Formatted some of them, see if it is better. Thank you so much!
– Eric Kwan
Nov 15 '18 at 15:00
add a comment |
1 Answer
1
active
oldest
votes
Since you use .map to go through collection of data, appRecommendData should be an array. filterAppRecommend should return data as array. You can use sth like this to get initial value:
//App.js
async componentDidMount() {
const filteredRecommend = await filterAppRecommend("",10);
this.setState({ filteredRecommend });
}
In AppRecommmend.js use
AppRecommmend.defaultProps = {
appRecommendData :
}
It can shows all the results initially but the Type error happens again when I type in the search input.
– Eric Kwan
Nov 15 '18 at 15:48
So in handleSearchChange() you can use asyncawaitconst filteredRecommend = await filterAppRecommend(e.target.value)
and then setState(), like in CDM.
– miuosh
Nov 15 '18 at 15:51
When filtering I suggest to use debounce function from lodash library to delay ajax call, because on every key press you will produce new ajax call.
– miuosh
Nov 15 '18 at 15:55
e is an event in your case
– miuosh
Nov 15 '18 at 16:09
fixed, thanks to all guys!
– Eric Kwan
Nov 15 '18 at 16:12
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53322106%2freact-this-props-apprecommenddata-map-is-not-a-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Since you use .map to go through collection of data, appRecommendData should be an array. filterAppRecommend should return data as array. You can use sth like this to get initial value:
//App.js
async componentDidMount() {
const filteredRecommend = await filterAppRecommend("",10);
this.setState({ filteredRecommend });
}
In AppRecommmend.js use
AppRecommmend.defaultProps = {
appRecommendData :
}
It can shows all the results initially but the Type error happens again when I type in the search input.
– Eric Kwan
Nov 15 '18 at 15:48
So in handleSearchChange() you can use asyncawaitconst filteredRecommend = await filterAppRecommend(e.target.value)
and then setState(), like in CDM.
– miuosh
Nov 15 '18 at 15:51
When filtering I suggest to use debounce function from lodash library to delay ajax call, because on every key press you will produce new ajax call.
– miuosh
Nov 15 '18 at 15:55
e is an event in your case
– miuosh
Nov 15 '18 at 16:09
fixed, thanks to all guys!
– Eric Kwan
Nov 15 '18 at 16:12
add a comment |
Since you use .map to go through collection of data, appRecommendData should be an array. filterAppRecommend should return data as array. You can use sth like this to get initial value:
//App.js
async componentDidMount() {
const filteredRecommend = await filterAppRecommend("",10);
this.setState({ filteredRecommend });
}
In AppRecommmend.js use
AppRecommmend.defaultProps = {
appRecommendData :
}
It can shows all the results initially but the Type error happens again when I type in the search input.
– Eric Kwan
Nov 15 '18 at 15:48
So in handleSearchChange() you can use asyncawaitconst filteredRecommend = await filterAppRecommend(e.target.value)
and then setState(), like in CDM.
– miuosh
Nov 15 '18 at 15:51
When filtering I suggest to use debounce function from lodash library to delay ajax call, because on every key press you will produce new ajax call.
– miuosh
Nov 15 '18 at 15:55
e is an event in your case
– miuosh
Nov 15 '18 at 16:09
fixed, thanks to all guys!
– Eric Kwan
Nov 15 '18 at 16:12
add a comment |
Since you use .map to go through collection of data, appRecommendData should be an array. filterAppRecommend should return data as array. You can use sth like this to get initial value:
//App.js
async componentDidMount() {
const filteredRecommend = await filterAppRecommend("",10);
this.setState({ filteredRecommend });
}
In AppRecommmend.js use
AppRecommmend.defaultProps = {
appRecommendData :
}
Since you use .map to go through collection of data, appRecommendData should be an array. filterAppRecommend should return data as array. You can use sth like this to get initial value:
//App.js
async componentDidMount() {
const filteredRecommend = await filterAppRecommend("",10);
this.setState({ filteredRecommend });
}
In AppRecommmend.js use
AppRecommmend.defaultProps = {
appRecommendData :
}
answered Nov 15 '18 at 15:26
miuoshmiuosh
12312
12312
It can shows all the results initially but the Type error happens again when I type in the search input.
– Eric Kwan
Nov 15 '18 at 15:48
So in handleSearchChange() you can use asyncawaitconst filteredRecommend = await filterAppRecommend(e.target.value)
and then setState(), like in CDM.
– miuosh
Nov 15 '18 at 15:51
When filtering I suggest to use debounce function from lodash library to delay ajax call, because on every key press you will produce new ajax call.
– miuosh
Nov 15 '18 at 15:55
e is an event in your case
– miuosh
Nov 15 '18 at 16:09
fixed, thanks to all guys!
– Eric Kwan
Nov 15 '18 at 16:12
add a comment |
It can shows all the results initially but the Type error happens again when I type in the search input.
– Eric Kwan
Nov 15 '18 at 15:48
So in handleSearchChange() you can use asyncawaitconst filteredRecommend = await filterAppRecommend(e.target.value)
and then setState(), like in CDM.
– miuosh
Nov 15 '18 at 15:51
When filtering I suggest to use debounce function from lodash library to delay ajax call, because on every key press you will produce new ajax call.
– miuosh
Nov 15 '18 at 15:55
e is an event in your case
– miuosh
Nov 15 '18 at 16:09
fixed, thanks to all guys!
– Eric Kwan
Nov 15 '18 at 16:12
It can shows all the results initially but the Type error happens again when I type in the search input.
– Eric Kwan
Nov 15 '18 at 15:48
It can shows all the results initially but the Type error happens again when I type in the search input.
– Eric Kwan
Nov 15 '18 at 15:48
So in handleSearchChange() you can use asyncawait
const filteredRecommend = await filterAppRecommend(e.target.value)
and then setState(), like in CDM.– miuosh
Nov 15 '18 at 15:51
So in handleSearchChange() you can use asyncawait
const filteredRecommend = await filterAppRecommend(e.target.value)
and then setState(), like in CDM.– miuosh
Nov 15 '18 at 15:51
When filtering I suggest to use debounce function from lodash library to delay ajax call, because on every key press you will produce new ajax call.
– miuosh
Nov 15 '18 at 15:55
When filtering I suggest to use debounce function from lodash library to delay ajax call, because on every key press you will produce new ajax call.
– miuosh
Nov 15 '18 at 15:55
e is an event in your case
– miuosh
Nov 15 '18 at 16:09
e is an event in your case
– miuosh
Nov 15 '18 at 16:09
fixed, thanks to all guys!
– Eric Kwan
Nov 15 '18 at 16:12
fixed, thanks to all guys!
– Eric Kwan
Nov 15 '18 at 16:12
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53322106%2freact-this-props-apprecommenddata-map-is-not-a-function%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Please try and format your code, as it's quite hard to read.
filterAppRecommend
is asynchronous, so you can't usex
directly the way you do in the constructor ofApp
.– Tholle
Nov 15 '18 at 14:55
Formatted some of them, see if it is better. Thank you so much!
– Eric Kwan
Nov 15 '18 at 15:00