反应-在函数setstate中不更新状态

时间:2019-07-03 06:52:51

标签: reactjs

我有一个“服务包含”表格,其中包含2个文件上传,一个用于单个文件选择器,另一个用于多个文件选择器。提交后,单击调用函数以将文件上传到Firebase存储并保存链接。 我正在MultifileuploadHandler方法中更新'fileURLs'和'sp_License'状态。但这不是更新状态。当我执行newState的console.log时,我看不到更新的状态。

在提交时收到以下错误

  

'FirebaseError:函数DocumentReference.set()用无效数据调用。不支持的字段值:一个自定义File对象(在字段sp_License中找到)'

任何帮助表示赞赏!!

编辑:- 我已经更新了我的代码。 提交时,在上传文件之前,将调用保存数据方法。如何等待上传完成后再调用SaveData方法?

  handleSubmit = (e) => {
        e.preventDefault();

        let err = this.validate();
        if (!err) {
          this.setState({ loading: true,disChecked:false })
          this.fileupload();
          this.MultifileuploadHandler();
          this.saveData();

        }
    }
    saveData=()=>{
        let uid = this.props.auth.uid;
        let keysToRemove = ["loading", "checked", "disChecked", "open", "message"]
       let newState = Object.entries({...this.state}).reduce((obj, [key, value]) => {
         if(!keysToRemove.includes(key)){
             obj[key] = value
         }
         return obj
        }, {})
       console.log(newState)
        this.props.UpdateUserDetails(uid, newState,this.successMessage)
    }
    fileupload=()=>{
        //single org file
        const {fileURLs,sp_License}=this.state;
        const Lfilename = this.state.sp_Name + '_' + new Date().getTime();
        const uploadTask = storage.ref('License/' + Lfilename).put(sp_License);
        uploadTask
        .then(uploadTaskSnapshot => {
            return uploadTaskSnapshot.ref.getDownloadURL();
        })
        .then(url => {
          //  orgFile.push({url});
             this.setState({sp_License:url})
        // orgFile=url
          //  console.log(orgFile)
        },()=>{
            console.log(sp_License)
        });
    }
    MultifileuploadHandler = () => {
        const {fileURLs,sp_License}=this.state;
        let files=[];
        var orgFile=[];

            //multi pilots file
           const storageRef = storage.ref();
            this.state.sp_PilotsLicense.forEach((file) => {
                storageRef
                    .child(`License/${file.name}`)
                    .put(file).then((snapshot) => {
                        return snapshot.ref.getDownloadURL();
                    }).then(url =>{
                        files.push({url});
                        console.log(url)
                        if(files.length===this.state.sp_PilotsLicense.length)
                        {
                            console.log('url')
                            this.setState({ fileURLs: files },()=>{
                                console.log(fileURLs)
                            });
                        }
                    })
            });


    }

0 个答案:

没有答案