简体   繁体   English

反应 useState() 问题

[英]React useState() issue

I have a problem with using function component.我在使用 function 组件时遇到问题。 I'm writing Hangman game and i stuck while trying to do staff about letters discovering.我正在写刽子手游戏,但我在尝试让员工了解信件发现时卡住了。 Here is my code.这是我的代码。

App.js应用程序.js

import CreateSubject from './components/CreateSubject'
import Hangman from './components/Hangman'
import { HangmanProvider } from './context/HangmanContext'

function App() {
  return (
    <HangmanProvider>
      <div className="App">
        <CreateSubject/>
        <Hangman/>
      </div>
    </HangmanProvider>
  );
}

export default App;

CreateSubject.js CreateSubject.js

import {HangmanContext } from '../context/HangmanContext'

function CreateSubject(props){
    
    const {password,displayGame,displayForm} = useContext(HangmanContext)
    const [subject,setSubject] = password
    const [gameDisplay,setGameDisplay] = displayGame
    const [createSubjectDisplay,setCreateSubjectDisplay] = displayForm
    
    const handleSubmit = (e) =>{
        e.preventDefault()
        if(subject != ''){
            setCreateSubjectDisplay('none')
            setGameDisplay('')
        }
    }
    const handleChange = (e) =>{
        setSubject(e.target.value)
        e.target.value = subject
    }
    return(
        <form style={{display: createSubjectDisplay}} onSubmit={handleSubmit}>
            <label>
                <div>Enter a Word:</div>
                <input type='text'
                 value={subject}
                 onChange={handleChange}
                 className='createSubject'
                 maxLength='40'/>
            </label>
            <button type='submit'>Create</button>
        </form>
    )
}

export default CreateSubject

Hangman.js刽子手.js

import al from '../alphabet'
import {HangmanContext} from '../context/HangmanContext'

const Hangman = (props) =>{
    const {password,displayGame,displayForm} = useContext(HangmanContext)

    const [subject,setSubject] = password
    const [gameDisplay,setGameDisplay] = displayGame
    const [createSubjectDisplay,setCreateSubjectDisplay] = displayForm
    
    let passwordArr = Array.from(subject)
    const [hiddenPassword,changeHiddenPassword] = useState()

    useEffect(() => {
        let passwordArr = Array.from(subject)
        changeHiddenPassword(passwordArr.map(item => '_')) 
    },[]);

    const chooseLetter = (e) => {
        let letter = e.target.innerHTML
        passwordArr.forEach((e,i) => {
            if (e == letter){
              console.log(hiddenPassword)
            }
        })
    }

    const letters = al.map((letter) =>
        <span onClick={chooseLetter}>{letter}</span>
    )

    return(
        <div style={{display:gameDisplay}}>
            <div className='password'>
                {
                //passwordArr.map((item,i) => <span>{hiddenPasswordArr[i]}</span>)
                }
            </div>
            <div className='wrapper'>
                <div className='pass_input'>Enter password:<input type='text' maxLength='30'/></div>
                <div className='alphabet'> {letters} </div>
            </div>
        </div>
    )
}

export default Hangman

My problem is in Hangman.js when i'm trying to change 'hiddenPassword' state which is an array.当我尝试更改作为数组的 'hiddenPassword' state 时,我的问题出在 Hangman.js 中。 When i'm outputing this state in console it shows me an empty array.当我在控制台中输出这个 state 时,它显示了一个空数组。 What have i done wrong?我做错了什么?

You need to initialize your hiddenPassword state:您需要初始化您的hiddenPassword state:

const [hiddenPassword,changeHiddenPassword] = useState(passwordArr.map(item => '_'))

subject might have to be in the useEffect 's dependency array subject可能必须在useEffect的依赖数组中

    useEffect(() => {
        let passwordArr = Array.from(subject)
        changeHiddenPassword(passwordArr.map(item => '_')) 
    },[subject]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM