美文网首页
web前端-关于使用input实现一个正常的上传/删除文件

web前端-关于使用input实现一个正常的上传/删除文件

作者: 长若执念 | 来源:发表于2020-06-03 00:08 被阅读0次

    问:为什么写这篇文章?

    • 答 使用input时候,去上传文件的时候,页面不美观,也感觉input的设计有点不合理:选择了文件,再次选择的时候,如果再次选择的是空,也就是不选择的时候,竟然会删除上次已经选择好的文件。个人感觉设计不合理(个人观点,不喜勿喷),所以自定义了一个。

    所以自定义的要实现的效果就是:

    • 点击上传,上传文件A成功后,再次点击上传按钮,此时如果没有再次选择文件,点击取消,则上次上传的A文件还在。
    • 顺便增加了删除按钮

      -----使用的技术栈是React的txs,CSS ----

    //fileA.tsx 
    <label>upload</label>
    <Spin> spinning = {isShowLoading} delay={500}>
       <div className='myUploadUI'>
           <a href="javascript:;" className ="chooseFile" >
              <Icon type="upload" />
               选文件
               <input type="file"  name="file" id="myChooseFile" onChange={handleUpload} />
           </a>
          
            <label className="myText">{myUploadName}
               <a href="javascript:;"  hidden={isDeleteIconHidden} onClick={deleteIconOnClick}>
                   <Icon type="delete" />
               </a>
           </label>
        </div>
    </Spin>
    
    
    //相应的css 样式
    . myUploadUI {
       display:flex;
       flex-direction:row;
       justify-content:flex-start;
       margin:10px;
    }
    
    . myUploadUI  . myText{
       text-align:left;
       line-height:20px;
       padding:4px  12px;
       border:1px solid red;
       border-radius:5px; 
       width:100%;
    
       //自己最为容器:
        display:flex;
        justify-content:space-between;
    }
    
    . chooseFile {
       position:relation;
       display:inline-block;
       flex-grow:0;
       flex-shrink:0;
       line-height:20px;
       padding:4px  12px;
       border:1px solid red;
       border-radius:5px; 
       text-decoration:none;
    }
    
    . chooseFile  input {
        position:absolute;
        top:0;    
        right:0;
        opacity:0;
    }
    
    . chooseFile ::hover {
       border:1px solid blue;
      text-decoration:none;
    }
    
    

    接下来就是相应的点击事件

    //点击选择文件,进行文件上传
    //此事件是input 的onChange事件:触发机制是 input的值发生了改变,所以两种情况下会触发:1>点击input,弹框,选择了文件之后出发  2>选择了”取消“触发
    // 而 input 的onClick,则是一点击 input,弹框,就会触发onClick事件。与本案的业务不符
    function  handleUpload(event:any){
        //取值方式1:
        var fileList = event.target.files;
        if(fileList.length > 0){
            let myFile = fileList[0];
            console.log(`fileName is:${myFile.name}; filePath is: ${myFile.path}`);
             //input 有值,说明选择了文件,修改相关的业务:修改数据,触发渲染界面
             this.setDate({
                  isShowLoading:true
             })
            
              //进行其他业务逻辑,如上传到后台的网络请求 xxxx
             //请求成功后,关闭loading,即 isShowLoading设置为false,给myUploadName 设置为 myFile.name的值,等等。。。。
        }
    
         /**
           取值方式2:
            var selectedFile = document.getElementById('myChooseFile')  as HTMLInputElement;
            let fileList = selectedFile.files;
            let myFile = fileList![0];  //强制解包
           console.log(`fileName is:${myFile.name}; filePath is: ${myFile.path}`);
               xxxxx 
        */
    }
    
    //上传好文件后,选择删除文件的事件
    function  deleteIconOnClick() {
       //或者使用 antd的Modal. confirm 弹框提示判断也可以。
       if(confirm(`删除${myUploadName}?`) === true){
           //主思路:删除
               var selectedFile = document.getElementById('myChooseFile')  as HTMLInputElement;
          // *** ️注意细节: 设置<input>的value值为空,就将<input>内部选择的文件设置为空了
           selectedFile.value = '';
    
         //其他  改变数据,驱动渲染界面
          this.setDate({
                myUploadName:'';   //删除后,当前文件值是空。
               isDeleteIconHidden:true;////删除后,当前不显示删除按钮
             })
      }
    }
    

    相关文章

      网友评论

          本文标题:web前端-关于使用input实现一个正常的上传/删除文件

          本文链接:https://www.haomeiwen.com/subject/zkkmzhtx.html