javascript - 输入类型 ="file"在与其他输入类型一起使用时表现出奇怪的行为

标签 javascript reactjs debugging input-type-file

我有一个输入 type="file" 和一个 input type="text"。当我先选择文件然后在输入框中输入文本并单击添加按钮时,图片不显示但是当我先输入文本然后选择图片(文件)时,它表现正常。我认为有一些我给出的 inputKey 中的问题。这是我找到此方法的链接 http://robhoffmann.me/2016/03/12/Clearing-a-file-input-in-React/

我想做什么:我希望能够选择一个图像并键入一个产品名称,然后该名称将显示在屏幕上。只要我点击添加按钮。我想要重置输入,即文件类型和文本类型,以便我可以添加下一个产品的图片和名称等等。

function Admin(props){

    const [productName, setproductName] = React.useState("");

    let [productPicture, setproductPicture] = React.useState({file:null,inputKey:Date.now()});


    return (
        <div>
            <Link to="/">Go back</Link><br/><br/>
            <input type="file" onChange={(e)=>(productPicture=URL.createObjectURL(e.target.files[0]))} key={productPicture.inputKey}></input><br/>
            <input type="text" required placeholder="Product Name" onChange={(e)=>setproductName(e.target.value)} value={productName}></input><br/><br/>

<button type="Submit" onClick={(e)=>{props.AddInfo({productName,productPicture});setproductName("");setproductPicture({file:null,inputKey:Date.now()})}}>Add</button>
            <br/><br/>

            <div>
             {props.products.map((x)=>(<div>{x.name} {typeof x.picture === 'string' ? <img src={x.picture} alt="Product Picture" style={{width:"250px"}}></img>:""} </div>))}   
            </div>
        </div>
    )
}

export default Admin;

我希望在单击“添加”按钮时输出显示 productName 和 productPicture,但这仅在我先输入文本然后选择图像/文件时才会发生,反之亦然。

最佳答案

通过这样做,

<input type="file" onChange={(e)=>(productPicture=URL.createObjectURL(e.target.files[0]))} key={productPicture.inputKey}></input><br/>

你正试图直接改变状态,productPicture=URL.createObjectURL(e.target.files[0])这是错误的。在这里你没有设置状态。要设置实际状态,您需要使用 setproductPicture setter功能。

<input type="file" onChange={setImage} key={productPicture.inputKey} />

setImage功能应该是,

const setImage = (e) => {
  console.log(e.target.files[0].name);
  let file = e.target.files[0];  //Capture the file in variable otherwise event gets nullified and you won't get file.
  setproductPicture(prevState=>({
     ...prevState,
     file: URL.createObjectURL(file)
  }))
}

Demo

注意: input是一个空标签,不要像<input></input>那样关闭它.你可以这样做,<input /> .

关于javascript - 输入类型 ="file"在与其他输入类型一起使用时表现出奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57447735/

相关文章:

javascript - jQuery 插件 .wrap() 和 .wrapAll() 错误

javascript - 在 HTML 中显示可编辑列表(如电子表格)的最简单方法是什么?

javascript - 如何将 css 类添加到一组链接中的特定链接?

c# - asp日历: blocking off when navigating previous/next month

javascript - 关于大括号的 jsx 语法

angular - 调试 Angular 2 动画

javascript - 为什么我的页面不反射(reflect)我在代码中所做的更改?

javascript - 使用 Context API 传递数据时值未定义

java - 如何为 Eclipse 中的变量更改设置断点?

debugging - Golang 调试器未运行