我终于开始使用react和ES6了,它进展顺利,但是我最终陷入困境,可以使用一些指导。
我已经尽力将this
绑定到引用该类的方法上,但是我试图做得更深一些。以这个为例...它可以按预期工作:
class App extends Component {
state = {
myFirstState: false,
};
handleMyFirstState = () => {
this.setState( { myFirstState : true } );
};
render() {
return (
<MyComponent handleMySate={ this.handleMyState } />
);
}
}
export default App;
随着方法数量的增加,我决定不将每种方法分别作为道具传递,而是先将它们分组在一个对象中,而只是将整个对象作为道具传递。像这样...
class App extends Component {
state = {
myFirstState: false,
mySecondState: false
};
handleMyFirstState = () => {
this.setState( { myFirstState : true } );
};
handleMySecondSate = () => {
this.setState( { mySecondState : true } );
};
render() {
const handleStates = {
first : this.handleMyFirstState,
second : this.handleMySecondState
}
return (
<MyComponent handleStates={ handleStates } />
);
}
}
export default App;
现在,我在尝试避免冗余代码,而只是在渲染开始之前将方法构建为一个具有函数作为属性的对象。很像这样...
class App extends Component {
state = {
myFirstState: false,
mySecondState: false
};
handleStates = {
// Here is where 'this' does not reference the App class
// I get results from the console log but setstate doesn't pass correctly
first : () => { console.log("First Triggered"); this.setState( { myFirstState : true } ); },
second : () => { console.log("Second Triggered"); this.setState( { mySecondState : true } ); }
};
render() {
return (
<MyComponent handleStates={this.handleStates} />
);
}
}
export default App;
// I trigger the function like this within MyComponent and I get the console log, but `this.setState` breaks.
<Button onClick={ this.props.handleState.first } >Handle First</button>
我已经使用后一个代码成功地从子组件
<MyComponent/>
触发了函数,但是this
不再引用该类,并且我不知道如何将this
绑定到handleStates
,因为它不是一个功能。这是不可能的还是有另一种方式来处理我要达到的目标?
先感谢您!
额外
如果我将
handleStates
移到render()
上就可以了……那怎么可能?class App extends Component {
state = {
myFirstState: false,
mySecondState: false
};
render() {
const handleStates = {
first : () => { this.setState( { myFirstState : true } ); },
second : () => { this.setState( { mySecondState : true } ); }
};
return (
<MyComponent handleStates={this.handleStates} />
);
}
}
export default App;
最佳答案
首先,在第二个示例中,将this.handleStates
作为prop handleStates
的值传递,但是它是未定义的。您将handleStates
构建为局部变量,因此希望您的道具引用该局部变量:
<MyComponent handleStates={handleStates} />
对于第三个(最后一个)示例,您的问题甚至更简单:您将
handleStates
定义为this
上的一个属性,该属性被分配了一个对象,该对象本身具有两个属性first
和second
,每个属性都有一个作为他们的价值。当最终将
this.handleStates
传递给MyComponent
时,您传递的是对象,而不是函数。如果要从first
调用second
或MyComponent
之一,则可以这样操作:this.props.handleStates.first()
具有更新
App
中状态的预期结果。对于它的价值,这里有一个更常见的模式:只需传递一个更新程序函数作为prop,并根据其功能进行命名:
class Sandwich extends React.Component {
this.state = {
bread: "",
meat: "",
veggie: "",
}
updateSandwich = (component, selection) => {
this.setState({ [component]: selection })
}
render() {
return(<IngredientSelector updateSandwich={this.updateSandwich} />)
}
}
class IngredientSelector extends React.Component {
return(){
<button value="Rye" onClick={() => this.updateSandwich("bread", "rye")} />
<button value="Wheat" onClick={() => this.updateSandwich("bread", "wheat")} />
<button value="Ham" onClick={() => this.updateSandwich("meat", "ham")} />
<button value="Turkey" onClick={() => this.updateSandwich("meat", "turkey")} />
}
}