【发布时间】:2021-08-21 05:58:49
【问题描述】:
我有这个编辑页面,其中名字、姓氏和地址的初始值应该来自使用 useEffect 从 Firebase Firestore 检索到的数据。
useEffect(() => {
const unsubscribe = firestore
.collection("users")
.doc(uid)
.onSnapshot((snapshot) => {
const arr = [];
arr.push({
...snapshot.data(),
});
setUsers(arr);
});
return () => {
unsubscribe();
};
}, []);
handleSubmit 将更新的信息保存在 Firestore 中:
const handleSubmit = async (e) => {
e.preventDefault();
try {
const userRef = firestore.collection("users").doc(uid);
const ref = userRef.set(
{
firstName,
middleName,
lastName,
address,
},
{ merge: true }
);
console.log(" saved");
} catch (err) {
console.log(err);
}
};
下面是完整的代码:
const edit = () => {
const uid = location.state;
const [isLoading, setIsLoading] = useState(false);
const [users, setUsers] = useState([]);
const [firstName, setFirstName] = useState("");
useEffect(() => {
const unsubscribe = firestore
.collection("users")
.doc(uid)
.onSnapshot((snapshot) => {
const arr = [];
arr.push({
...snapshot.data(),
});
setUsers(arr);
setIsLoading(true);
});
return () => {
unsubscribe();
};
}, []);
const handleSubmit = (e) => {
e.preventDefault();
console.log(firstName);
};
return (
<div>
{isLoading ? (
<>
{users &&
users.map((user) => (
<li style={{ listStyle: "none" }}>
<CardHeader title="Update Profile" />
<form onSubmit={handleSubmit}>
<TextField
type="text"
value={user.firstName}
variant="outlined"
label="First Name"
fullWidth
onChange={(e) => setFirstName(e.target.value)}
/>
<Button type="submit"> Submit</Button>
</form>
</li>
))}
</>
) : (
<h1>Loading...</h1>
)}
</div>
);
};
export default edit;
假设我想编辑用户“John Park”的地址。这些文本字段应该具有 John 的名字和姓氏的初始值,因此即使地址字段是唯一更新的字段,当保存在 firestore 中时,名字和姓氏字段也不会是空字符串。我该怎么做?谢谢。
【问题讨论】:
-
可以提供沙盒吗?
-
您不能使用 useState 挂钩来存储值并在输入更改时更改它们,然后直接在 handlesubmit 函数中传递它们吗?
-
我有点同意@user11823877...自从使用
value属性以来,您已经控制了输入,但我没有看到任何onChange处理程序。 -
@user11823877 这是什么意思?
-
@DrewReese 我已经更新了代码,虽然当我控制台记录它时没有第一个名字的输出
标签: javascript reactjs firebase google-cloud-firestore material-ui