将数据从 Formik onSubmit 传递到 Firestore
Passing data from Formik onSubmit to Firestore
我正在尝试连接 Formik 以将更新的表单数据发送到 Firestore 以构建一个 "edit" 屏幕。
我已经使用 Formik 设置了表单和字段,并且可以从 Firebase 加载当前数据作为初始字段值。我坚持将更新的数据从 Formik 的 onSubmit() 发送到我的 updateVessel()。
这是我的代码:
const VesselEditScreen = props => {
const vesselId = props.route.params.vesselId;
const vesselName = props.route.params.vesselName;
// ===================================================================================
// Set up Firebase
// Set db location
const ref = db.collection('vessels');
// Set up state
const [loading, setLoading] = useState(true);
const [vesselData, setVesselData] = useState();
// Handle load data
useEffect(() => {
return ref.doc(vesselId).onSnapshot(documentSnapshot => {
const vessel = documentSnapshot.data();
setVesselData(vessel);
if (loading) {
setLoading(false);
}
});
}, []);
// Handle update data
async function updateVessel() {
await ref.doc(vesselId).update({
// Not sure here?
});
}
// ===================================================================================
// Check if we're loading/saving data
if (loading) {
return <LoadingSpinner />
};
// ===================================================================================
// Render form
return (
<ScreenWrapper>
<StandardBox>
<HeadingOne>Edit {vesselName}</HeadingOne>
<Formik
initialValues={{
name: vesselData.name,
breadth: vesselData.breadth,
callsign: vesselData.callsign
}}
onSubmit={values => {
const { name, breadth, callsign } = values;
updateVessel();
}}
>
{({ handleChange, handleBlur, handleSubmit, values }) => (
<View>
<TextInput onChangeText={handleChange('name')} onBlur={handleBlur('name')} value={values.name} />
<TextInput onChangeText={handleChange('breadth')} onBlur={handleBlur('breadth')} value={values.breadth} />
<TextInput onChangeText={handleChange('callsign')} onBlur={handleBlur('callsign')} value={values.callsign} />
<Button onPress={handleSubmit} title="Submit" />
</View>
)}
</Formik>
</StandardBox>
</ScreenWrapper>
);
};
export default VesselEditScreen;
我在这里错过了什么?感谢您提前提供任何提示!
您需要将 onSubmit
的值传递给将更新 firebase
的函数
onSubmit={values => {
const { name, breadth, callsign } = values;
// passing the values you want
updateVessel({ name, breadth, callsign });
}}
然后传给update
async function updateVessel(values) {
await ref.doc(vesselId).update(values);
}
如果您不确定如何更新单个文档,可以查看此question了解更多详细信息
我最后添加了以下函数来删除阻止 firebase 保存的 empty/null 值:
const removeEmpty = (obj) => {
Object.keys(obj).forEach((key) => (obj[key] == null) && delete obj[key]);
return obj;
}
然后在我的 Formik onSubmit 中这样调用它:
onSubmit={values => {
updateVessel( removeEmpty(values) );
}}
然后我在 Firebase 中更新容器的函数:
async function updateVessel(values) {
await ref.doc(vesselId).update(values);
props.navigation.navigate('DashboardScreen');
}
我正在尝试连接 Formik 以将更新的表单数据发送到 Firestore 以构建一个 "edit" 屏幕。
我已经使用 Formik 设置了表单和字段,并且可以从 Firebase 加载当前数据作为初始字段值。我坚持将更新的数据从 Formik 的 onSubmit() 发送到我的 updateVessel()。
这是我的代码:
const VesselEditScreen = props => {
const vesselId = props.route.params.vesselId;
const vesselName = props.route.params.vesselName;
// ===================================================================================
// Set up Firebase
// Set db location
const ref = db.collection('vessels');
// Set up state
const [loading, setLoading] = useState(true);
const [vesselData, setVesselData] = useState();
// Handle load data
useEffect(() => {
return ref.doc(vesselId).onSnapshot(documentSnapshot => {
const vessel = documentSnapshot.data();
setVesselData(vessel);
if (loading) {
setLoading(false);
}
});
}, []);
// Handle update data
async function updateVessel() {
await ref.doc(vesselId).update({
// Not sure here?
});
}
// ===================================================================================
// Check if we're loading/saving data
if (loading) {
return <LoadingSpinner />
};
// ===================================================================================
// Render form
return (
<ScreenWrapper>
<StandardBox>
<HeadingOne>Edit {vesselName}</HeadingOne>
<Formik
initialValues={{
name: vesselData.name,
breadth: vesselData.breadth,
callsign: vesselData.callsign
}}
onSubmit={values => {
const { name, breadth, callsign } = values;
updateVessel();
}}
>
{({ handleChange, handleBlur, handleSubmit, values }) => (
<View>
<TextInput onChangeText={handleChange('name')} onBlur={handleBlur('name')} value={values.name} />
<TextInput onChangeText={handleChange('breadth')} onBlur={handleBlur('breadth')} value={values.breadth} />
<TextInput onChangeText={handleChange('callsign')} onBlur={handleBlur('callsign')} value={values.callsign} />
<Button onPress={handleSubmit} title="Submit" />
</View>
)}
</Formik>
</StandardBox>
</ScreenWrapper>
);
};
export default VesselEditScreen;
我在这里错过了什么?感谢您提前提供任何提示!
您需要将 onSubmit
的值传递给将更新 firebase
onSubmit={values => {
const { name, breadth, callsign } = values;
// passing the values you want
updateVessel({ name, breadth, callsign });
}}
然后传给update
async function updateVessel(values) {
await ref.doc(vesselId).update(values);
}
如果您不确定如何更新单个文档,可以查看此question了解更多详细信息
我最后添加了以下函数来删除阻止 firebase 保存的 empty/null 值:
const removeEmpty = (obj) => {
Object.keys(obj).forEach((key) => (obj[key] == null) && delete obj[key]);
return obj;
}
然后在我的 Formik onSubmit 中这样调用它:
onSubmit={values => {
updateVessel( removeEmpty(values) );
}}
然后我在 Firebase 中更新容器的函数:
async function updateVessel(values) {
await ref.doc(vesselId).update(values);
props.navigation.navigate('DashboardScreen');
}