Żyw*_*ywy 3 javascript safari reactjs recoiljs
我已经<input type="file" />并且想要触发.click()该输入。在 chrome、firefox、edge 中一切正常,但在 safari 中存在问题。
当我点击按钮触发时 inputFile.current.click()- 它起作用了。但是当它发生在 useEffect/useLayoutEffect 内部时 - 它不起作用(我尝试添加超时,但也没有帮助)。
重现问题的工作示例:https://codesandbox.io/s/react-hooks-counter-demo-forked-49n2t ?file=/src/index.js
尽可能少的代码来解决问题
import React, { useCallback, useState, useEffect, useLayoutEffect, useRef } from 'react';
import { useRecoilState } from 'recoil';
import { requestedNewCanvasObjAtom } from '../SlidesState/slidesAtoms';
const Slide: React.FC = () => {
const [trigger, setTrigger] = useState(false);
const [requestedNewCanvasObj] = useRecoilState(requestedNewCanvasObjAtom);
const inputFile = useRef(null);
useLayoutEffect(() => {
console.log('IT IS HERE WHEN EXPECTED BUT IT DOES NOT WORK TOO');
inputFile.current.click();
}, [requestedNewCanvasObj]);
useLayoutEffect(() => {
console.log('IT WORKS');
inputFile.current.click();
}, [trigger]);
const triggerUpload = useCallback(() => {
if (inputFile && inputFile.current) {
console.log('IT WORKS');
inputFile.current.click();
}
}, []);
return (
<>
<button onClick={triggerUpload}>Click</button>
<button onClick={() => setTrigger(true)}>Update state to trigger input click</button>
<input type="file" id="file" ref={inputFile} />
</>
);
};
export default Slide;
Run Code Online (Sandbox Code Playgroud)
这个问题已更新 - useLayoutEffect 解决了无后坐力的简化问题,但事实证明我的问题更复杂
单击事件已触发,但查找器未显示。使用useLayoutEffect。它在所有 DOM 突变后同步触发:
useLayoutEffect(()=> {
if (inputRef && inputRef.current) {
inputRef.current.click();
}
}, [count])
Run Code Online (Sandbox Code Playgroud)
在其他浏览器中Chrome,如 、useEffects和useLayoutEffect将显示取景器。但在 中Safari,只有意志useLayoutEffect起作用。
| 归档时间: |
|
| 查看次数: |
1465 次 |
| 最近记录: |