我想input type="file"
在组件外部的状态发生变化时触发点击。
当更新状态作为 prop 传递并执行 useEffect 函数时,一切都按预期工作。
当更新状态被传递时,useRecoilState
它似乎不起作用(但仅在 safari 中) - 它按预期触发 useEffect 但inputRef.current.click()
不起作用。
这是提出问题的工作代码:https ://codesandbox.io/s/useeffect-recoil-trigger-vs-prop-w7lwq?file=/src/index.js:315-329
这是代码:
export const recoilTriggerAtom = atom({
key: "recoilTriggerAtom",
default: 0
});
function ChildComponent({ propTrigger }) {
const [recoilTrigger] = useRecoilState(recoilTriggerAtom);
const inputRef = useRef(null);
useLayoutEffect(() => {
if (recoilTrigger > 0) {
console.log("here it doesn't work in Safari");
inputRef.current.click();
}
}, [recoilTrigger]);
useLayoutEffect(() => {
if (propTrigger > 0) {
console.log("here it works in Safari");
inputRef.current.click();
}
}, [propTrigger]);
const onFileSelected = (e) => {
console.log("onFileSelected", e.target.files[0]);
};
return (
<div className="App">
<input type="file" ref={inputRef} onChange={onFileSelected} />
</div>
);
}
function ParentComponent() {
const [propTrigger, setPropTrigger] = useState(0);
const [recoilTrigger, setRecoilTrigger] = useRecoilState(recoilTriggerAtom);
const updateRecoilTrigger = () => {
setRecoilTrigger(recoilTrigger + 1);
};
const updatePropTrigger = () => {
setPropTrigger(propTrigger + 1);
};
return (
<div>
<button onClick={updateRecoilTrigger}>Recoil trigger</button>
<button onClick={updatePropTrigger}>Prop trigger</button>
<ChildComponent propTrigger={propTrigger} />
</div>
);
}
function Root() {
return (
<RecoilRoot>
<ParentComponent />
</RecoilRoot>
);
}