【问题标题】:Trying to add multiple images in react , but it only displays one image试图在反应中添加多张图片,但它只显示一张图片
【发布时间】:2020-03-11 20:10:16
【问题描述】:

我正在尝试选择多张图像,并且图像正在被选择和存储状态,但只显示一张图像。下面是相同的代码

//选择图片并显示图片

 <div className="md-form mb-5">
          <input type="file" id="form29" name='images' onChange={e => pickImage(e)} className="form-control validate" multiple hidden/>
          <button className="btn btn-outline-dark btn-sm" onClick={e => selectImage(e)}>Pick Image</button>
        </div>
                <div className="row text-center">
                    {image.length > 0 ?
                    image.map(img => (
                        <div className="col-md-4" key={img.url}>
                            <img src={img.url} alt={img.name} className="img-fluid"/>
                            <span style={{cursor: 'pointer'}}>
                            <i class="far fa-trash-alt" onClick={e => deleteImage(img.name, e)}></i>
                            </span>
                        </div>
                    )) : <p>No Images Picked</p>}
                </div>

//定义状态

const [addDiary, setAddDiary] = useState({date: null, content: null, images: []});
const [ image, setImage ] = useState([]);

//定义图片的存储和删除方法

const selectImage = (e) => {
        document.getElementById('form29').click();
    }

    const deleteImage = (name, e) => {
        const remainingImage = image.filter(img => {return img.name !== name});
        setImage(remainingImage);
        const remainingImageState = addDiary.images.filter(img => 
            {
            return img.name !== name});
        setAddDiary({...addDiary, images: remainingImageState });
    }

    const pickImage = (e) => {
       console.log(e, 'e obj')
        for(const file of e.target.files) {
            const reader = new FileReader();
            reader.onload = (e) => {

               setImage([...image, {url: URL.createObjectURL(file), name: file.name}]);
               console.log(e.target.name)
               setAddDiary({ ...addDiary, images: [...addDiary.images, file]});
              };
               reader.readAsDataURL(file);
            }

        }

【问题讨论】:

    标签: javascript node.js reactjs redux


    【解决方案1】:

    这里的问题是每次加载时都在更新图像,所以你应该首先将所有图像加载到缓存中,最后更新状态,你可以通过放置这段代码来完成

    const pickImage = (e) => {
      console.log(e, 'e obj');
      const limitImages = e.target.files.length;
      let count = 0;
      const images = [];
      for(const file of e.target.files) {
        const reader = new FileReader();
        reader.onload = (e) => {
          images.push({ url: URL.createObjectURL(file), name: file.name });
          count++;
    
          if (count === limitImages) {
            // here all images are loaded, so update the state
            setImage(images);
            setAddDiary({ ...addDiary, images: addDiary.images.concat(images)});
          }      
        };
        reader.readAsDataURL(file);
      }
    }
    

    记住你也应该处理错误事件,通知用户这是一个错误

    因此您可以避免selectImage 方法在输入中触发onClick 事件,只需将id 添加到您的input file 并使用标签来触发事件,如下所示:

    <div className="md-form mb-5">
      <input type="file" id="form29" name='images' onChange={e => pickImage(e)} className="form-control validate" multiple hidden id="file-picker" />
      <button className="btn btn-outline-dark btn-sm" onClick={e => selectImage(e)}>
        <label id={'file-picker'}>
          Pick Image
        </label>
      </button>
    </div>
    

    希望对你有帮助

    【讨论】:

    • 谢谢兄弟,你拯救了这一天。我一直在摸索,想知道如何显示所有图像。
    【解决方案2】:

    您的地图密钥被设置为一个对象。尝试设置为图像名称以避免省略。如果键是对象,React 无法区分键:

    <div className="col-md-4" key={img.name}>
      <img src={img} alt={img} className="img-fluid"/>
      <span style={{cursor: 'pointer'}}>
      <i class="far fa-trash-alt" onClick={e => deleteImage(img.name, e)}></i>
      </span>
    </div>
    

    【讨论】:

    • 这只是一个错字,但仍然没有显示图像,否则一切正常,如果选择多于1个图像,只有一个图像将存储在图像状态并显示,否则未显示或存储在状态
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多