I'm trying to implement a file upload, but using SUIR <Input>, button, label, etc.
This is strictly about the use of the elements in render.
Using regular html <label> and <input> elements this process works as expected. 
  <Form.Field>
    <label>File input & upload for dataschemas & datasources</label>
    <input type="file" onChange={this.fileChange} />
    <Button type="submit">Upload</Button>
  </Form.Field>
Now I'm trying to use SUIR <Input> element, as well as some props with the <Button> element for styling.
  <Form.Field>
    <label>File input & upload </label>
    <Input type="file" onChange={this.fileChange}>
      <Button
        content="Choose File"
        labelPosition="left"
        icon="file"
      />
    </Input>
    <Button type="submit">Upload</Button>
  </Form.Field>
You can visit the codesandbox here to get a better visual idea of what I'm talking about.
When I click Choose File in the SUIR implementation example it does not prompt the user to chose a file from their system, whereas the regular html <input> does. I'm not sure how to get <Input type="file ...> in semantic to behave the same way.
SUIR doesn't provide a FileInput button solution out of the box. But you can easily create your own implementation of such button. For instance, usually this is done by using a hidden file input and a button which triggers the hidden input click when user clicks on it:
  <Button
    content="Choose File"
    labelPosition="left"
    icon="file"
    onClick={() => this.fileInputRef.current.click()}
  />
  <input
    ref={this.fileInputRef}
    type="file"
    hidden
    onChange={this.fileChange}
  />
Where this.fileInputRef is a React ref created by React.createRef() method.
You can check this codesandbox example with the above solution.
The answer by GProst works perfectly well.  In another case you might not want to create a ref to achieve this file input button. 
The solution below uses the htmlFor prop and passes that id to the <input>.
Not using ref eliminates extra JS, and unnecessary communication between button and input.
<Button as="label" htmlFor="file" type="button">
  Some button stuff
</Button>
<input type="file" id="file" style={{ display: "hidden" }} onChange={this.onChange} />
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With