Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 输入电子邮件字段onchange未将字符串设置为state if last字段_Javascript_Reactjs - Fatal编程技术网

Javascript 输入电子邮件字段onchange未将字符串设置为state if last字段

Javascript 输入电子邮件字段onchange未将字符串设置为state if last字段,javascript,reactjs,Javascript,Reactjs,这真的很奇怪,我将电子邮件输入设置为字符串状态,我可以在react-dev工具上看到它被发送,但是如果我尝试从另一个函数记录它,我会得到空字符串,问题是如果我更改输入的顺序,并且电子邮件不是最后一封,那么一切都会工作 import React, { useState, useEffect, useCallback, useContext } from 'react' import { useDropzone } from 'react-dropzone' import context from

这真的很奇怪,我将电子邮件输入设置为字符串状态,我可以在react-dev工具上看到它被发送,但是如果我尝试从另一个函数记录它,我会得到空字符串,问题是如果我更改输入的顺序,并且电子邮件不是最后一封,那么一切都会工作

import React, { useState, useEffect, useCallback, useContext } from 'react'
import { useDropzone } from 'react-dropzone'
import context from '../provider/context'
import axios from 'axios'

const File = () => {

  const { setStage, setProject, project, setUrls, urls, email, setEmail } = useContext(context)

  const onDrop = useCallback((acceptedFiles) => uploadFile(acceptedFiles), [project])

  const { getRootProps, isDragActive, getInputProps } = useDropzone({ onDrop })


  // Set project name
  const addProject = (e) => setProject(e.target.value)

  // Set email address
  const addEmail = (e) => setEmail(e.target.value)

  // I got another function then that logs the `email` state, 
  // but if I do it right after typing on the email input I get empty  string.
  // If I invert the order, and `project` comes after the email input 
  // then it displays the email string just fine.


 return (
    <>
      <ul className='list'>
        <li>
          <label className='label' htmlFor='upload'>
            Project's Name
          </label>
          <input
            id='upload'
            value={project}
            type='text'
            name='project'
            placeholder='e.g Great Project'
            onChange={addProject}
            autoFocus
          />
        </li>
        <li>
          <label className='label' htmlFor='email'>
            Your email address
          </label>
          <input
            id='email'
            type='email'
            name='email'
            value={email}
            placeholder='Email address to send notification to'
            onChange={addEmail}
          />
        </li>
      </ul>

      <div className='fileTitle' {...getRootProps()}>
          {isDragActive ? <p className='label'>Drop the file here ...</p> : handleResponse()}
          <div className='file'>
            <div id='drop-area' className={`drop-area ${isDragActive ? 'active' : ''}`}>
              <div className={`icon ${response ? response : ''}`}></div>
            </div>
            <input
              {...getInputProps()}
              className='inputfile'
              id='file'
              type='file'
              name='locations'
            />
          </div>
          <br />
          <em className='info'>
            * Don’t include any headers in the file, just your list of urls with{' '}
            <strong>no headers</strong>.
          </em>
        </div>
   </>
)}

export default File

做一个简单的onclick很好

const checkEmail = () => {
 console.log(email) // This works cause it takes it form the useContext
}
然后在html上

<button onClick={checkEmail}>Click here<button>
点击这里

最后,我需要将
email
作为数组依赖项添加到react drop zone useCallback,以便它可以注册在该状态下发生了更改

所以我改变了:

const onDrop = useCallback((acceptedFiles) => 
  uploadFile(acceptedFiles), [project])

这就是为什么,当我在添加电子邮件后更改项目字段时,它正在工作的原因


非常感谢帮助我找到问题所在的人。

“我得到了另一个函数”
我们应该如何在没有看到该函数的情况下进行调试?它有点复杂,它使用了useDropzone,好的,我正在更新问题尝试将该函数更改为一个不同的函数,该函数直接用于控制台日志,以查看该函数是否存在问题。听起来问题就出在这上面function@Nate是的,这是useDropzone一个简单的onclick按钮使其记录良好,然后请显示该函数的使用代码。问题显然就在这个功能中,没有人能在没有看到这个功能的情况下解决它。
const onDrop = useCallback((acceptedFiles) => 
  uploadFile(acceptedFiles), [project])
const onDrop = useCallback((acceptedFiles) => 
  uploadFile(acceptedFiles), [project, email])