javascript - react js react-dropzone 页面加载时自动开启
问题描述
我正在使用react-dropzone
,我想在页面加载后立即自动打开文件上传对话框。
我编写了以下代码,但我无法理解如何使其自动打开,这将是我做错了,ref
因为我可以访问它的属性。
你能帮我个忙吗?
链接:codesandbox
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>
);
}
解决方案
ref
创建的是对您的组件App
的引用。Dropzone
通过useImperativeHandle
,该 ref 具有一个属性,即upload
- 一个返回input
元素或null
.
不知何故,价值总是null
。起初我认为这个问题与执行顺序有关。但事实并非如此。这是你ref={inputRef}
的被覆盖,{...getInputProps()}
其中包括它自己的ref
财产。如果您切换顺序并放ref
最后一个,那么您将开始记录该<input>
元素。
但是现在点击图标并没有做任何事情,因为 react-dropzone 包依赖于我们覆盖的 ref。
幸运的是,useDropzone
钩子返回一个inputRef
. 因此,相同的 ref 可用于内部 react-dropzone 逻辑和您的自定义逻辑。它还返回一个open
您可以使用的函数。
我删除了您的inputRef
并将该open
函数用作 的值ref.upload
。
const { getRootProps, getInputProps, open } = useDropzone({
onDrop
});
React.useImperativeHandle(
ref,
() => ({
upload: open
}),
[open]
);
我没有问题让它在点击时打开。但不幸的是@Marios Nikolaou 的评论是正确的。当我尝试通过 a 打开它时useEffect
,我在控制台中收到警告:
文件选择器对话框只能在用户激活时显示。
所以你想要的是不可能的。
推荐阅读
- c++ - Qt 5 App 因“qLineEdit::setText”而崩溃
- java - 使用 Spring 4.1 在项目中注入依赖项
- android - 如何正确指定 CMakeLists 文件
- kentico - 使用新值更新后,全局键或本地化键值未获得正确值。在 kentico 12. 在同一个域中
- kotlin - 为什么可以将高阶函数的扩展函数参数调用为 Kotlin 中的普通函数?
- matlab - 如何在 Matlab GUIDE 列表框中使用动态数据列表
- java - Spring Boot REST 读取 JSON 数组有效负载
- selenium - 使用子元素的文本获取父元素的 XPath
- python - 如果列名 == Year 且值为 NaN pandas,则将数据框中的值向左移动
- vue.js - v-for 中的动态计算属性