Javascript React-在组件之间传递方法引用
目前我正在参加一个关于React的课程 现在的选择是关于传递方法引用。因此,基本上,讲师在App.js的render方法内的Person标记中将方法引用作为道具传递。在Person组件中,单击按钮时执行switchNameHandler,修改输入文本字段时执行nameChangedHandler 因此,课程讲师使用.bind()方法。我已经研究了bind()方法的作用。但在本例中,我有两个问题:Javascript React-在组件之间传递方法引用,javascript,reactjs,Javascript,Reactjs,目前我正在参加一个关于React的课程 现在的选择是关于传递方法引用。因此,基本上,讲师在App.js的render方法内的Person标记中将方法引用作为道具传递。在Person组件中,单击按钮时执行switchNameHandler,修改输入文本字段时执行nameChangedHandler 因此,课程讲师使用.bind()方法。我已经研究了bind()方法的作用。但在本例中,我有两个问题: 在当前示例中,这两个关键字指的是什么(App.js=>value of click中的第二人称标记)
App.js
import React,{Component}来自'React';
导入“/App.css”;
从“./人/人”导入人
类应用程序扩展组件{
状态={
人员:[
{姓名:'Peter',年龄:20},
{姓名:'Manu',年龄:28},
{姓名:'Stephanie',年龄:24}
],
otherState:“其他值”
}
switchNameHandler=(新名称)=>{
//console.log('Was clicked!');
这是我的国家({
人员:[
{姓名:newName,年龄:20},
{姓名:'Manu',年龄:5},
{姓名:'Stephanie',年龄:30}
]
})
}
nameChangedHandler=(事件)=>{
这是我的国家({
人员:[
{姓名:'Max',年龄:20},
{name:event.target.value,年龄:5},
{姓名:'Stephanie',年龄:30}
]
})
}
render(){
返回(
嗨,我是React应用程序
这个.switchNameHandler('Maximilian!!!!!')}>开关名称
我的爱好:赛车
);
}
}
导出默认应用程序;
Person.js
从“React”导入React;
导入“/Person.css”;
const person=(道具)=>{
返回(
我是{props.name},我是{props.age}岁
{props.children}
)
};
出口违约人;
添加少量react文档:
我现在正在阅读react文档(),这里有一行:
如果需要访问处理程序中的父组件,还需要将函数绑定到组件实例(请参见下文)
渲染中绑定:(来自react站点的代码)
类Foo扩展组件{
handleClick(){
log('单击发生');
}
render(){
返回点击我;
}
}
在本例中,处理程序方法不在父组件中,而是在同一组件中。在这种情况下,我也必须理解一些错误。第一种情况(click={this.switchNameHandler.bind(this'Max!')}
)就是这样,您不需要声明额外的函数来将参数传递给函数。最后,最终结果与上面的示例相同(onClick={()=>this.switchNameHandler('Maximilian!!!!!')}
),不同之处在于,在第一种情况下,它创建一个arrow函数()来调用带有自定义参数的方法,而第二种情况下,它将参数与this
(创建一个新的函数对象)绑定在一起
第二种情况(
changed={this.nameChangedHandler}
),因为(该函数被声明为一个箭头函数),当作为prop传递时,您不需要再次绑定它。如果您不绑定该函数,只需像以下那样作为参数传递:
<Person
name={this.state.persons[1].name}
age={this.state.persons[1].age}
click={this.switchNameHandler}
changed={this.nameChangedHandler}>My hobbies: Racing</Person>
但是在您的例子中,switchNameHandler
是一个箭头函数。根据文件
在arrow函数之前,每个新函数都定义了自己的该值(基于函数的调用方式、构造函数中的新对象、严格模式函数调用中的未定义、函数作为“对象方法”调用时的基对象等)
但即使知道这一点,为什么还要绑定函数呢?因为:
此
)'Max!'
)回答第二个问题:
nameChangedHandler
不需要绑定,因为它是一个arrow函数,它接受创建它的上下文。有两种函数:
const obj={
测试:函数(){
console.log(这个)
}
}
obj.test();
test();
const bindedTest=obj.test.bind(obj);
bindetest()代码>在{this.switchNameHandler}中的this是否引用Person标记,因为它在其中?如果不是,那么{this.switchNameHandler}中的this是指什么?我是否正确理解,arrow函数自动将this上下文设置为应用程序,因为它在类中?@TNII{this.switchNameHandler}
指的是应用程序this
。函数只是一个prop(参数),用户仍然想知道:click={this.switchNameHandler.bind(this,'Max!')}为什么要将类的方法再次绑定到类本身(两个“this”关键字都指向应用程序,对吗?)。再次绑定此方法是因为bind
创建了一个新函数,该函数在调用时将其This关键字设置为提供的值,并设置了参数。如果您执行类似于此.switchNameHandler('Max!')
的操作,则它是n
import React from 'react';
import './Person.css';
const person = (props) => {
return (
<div className="Person">
<p onClick={props.click}>I'm { props.name } and I am { props.age } years old!</p>
<p>{props.children}</p>
<input type="text" onChange={props.changed} value={props.name} />
</div>
)
};
export default person;
class Foo extends Component {
handleClick() {
console.log('Click happened');
}
render() {
return <button onClick={this.handleClick.bind(this)}>Click Me</button>;
}
}
<Person
name={this.state.persons[1].name}
age={this.state.persons[1].age}
click={this.switchNameHandler}
changed={this.nameChangedHandler}>My hobbies: Racing</Person>
switchNameHandler(newName){
console.log(this);// undefined
}