React - 向 Children 发送功能道具
React - send function props to Children
我看到了一些关于类似问题的问题,但不知何故我仍然无法解决我的问题,所以在这里我请求你的帮助。我是 React 的新手,想将一个函数从 Parent 发送到 child 然后从 Child 使用它但是不知何故当我想使用它时它说
Uncaught TypeError: Cannot read property 'props' of undefined"
在第一个答案有帮助后编辑代码:
var Menu = React.createClass({
links : [
{key : 1, name : "help", click : this.props.changePageHelp}
],
render : function() {
var menuItem = this.links.map(function(link){
return (
<li key={link.key} className="menu-help menu-link" onClick={link.click}>{link.name}</li>
)
});
return (
<ul>
{menuItem}
</ul>
)
}
});
var Admin = React.createClass ({
_changePageHelp : function() {
console.log('help');
},
render : function () {
return (
<div>
<div id="menu-admin"><Menu changePageHelp={this._changePageHelp.bind(this)} /></div>
</div>
)
}
});
ReactDOM.render(<Admin />, document.getElementById('admin'));
从 Menu 函数传递一个值并在 changePage Help 函数中接收它并且它起作用了。
var Menu = React.createClass({
render : function() {
return (
<div>
{this.props.changePageHelp('Hello')}
</div>
)
}
});
var Admin = React.createClass ({
_changePageHelp : function(help) {
return help;
},
render : function () {
return (
<div>
<div id="menu-admin"><Menu changePageHelp={this._changePageHelp.bind(this)} /></div>
</div>
)
}
});
ReactDOM.render(<Admin />, document.getElementById('admin'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react-dom.min.js"></script>
<div id="admin"></div>
出于性能原因,您应该避免在 JSX 属性中使用 bind
或箭头函数。这是因为为 map()
函数生成的每个实例创建了事件处理函数的副本。这在这里解释:https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md
为避免这种情况,您可以将重复的部分拉入其自己的组件中。这是一个演示: http://codepen.io/PiotrBerebecki/pen/EgvjmZ 父组件中的 console.log()
调用现在接收 link 的名称。例如,您可以在 React Router 中使用它。
var Admin = React.createClass ({
_changePageHelp : function(name) {
console.log(name);
},
render : function () {
return (
<div>
<div id="menu-admin">
<Menu changePageHelp={this._changePageHelp} />
</div>
</div>
);
}
});
var Menu = React.createClass({
getDefaultProps: function() {
return {
links: [
{key: 1, name: 'help'},
{key: 2, name: 'about'},
{key: 3, name: 'contact'}
]
};
},
render: function() {
var menuItem = this.props.links.map((link) => {
return (
<MenuItem key={link.key}
name={link.name}
changePageHelp={this.props.changePageHelp}
className="menu-help menu-link" />
);
});
return (
<ul>
{menuItem}
</ul>
);
}
});
var MenuItem = React.createClass ({
handleClick: function() {
this.props.changePageHelp(this.props.name);
},
render : function () {
return (
<li onClick={this.handleClick}>
Click me to console log in Admin component <b>{this.props.name}</b>
</li>
);
}
});
ReactDOM.render(<Admin />, document.getElementById('admin'));
我看到了一些关于类似问题的问题,但不知何故我仍然无法解决我的问题,所以在这里我请求你的帮助。我是 React 的新手,想将一个函数从 Parent 发送到 child 然后从 Child 使用它但是不知何故当我想使用它时它说
Uncaught TypeError: Cannot read property 'props' of undefined"
在第一个答案有帮助后编辑代码:
var Menu = React.createClass({
links : [
{key : 1, name : "help", click : this.props.changePageHelp}
],
render : function() {
var menuItem = this.links.map(function(link){
return (
<li key={link.key} className="menu-help menu-link" onClick={link.click}>{link.name}</li>
)
});
return (
<ul>
{menuItem}
</ul>
)
}
});
var Admin = React.createClass ({
_changePageHelp : function() {
console.log('help');
},
render : function () {
return (
<div>
<div id="menu-admin"><Menu changePageHelp={this._changePageHelp.bind(this)} /></div>
</div>
)
}
});
ReactDOM.render(<Admin />, document.getElementById('admin'));
从 Menu 函数传递一个值并在 changePage Help 函数中接收它并且它起作用了。
var Menu = React.createClass({
render : function() {
return (
<div>
{this.props.changePageHelp('Hello')}
</div>
)
}
});
var Admin = React.createClass ({
_changePageHelp : function(help) {
return help;
},
render : function () {
return (
<div>
<div id="menu-admin"><Menu changePageHelp={this._changePageHelp.bind(this)} /></div>
</div>
)
}
});
ReactDOM.render(<Admin />, document.getElementById('admin'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react-dom.min.js"></script>
<div id="admin"></div>
出于性能原因,您应该避免在 JSX 属性中使用 bind
或箭头函数。这是因为为 map()
函数生成的每个实例创建了事件处理函数的副本。这在这里解释:https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md
为避免这种情况,您可以将重复的部分拉入其自己的组件中。这是一个演示: http://codepen.io/PiotrBerebecki/pen/EgvjmZ 父组件中的 console.log()
调用现在接收 link 的名称。例如,您可以在 React Router 中使用它。
var Admin = React.createClass ({
_changePageHelp : function(name) {
console.log(name);
},
render : function () {
return (
<div>
<div id="menu-admin">
<Menu changePageHelp={this._changePageHelp} />
</div>
</div>
);
}
});
var Menu = React.createClass({
getDefaultProps: function() {
return {
links: [
{key: 1, name: 'help'},
{key: 2, name: 'about'},
{key: 3, name: 'contact'}
]
};
},
render: function() {
var menuItem = this.props.links.map((link) => {
return (
<MenuItem key={link.key}
name={link.name}
changePageHelp={this.props.changePageHelp}
className="menu-help menu-link" />
);
});
return (
<ul>
{menuItem}
</ul>
);
}
});
var MenuItem = React.createClass ({
handleClick: function() {
this.props.changePageHelp(this.props.name);
},
render : function () {
return (
<li onClick={this.handleClick}>
Click me to console log in Admin component <b>{this.props.name}</b>
</li>
);
}
});
ReactDOM.render(<Admin />, document.getElementById('admin'));