reactjs - 使用 firebase 数据库和反应钩子设置和更新表单输入
问题描述
在我的应用程序中,我有一个带有表格的个人资料部分。当组件挂载时,我想从 firebase 获取用户数据,并以用户配置文件的当前值将其显示在表单中。使用“值”道具或“占位符”道具。
当用户在表单输入中进行更改并提交更改时,我希望数据库更新并使用新数据更新表单。
目前我可以让数据库值出现在表单输入字段中,或者我可以让表单输入字段为空,但更新数据库。但不是两者兼而有之。以下代码使数据库数据呈现在表单输入中,但无法更改。
我知道它可能与第二个 useEffect() 和 getUserData() 函数有关,我似乎无法弄清楚。
const UserEdit = (props) => {
const [currentUser, setCurrentUser] = useState('');
const [forening, setForening] = useState('');
useEffect(() => {
firebase_app.auth().onAuthStateChanged(setCurrentUser);
}, [])
const getUserData = async () => {
await dbRef.ref('/' + currentUser.uid + '/profil/' ).once('value', snapshot => {
const value = snapshot.val();
setForening(value)
})
}
useEffect(() => {
getUserData()
},[] )
const handleInput = (event) => {
setForening(event.target.value)
}
const updateUserData = () => {
dbRef.ref('/' + currentUser.uid + '/profil/' ).set({foreningsnavn: forening}, function(error) {
if(error) {
console.log("update failed")
} else {
alert(forening)
}
})
}
const handleClick = () => {
updateUserData()
}
return (
<>
<div className="card-body">
<div className="row">
<div className="col-md-5">
<div className="form-group">
<label className="form-label">{Forening}</label>
<input className="form-control" type="text" value={forening} onChange={handleInput}/>
</div>
</div>
</div>
</div>
</>
)
}
解决方案
您的第二个 useEffect 将只运行一次,因为依赖项的第二个参数数组 [] 为空:
useEffect(() => {
getUserData()
},[] )
您可以添加外部依赖项以使 useEffect 通过输入更改运行
useEffect(() => {
getUserData()
},[foreign] )
或者您可以使用轮询来同步数据库状态
推荐阅读
- android - 另存为 pdf 意图
- java - 如何从具有联合主键的表中创建具有 TimescaleDB 的超表?
- php - 如何在 PHP 上请求用户输入
- google-cloud-firestore - Firestore 是否支持多租户?
- python - 数据帧的出栈级别
- .htaccess - 子域到子文件夹 .htaccess 的 RewriteRule
- wpf - 如何将值传递给 iValueConverter
- colors - 改变 aplha 颜色时失去头发容量
- excel - 如何在 SharePoint 网络上附加活动 Excel 工作表的 PDF 副本?
- c# - 如何将 Unity 的 Debug.Log 打印到屏幕/GUI?