【发布时间】:2021-03-05 07:31:11
【问题描述】:
也许我误解了useEffect的概念,但我认为它取代了componentDidMount、componentDidUpdate和componentWillUnmount,所以它的第一次运行是在组件渲染之后。
我想将 firebase 集成到我的 react 项目中,但是在我看来 useEffect 在渲染方法之前运行,因为如果我按照以下方式使用它,它会给我这个错误
reCAPTCHA 容器未找到或已包含内部 元素!
const PhoneVerificationModal = (props) => {
useEffect(() => {
const firebaseConfig = {
apiKey: "...",
authDomain: "...",
databaseURL: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "...",
appId: "..."
};
firebase.initializeApp(firebaseConfig);
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', {
'size': 'invisible',
'callback': function (response) {
// reCAPTCHA solved, allow signInWithPhoneNumber.
firebaseSubmit();
}
});
}, []);
const [open, toggleOpen] = useState(props.open);
useEffect(() => {
toggleOpen(props.open);
});
const sendVerificationCode = () => {
if (props.phone) {
console.log(props.phone);
let phoneNumber = props.phone;
var appVerifier = window.recaptchaVerifier;
firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier)
.then(function (confirmationResult) {
console.log(confirmationResult);
window.confirmationResult = confirmationResult;
}).catch(function (error) {
});
}
}
const firebaseSubmit = () => {
}
return (
<Modal open={open} key={open} closeModal={props.closeModal}>
<div className={classes.PhoneVerificationModalInner}>
<div className={classes.headerRow}>
</div>
<div className={classes.narrowCol}>
<div id="recaptcha-container"></div>
<Button
className={classes.button}
rightIcon={Images.arrow}
>Continue</Button>
</div>
</div>
</Modal>
)
}
如果我用 setTimeout 向 recaptcha 构造函数添加延迟,它运行没有问题。那么构造函数怎么找不到元素,即使它是由于useEffect而渲染的呢?
【问题讨论】:
-
在调用 RecaptchaVerifier 之前,你有没有尝试过 console.log(document.querySelector("#'recaptcha-container'")),看看是否元素存在于 dom 中?
-
@lissettdm 它说它为空。但怎么可能呢?我认为useEffect的第一次运行是在渲染之后,因此元素应该存在
-
是的,它在第一次渲染后运行,参见stackblitz.com/edit/react-mgcsdg。尝试删除与firebase相关的代码,看看它是否打印了该项目。
-
我认为错误在 Modal 组件内部,在它如何呈现子组件方面。
-
尝试将此 移到模态组件之外。仅用于测试目的
标签: javascript reactjs firebase-authentication