我试图在弹出对话框后聚焦父输入框。我试图将父的引用传递给子,并从子焦点,但很难使其工作。
我很感激你的帮助。
代码沙盒:https://codesandbox.io/s/modal-components-react-custom-hooks-forked-iyumhx?file=/src/Modal.js
验证码:
const App = () => {
const { isShowing, toggle, setIsShowing } = useModal();
const [input, setInput] = useState("");
const ref = useRef();
useEffect(() => {
if (input != "") setIsShowing(true);
}, [input]);
return (
<div className="App">
<input type="text" ref={ref} onChange={(e) => setInput(e.target.value)} />
<Modal
isShowing={isShowing}
hide={toggle}
forwardRef={ref}
input={input}
/>
</div>
);
};
在Console.log ref中,我可以看到Ref已定义,但focus
函数不起作用。
const Modal = ({ isShowing, hide, forwardRef, input }) => {
useEffect(() => {
console.log(forwardRef);
forwardRef.current.focus();
}, []);
return (
<>
<M
isOpen={isShowing}
role="dialog"
autoFocus={true}
centered={true}
size="lg"
// query={query}
scrollable={false}
>
From Parent {input}
</M>
</>
);
};
3条答案
按热度按时间kx1ctssn1#
将您的模态useEffect更改为
kpbwa7wx2#
将autofocus设置为false。这将防止modal从输入中窃取焦点。
cu6pst1q3#
问题是reactstrap库中的modal默认有
autoFocus={true}
,你必须将其设置为false,你也不需要useRef的帮助。App.jsx
Modal.jsx
useBoolean.js