我想在Semantic UI React的Input中进行文件上传,但是无法通过ref进行点击

经纬

使用Semantic UI React的Input来实现文件上传,感觉有点不够好看、

import { Input } from "semantic-ui-react";

const Component = () => <Input type='file' />

export default Component;
image.png

那么,如果隐藏Input,当点击Button时,通过ref来点击Input,以便可以选择文件。

import { useRef } from "react";
import { Button, Input } from "semantic-ui-react";

const Component = () => {
    const ref = useRef(null);

    const handleClick = () => {
        ref.current.click();
    };

    return (
        <>
            <Button onClick={handleClick}>ファイルを選択</Button>
            <Input type='file' ref={ref} style={{ display: 'none' }} />
        </>
    );
}

export default Component;
image.png

环境

名前バージョンreact18.2.0semantic-ui-react2.1.4

调查1:调查一下ref.current.click是否真的不是一个函数。

由于在参考网站上可用,所以按照参考内容,尝试使用input标签并使用ref。

import { useRef } from "react";
import { Button, Input } from "semantic-ui-react";

const Component = () => {
    const ref = useRef(null);

    const handleClick = () => {
        ref.current.click();
    }

    return (
        <>
            <Button onClick={handleClick}>ファイルを選択</Button>
            {/* <Input type='file' ref={ref} style={{ display: 'none' }} /> */}
            <input type='file' ref={ref} style={{ display: 'none' }} />
        </>
    )
}

export default Component;

→由于顺利运作,无法通过输入的引用(ref)执行点击操作。

解决方案1:不使用输入,而是直接将ref传递给内部的input。

将本文所讨论的内容应用

 

import { useRef } from "react";
import { Button, Input } from "semantic-ui-react";

const Component = () => {
    const ref = useRef(null);

    const handleClick = () => {
        ref.current.click();
    }

    return (
        <>
            <Button onClick={handleClick}>ファイルを選択</Button>
            <Input type='file' style={{ display: 'none' }}>
                <input ref={ref} />
            </Input>
        </>
    )
}

export default Component;

解决方案2:使用HTML的for和id属性进行关联。

import { Input, Label } from "semantic-ui-react";

const Component = () => {
    return (
        <>
            <Label as='label' htmlFor='file-upload'>ファイルを選択</Label>
            <Input type='file' style={{ display: 'none' }} id='file-upload' />
        </>
    )
}

export default Component;

选项1: 第三个解决策是使用小写的input而不是Input来表示非表示的概念。

import { useRef } from "react";
import { Button } from "semantic-ui-react";

const Component = () => {
    const ref = useRef(null);

    const handleClick = () => {
        ref.current.click();
    }

    return (
        <>
            <Button onClick={handleClick}>ファイルを選択</Button>
            <input type='file' ref={ref} style={{ display: 'none' }} />
        </>
    )
}

export default Component;
广告
将在 10 秒后关闭
bannerAds