admin管理员组文章数量:1287526
I am trying to understand some concepts in reactjs, but I'm unable to understand nesting of functions. I created the below example for investigating my concern.
In the below example, I'm rendering some content the value of which is ing from a series of nested functions. However, I get the error "Uncaught TypeError: Cannot read property 'renderInnerContent' of undefined". Can you please help me understand what's happening and how to resolve this problem? My primary motive is to understand how to abstract things into different functions.
import React, { Component } from 'react';
export default class MyComponent extends Component {
renderInnerContent() {
return (
<div>Innercontent</div>
)
}
renderContent() {
let data = ["a","b","c"];
const displaydata = data.map(function(point){
return (
<div key={point}>{this.renderInnerContent()}</div>
)
});
return (
<div>{displaydata}</div>
)
}
render() {
return (
<div>{this.renderContent()}</div>
)
}
}
I am trying to understand some concepts in reactjs, but I'm unable to understand nesting of functions. I created the below example for investigating my concern.
In the below example, I'm rendering some content the value of which is ing from a series of nested functions. However, I get the error "Uncaught TypeError: Cannot read property 'renderInnerContent' of undefined". Can you please help me understand what's happening and how to resolve this problem? My primary motive is to understand how to abstract things into different functions.
import React, { Component } from 'react';
export default class MyComponent extends Component {
renderInnerContent() {
return (
<div>Innercontent</div>
)
}
renderContent() {
let data = ["a","b","c"];
const displaydata = data.map(function(point){
return (
<div key={point}>{this.renderInnerContent()}</div>
)
});
return (
<div>{displaydata}</div>
)
}
render() {
return (
<div>{this.renderContent()}</div>
)
}
}
Share
Improve this question
edited May 8, 2016 at 8:08
asanas
asked May 8, 2016 at 8:03
asanasasanas
4,28015 gold badges52 silver badges82 bronze badges
4 Answers
Reset to default 9this
is not defined in that function's context:
function(point){
return (
<div key={point}>{this.renderInnerContent()}</div>
)
}
Because it is a new function.
You have different options to pass this
to that function:
1- Fat arrow function:
renderContent() {
let data = ["a","b","c"];
const displaydata = data.map((point) => {
return (
<div key={point}>{this.renderInnerContent()}</div>
)
});
return (
<div>{displaydata}</div>
)
}
2- Define a variable:
renderContent() {
let data = ["a","b","c"];
let _this = this;
const displaydata = data.map(function(point){
return (
<div key={point}>{_this.renderInnerContent()}</div>
)
});
return (
<div>{displaydata}</div>
)
}
3- Use bind
:
renderContent() {
let data = ["a","b","c"];
const displaydata = data.map(function(point){
return (
<div key={point}>{this.renderInnerContent()}</div>
)
}.bind(this));
return (
<div>{displaydata}</div>
)
}
PS: Not sure any of these is not working in React.
The context changes inside the map function, therefore "this" points to something else. If you want to have the "proper" this you could use an arrow function, which has lexical "this".
const displaydata = data.map(point => {
return (
<div key={point}>{this.renderInnerContent()}</div>
)
});
The main issue here is that you are passing a function to data.map and in that scope 'this' is not your outer scope (ChartsArea) but it refers by the default to the global object (window) because it's an anonymous function.
So to make it work you could do this:
var that = this;
const displaydata = data.map(function(point){
return (
<div key={point}>{that.renderInnerContent()}</div>
)
});
Or pass your context in the second argument of .map:
const displaydata = data.map(function(point){
return (
<div key={point}>{that.renderInnerContent()}</div>
)
}, this);
Or use bind:
const displaydata = data.map(function(point){
return (
<div key={point}>{that.renderInnerContent()}</div>
)
}.bind(this));
Or use arrow functions as somebody else pointed out.
The shortest one that I use is this:
<div>{this.renderContent.bind(this).call()}</div>
.
Sometimes they get a bit ugly from my standpoints but it's the shortest one.
本文标签: javascriptNesting Functions in JSStack Overflow
版权声明:本文标题:javascript - Nesting Functions in JS - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741311633a2371680.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论