首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >React js react-dropzone在页面加载时自动打开

React js react-dropzone在页面加载时自动打开
EN

Stack Overflow用户
提问于 2021-04-24 22:25:06
回答 1查看 395关注 0票数 1

我正在使用react-dropzone,我想让文件上传对话框在页面加载时自动打开。

我写了以下代码,但我不能理解如何让它自动打开,这将是我在ref上做了一些错误的事情,因为我可以访问它的属性。

你能帮我一下吗?

链接:codesandbox

代码语言:javascript
运行
复制
import React from "react";
import { useDropzone } from "react-dropzone";
import { Chip } from "@material-ui/core";
import { AttachFile } from "@material-ui/icons";

const Dropzone = React.forwardRef(
  ({ multiple = false, onOperation, onDelete }, ref) => {
    const [myFile, setMyFile] = React.useState([]);

    const inputRef = React.useRef(null);
    //const inputRef = React.createRef();
    React.useImperativeHandle(
      ref,
      () => ({
        upload: () => inputRef.current
      }),
      [inputRef]
    );

    const onDrop = React.useCallback(
      (acceptedFiles) => {
        setMyFile([...acceptedFiles]);
        onOperation(acceptedFiles);
      },
      [myFile, onOperation]
    );

    const { getRootProps, getInputProps } = useDropzone({
      onDrop
    });

    const removeAll = () => setMyFile([]);
    const file = myFile.map((file, key) => (
      <Chip
        key={key}
        icon={<AttachFile />}
        label={`${file.path} - ${file.size} bytes`}
        color="primary"
        onDelete={() => {
          removeAll();
          onDelete && onDelete();
        }}
        style={{
          cursor: "pointer",
          backgroundColor: "#2196f3"
        }}
      />
    ));

    const label = "File";

    return (
      <span {...getRootProps({ className: "drop-zone" })}>
        <input ref={inputRef} {...getInputProps()} multiple={multiple} />
        {file.length > 0 ? (
          file
        ) : (
          <Chip
            icon={<AttachFile />}
            label={label}
            color="primary"
            style={{
              cursor: "pointer",
              backgroundColor: "#2196f3"
            }}
          />
        )}
      </span>
    );
  }
);

export default function App() {
  const onDrop = (file) => console.log(file);
  //const ref = React.useRef(null);
  const ref = React.createRef();

  React.useEffect(() => {
    console.log("Ref:", ref.current, ref.current.upload());
    /*if (ref.current) {
      ref.current.open();
    }*/
  }, []);

  return (
    <div className="App">
      <Dropzone ref={ref} onOperation={onDrop} />
    </div>
  );
}
EN

回答 1

Stack Overflow用户

发布于 2021-05-25 10:18:03

App中创建ref是对Dropzone组件的引用。通过useImperativeHandle,该引用有一个upload属性--返回input元素或null的函数。

不知何故,该值始终为null。起初,我认为这个问题与执行顺序有关。但事实并非如此。这是因为您的ref={inputRef}正在被{...getInputProps()}覆盖,其中包括它自己的ref属性。

但是现在点击图标不会做任何事情,因为react-dropzone包依赖于我们覆盖的ref。

幸运的是,useDropzone钩子返回一个inputRef。因此,相同的ref可以用于内部react-dropzone逻辑和您的自定义逻辑。它还返回一个您可以使用的open函数。

我删除了您的inputRef,并使用open函数作为ref.upload的值。

代码语言:javascript
运行
复制
const { getRootProps, getInputProps, open } = useDropzone({
  onDrop
});

React.useImperativeHandle(
  ref,
  () => ({
    upload: open
  }),
  [open]
);

我没有任何问题,让它在点击打开。但不幸的是@Marios Nikolaou的评论是正确的。当我尝试通过useEffect打开它时,在控制台中收到警告:

只有在用户激活时,才能显示

文件选择器对话框。

所以你想要的是不可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67243818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档