我有这样的代码,它创建了一个Player组件,其中包含setSpell方法。
class Player extends React.Component {
constructor(props) {
super(props);
this.setSpell = this.setSpell.bind(this);
this.state = {
name: (props.name === undefined) ? 'Tom Default' : props.name,
speed: 0,
power: 0,
health: 100,
spells: [],
};
}//end constructor
setSpell (spell) {
let newSpellsArray = this.state.spells.slice();
newSpellsArray.push(spell);
this.setState({spells: newSpellsArray});
}
在另一个函数组件中,我写
函数match(){
const [player1, setPlayer1] = useState(props.p1); where props.p1 is p1=<Player /> component
当我尝试调用
player1.setSpell('spell');
它会显示未捕获的TypeError:player1.setSpell不是一个函数。我该如何修复这个错误?
function Match(props) {
const [player1, setPlayer1] = useState(props.p1);
const [player2, setPlayer2] = useState(props.p2);
const [isOn, setIsOn] = useState(false);
const [turnCount, setTurnCount] = useState(0);
useEffect(() => {
const spell_archive = ['carmelo dragon','frog knight','thunder cloud','poison breath','ooze','refrigerator ice cube soldier'];
if (isOn) {
setTurnCount(turnCount+1);
//draw phase
if (turnCount===1){
console.log(player1.props.spells);
player1.setSpell(randomSpell(spell_archive)); HERE IS THE ISSUE!!!
}
setIsOn(false);
}
}, [isOn, turnCount, player1]);
1条答案
按热度按时间ffscu2ro1#
在React中,当你在JSX中使用
<Component />
这样的标签内的基于类的组件时,这和你将它们声明为类是不一样的。所以,你不能通过点标记(.)
调用基于类的组件的方法或属性,而你可以在JavaScript中使用普通的类。在您的情况下,我可以建议只传递一个方法作为道具,而不是整个组件,然后您可以通过子组件的
props
对象在子组件内引用此组件方法或属性。或者,如果你真的想使用点标记
(.)
,你可以试着这样做,用static
关键字定义你的方法:static setSpell (spell) {...}
或者甚至是指整个组件,但是以这种方式:
请参阅:React Component with Dot Notation
您可能还会对
React Context API
感兴趣,它提供了一种通过组件树传递数据的方法,而不必在每个级别手动传递属性。React Context