将数据从Formik的onSubmit传递到Firestore
将数据从Formik的onSubmit传递到Firestore
我正在尝试将Formik与Firestore连接起来,以构建一种“编辑”屏幕。我已经使用Formik设置了表单和字段,并且可以将当前数据从Firebase中作为初始字段值加载。我在将Formik的onSubmit()中更新的数据发送到我的updateVessel()上遇到了问题。
这是我的代码:
const VesselEditScreen = props => { const vesselId = props.route.params.vesselId; const vesselName = props.route.params.vesselName; // =================================================================================== // 设置Firebase // 设置数据库位置 const ref = db.collection('vessels'); // 设置状态 const [loading, setLoading] = useState(true); const [vesselData, setVesselData] = useState(); // 处理加载数据 useEffect(() => { return ref.doc(vesselId).onSnapshot(documentSnapshot => { const vessel = documentSnapshot.data(); setVesselData(vessel); if (loading) { setLoading(false); } }); }, []); // 处理更新数据 async function updateVessel() { await ref.doc(vesselId).update({ // 不确定怎么写? }); } // =================================================================================== // 检查是否正在加载/保存数据 if (loading) { return}; // =================================================================================== // 渲染表单 return ( ); }; export default VesselEditScreen; 编辑 {vesselName} { const { name, breadth, callsign } = values; updateVessel(); }} > {({ handleChange, handleBlur, handleSubmit, values }) => ( )}
我在这里漏掉了什么?提前感谢任何提示!
从上述内容中可以整理出以下原因和解决方法:
原因:
- 使用Formik提交表单数据到Firestore时,存在空值或null值会导致Firebase保存失败。
解决方法:
1. 添加一个函数来移除空值或null值:
const removeEmpty = (obj) => { Object.keys(obj).forEach((key) => (obj[key] == null) && delete obj[key]); return obj; }
2. 在Formik的onSubmit中调用这个函数:
onSubmit={values => { updateVessel( removeEmpty(values) ); }}
3. 创建一个用于更新Firebase中vessel的函数:
async function updateVessel(values) { await ref.doc(vesselId).update(values); props.navigation.navigate('DashboardScreen'); }
以上就是解决“Passing data from Formik onSubmit to Firestore”问题的原因和解决方法。通过添加removeEmpty函数来移除空值或null值,然后在Formik的onSubmit中调用这个函数,最后通过updateVessel函数将更新后的数据保存到Firebase中。
问题的原因是希望在Formik的onSubmit事件中将数据传递给Firestore进行更新,但不清楚如何实现。解决方法是将onSubmit事件中的值传递给一个函数,该函数将用于更新Firebase。
首先,在onSubmit中提取所需的值,并将其传递给updateVessel函数:
onSubmit={values => { const { name, breadth, callsign } = values; updateVessel({ name, breadth, callsign }); }}
然后,将这些值传递给update函数,用于更新Firestore中的文档:
async function updateVessel(values) { await ref.doc(vesselId).update(values); }
如果不确定如何更新单个文档,可以参考这个问题中的更多细节:question