【问题标题】:Uploading Images in Browser using react issue使用反应问题在浏览器中上传图像
【发布时间】:2021-06-02 21:41:59
【问题描述】:

我正在尝试让用户使用 React 将几张图片上传到浏览器(然后当然将它们保存到服务器)。

问题是当我单击选择图像时,有时会起作用,有时会不起作用。相同的显示图像 这是我的代码:

const [name, setName] = useState('');
const [description, setDescription] = useState('');
const [selectedFiles, setSelectedFiles] = useState([]);
const [isSelected, setIsSelected] = useState(false);

const fileSelectedHandler = (event) => {
    console.log(event.target.files[0]);
    const files = selectedFiles;
    files.push(event.target.files[0]);
    setSelectedFiles(files);
    setIsSelected(true);
    console.log(selectedFiles);
}

const fileUploadHandler = () => {
    axios.post('http://')
}

return (
    <div className="container">
        <p>Please Enter Category name: </p>
        <TextField
            id="standard-multiline-flexible"
            label="Name"
            multiline
            rowsMax={4}
            variant="filled"
            color="secondary"
            value={name}
            onChange={(event) => setName(event.target.value)}
        />
        <p>Please Enter Category Description: </p>
        <TextField
            id="standard-multiline-flexible"
            label="Description"
            multiline
            rowsMax={4}
            variant="filled"
            color="secondary"
            value={description}
            onChange={(event) => setDescription(event.target.value)}
        />
        <input type="file" onChange={fileSelectedHandler}/>
        
        {
            selectedFiles.length > 0 ?
            
                <div className="row">
                    {
                        selectedFiles.map((file, index) => {
                                console.log(file, index);
                                return (
                                    <div className="column">
                                        <img className="added_images" width="100%" src={URL.createObjectURL(file)} thumbnail />
                                    </div>
                                )
                        })
                    }
                </div>
            :
                null
        }
    </div>
)

这是我的样式:

 * {
    box-sizing: border-box;
}

.container {
    display: flex;
    flex-direction: column;
}

.column {
    float: left;
    width: 33.33%;
    height: 200px;
    padding: 5px;
}
  
/* Clear floats after image containers */
.row::after {
    content: "";
    display: table;
    clear: both;
}

当我调试时 selectedFiles 挂钩包含我上传的所有文件。但问题是它没有触发渲染。这是为什么呢?

【问题讨论】:

    标签: javascript css reactjs image


    【解决方案1】:

    这里的问题是您将整个selectedFiles 分配给files,如下所示

    const files = selectedFiles;
    

    这也会将selectedFiles 的引用分配给files const,因此当您尝试用selectedFiles 更新selectedFiles 和files 时,将新值推送到数组后,两个数组引用将相同,因此react 不会触发重新渲染.

    为了解决这个问题,尝试像下面这样浅拷贝数组:-

    const files = [...selectedFiles];
    

    或者在更新数组时,使用如下扩展运算符更新它:-

    setSelectedFiles([...files]);
    

    或者你可以像下面这样直接更新你的数组状态,而不用复制到新常量中

    
    const fileSelectedHandler = (event) => {
        setSelectedFiles(prevSelected => [...prevSelected, event.target.files[0]]);
    }
    

    【讨论】:

    • 谢谢@Priyank Kachhela。这解决了我的问题
    猜你喜欢
    • 2020-06-06
    • 2017-10-07
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2021-12-02
    相关资源
    最近更新 更多