javascript - 如何将提示输入的值传递给函数?

标签 javascript reactjs

我正在使用 React 和 JS 创建刽子手游戏。按下猜词按钮后,我想使用提示框让用户输入他们认为的完整单词。但是,当我在提示框中输入一个词时,我得到“TypeError:对象不支持属性或方法‘checkWholeWord’”。我是 js 编码的新手,我真的不知道我在这里做错了什么。

import React, { Component } from 'react';
import './App.css';
import words from './words'

class App extends Component {
    //chooses random word
    state = {
        word: words[Math.floor(Math.random() * words.length)],
        guessedLetters: [],
        guessesRemaining: 6
    }

    //pass function to child to update
    updateGuessedLetters(letter){
        if(this.state.guessedLetters.includes(letter)){
            alert('ALREADY TRIED THAT')
        }else{
            this.setState({
                //makes new array with letter
                guessedLetters: [...this.state.guessedLetters, letter]
            })
        }
    }

    //keeps track of how many times wrong letter is entered
    updateGuessesRemaining(letter){
        if(!this.state.guessedLetters.includes(letter) && !this.state.word.split('').includes(letter)){
            this.setState({guessesRemaining: this.state.guessesRemaining -1})
        }
    }
    //fix this function 
    wordIsGuessed(){
        const guessState = this.state.word.split('').map(letter => {
            if (this.state.guessedLetters.includes(letter)){
                return letter
            }
        })
        return guessState.join('') === this.state.word
    }

    //checks if game is over by checking guesses remaining
    gameOver(){
        if(this.state.guessesRemaining <= 1){
            alert('You lose')
        }else if (this.wordIsGuessed()){
            alert('You win!')
        }
    }

    //when someone attempts to guess whole word checks inputted word
    checkWholeWord(wholeWord){
        if (wholeWord===this.state.word){
            alert('You Win')
        }
    }
    //called every time a letter is submitted, if gameover then end
    updateGameState(letter){
        this.gameOver()
        this.updateGuessedLetters(letter)
        this.updateGuessesRemaining(letter)
    }

    render() {
        return (
          <div className="App">
            <h1>Hangman</h1>
            {this.state.word}
            <DisplayWord word={this.state.word} guessedLetters={this.state.guessedLetters}/>
            <SubmitGuess updateGameState = { (letter) => this.updateGameState(letter)}/>
            <WrongLetters word={this.state.word} guessedLetters={this.state.guessedLetters}/>
          </div> 
    );
  }
}

class DisplayWord extends Component{
    render(){
        //splits word into array
        const wordLetters = this.props.word.split('')

        const answer = wordLetters.map(letter =>  {
            let letterState = '_' + ' '
            if(this.props.guessedLetters.includes(letter)){
                letterState=letter 
            }
            return letterState
        })
        return(
            <div className="DisplayWord">
                <h3>{answer}</h3>
            </div>
        );
    }
}
class WrongLetters extends Component {
    getWrongLetters(){
        //filter checks if letter is in word
        const wrong = this.props.guessedLetters.filter(letter =>{
               return !this.props.word.split('').includes(letter)
            })
        return wrong
    }
    render(){
        return(
            <div className="WrongLetters">  
            {this.getWrongLetters()}
            </div>
        );
    }
}
//takes guess from user
class SubmitGuess extends Component {
    //ensures that the page doesn't refresh completely
    handleSubmit = (e) => {
        e.preventDefault()
        //gets value from user
        const input = this.refs.textInput.value
        this.props.updateGameState(input)
        //resets value to empty
        this.refs.textInput.value = ''
    }

    guessWholeWord = (e) => {
        e.preventDefault()
        const wholeWord = prompt ("Guess the word :)")
        this.props.checkWholeWord(wholeWord)
   }

    render(){
    return(
        <div>
            <form ref="form" onKeyUp={this.handleSubmit}>
                <input type="text"  ref='textInput' maxLength='1'/>
                <button>New Game</button>        
            </form>
            <form ref="forms" onSubmit={this.guessWholeWord}>
            <button type ="submit">Guess Word</button>
            </form>

        </div>
        );
    }
}


export default App;

最佳答案

guessWholeWord = (e) => {
        e.preventDefault()
        const wholeWord = prompt ("Guess the word :)")
        if (wholeWord===this.state.word){
            alert('You win!')
        }
    }
    render() {
        return (
          <div className="App">
            <h1>Hangman</h1>
            {this.state.word}
            <DisplayWord word = {this.state.word} guessedLetters={this.state.guessedLetters}/>
            <SubmitGuess updateGameState = { (letter) => this.updateGameState(letter)}/>
            <WrongLetters word={this.state.word} guessedLetters={this.state.guessedLetters}/>
            <form ref="forms" onSubmit={this.guessWholeWord}>
            <button type ="submit">Guess Word</button>
            </form>
          </div> 
    );

关于javascript - 如何将提示输入的值传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55409713/

相关文章:

javascript - jQuery datePicker 周选择

javascript - 为什么 jasmine-node 没有选择我的帮助脚本?

javascript - 组织 React 组件

javascript - Firebase 查询子项的子项是否包含值

javascript - 服务器 : how to get "window", "location"和其他 "window"属性以及通常是浏览器对象上的浏览器代码?

javascript - html5sql - 似乎无法连接到我的数据库

javascript - IE-graphql-SCRIPT5022 : Cannot use undefined "Boolean" from another module or realm

reactjs - Material UI Switch 切换有错误,无法正确更改

reactjs - 不变违规 : Element type is invalid: expected a string (for built-in components) when testing with enzyme mount

reactjs - React Native 和 Redux : Require cycle (how to get rid of it? )