【问题标题】:reduxForm Input file in safari returns an undefinedSafari 中的 reduxForm 输入文件返回未定义
【发布时间】:2018-01-06 17:00:55
【问题描述】:

我有一个包含输入类型文件的reduxForm,所选文件的返回值未定义我的代码是:

  <Field
     label="Select a File"
     name="file"
     component={this.renderFileField}/>

而renderFileField函数是:

  renderFileField( field ){

return(

      <div>
        <label className="label">{field.label}</label>
        <label htmlFor="file" className="input input-file">
          <div className="button mystyle-btn-u">
            <input type="file" id="file" {...field.input}
            value={null}
            onChange={(e)=>
              {
                field.onChangeExtra();
                //remove fakepath string from file name that would display in input
              ReactDOM.findDOMNode(e.target).parentNode.nextSibling.value = e.target.value.replace(/.*fakepath\\/,"");
                //fileName value would set with file name user selected from file picker
              this.setState({fileName:e.target.value.replace(/.*fakepath\\/,"")})}}
            ></input>
            Browse
          </div>
          <input
          value={this.state.fileName}
           type="text" onChange={this.ChangeFileName.bind(this)}/>
        </label>
      </div>
    );
}

我也尝试过 Dropzone 输入文件,但在 Safari 中点击文件选择器未显示,但可以选择拖放文件。

【问题讨论】:

    标签: javascript reactjs redux dropzone.js redux-form


    【解决方案1】:

    我觉得这来自于您从 onChange 处理程序内部调用 setState。将其提取到单独的函数中并绑定它或使用类属性,即

    onChange = () => {
        ...
    };
    

    【讨论】:

    • 感谢您的回复,我已经尝试过,但仍然得到相同的结果。
    【解决方案2】:

    据我所知,是这样的:

    1) 需要注意的是不支持该设置 的值,所以如果你想将值绑定回你需要的东西 编写一个自定义的“选定文件”组件。

    2) 在调用 fields.yourField.handleChange() 之前,您需要对事件进行一些解析。像这样的:

    <input
      type="file"
      onChange={
        ( e ) => {      
          e.preventDefault();
          const { fields } = this.props;
          // convert files to an array
          const files = [ ...e.target.files ];
          fields.yourField.handleChange(files);
        }
      }
    />
    

    3) 以正常方式进行验证

    【讨论】:

    • 感谢您的回复,对我帮助很大:)
    • 不知道真正的设置fields.yourField.handleChange(files);
    • 验证中的值为空。
    • @Mahsa 您可以将您的值存储到您当地的州。而不是field.yourField.handleChange(files),您可以创建自己的函数并将值存储在状态中,然后单击按钮验证状态内的值。喜欢this.state.files
    • 我设置了 field.input.onChange(files) 并得到了正确的响应。这个链接也很有帮助:redux-form.com/6.4.3/docs/faq/CustomComponent.md
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多