javascript REACT未捕获的类型错误:x.method()不是函数

66bbxpm5  于 2022-10-30  发布在  Java
关注(0)|答案(1)|浏览(136)

我有这样的代码,它创建了一个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]);
ffscu2ro

ffscu2ro1#

在React中,当你在JSX中使用<Component />这样的标签内的基于类的组件时,这和你将它们声明为类是不一样的。所以,你不能通过点标记(.)调用基于类的组件的方法或属性,而你可以在JavaScript中使用普通的类。
在您的情况下,我可以建议只传递一个方法作为道具,而不是整个组件,然后您可以通过子组件的props对象在子组件内引用此组件方法或属性。
或者,如果你真的想使用点标记(.),你可以试着这样做,用static关键字定义你的方法:
static setSpell (spell) {...}
或者甚至是指整个组件,但是以这种方式:

const App = () => (
  <Menu>
    <Menu.Item>Home</Menu.Item>
    <Menu.Item>Blog</Menu.Item>
    <Menu.Item>About</Menu.Item>
  </Menu>
);

请参阅:React Component with Dot Notation
您可能还会对React Context API感兴趣,它提供了一种通过组件树传递数据的方法,而不必在每个级别手动传递属性。React Context

相关问题