- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个编辑页面,其中名字、姓氏和地址的初始值应该来自使用 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 中时,名字和姓氏字段也不会是空字符串。我该怎么做?谢谢你。
最佳答案
似乎您正在更新本地状态,但它没有初始化为空字符串。
您的更新应该是到 users
的本地副本。您获取了,提交处理程序应该在您的后端获取特定用户进行更新。
const [users, setUsers] = React.useState([]);
更改处理程序 - 柯里化(Currying)函数以获取索引并返回处理程序。它映射了以前的
users
状态到下一个,更新指定索引处的用户。
const changeHandler = index => e => {
const { name, value } = e.target;
setUsers(users => users.map((user, i) => i === index
? {
...user,
[name]: value,
}
: user,
));
};
提交处理程序 - curried 函数以获取特定用户对象的索引以发送到后端。
const handleSubmit = index => async (e) => {
e.preventDefault();
try {
const userRef = firestore.collection("users").doc(uid);
const ref = userRef.set(
{ ...users[index] }, // <-- user by index
{ merge: true }
);
console.log(" saved");
} catch (err) {
console.log(err);
}
};
将当前映射的索引传递给处理程序。添加
name
属性到与输入的用户属性名称匹配的每个字段。
return (
<div>
{isLoading ? (
<>
{users &&
users.map((user, index) => (
<li style={{ listStyle: "none" }}>
<CardHeader title="Update Profile" />
<form onSubmit={handleSubmit(index)}> // <-- pass index
<TextField
type="text"
value={user.firstName}
variant="outlined"
label="First Name"
name="firstName" // <-- add name attribute
fullWidth
onChange={changeHandler(index)} // <-- pass index to handler
/>
... other fields
<Button type="submit">Submit</Button>
</form>
</li>
))}
</>
) : (
<h1>Loading...</h1>
)}
</div>
);
关于javascript - 如何将从 useEffect 中获取的 initialValue 放在 textField 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68870528/
版本 1: var c = [ '##' ] console.log(c.reduce(function(a,b){ return b.length }, 0)) // 2 版本 2: var c
我有一个用 React select 制作的 selectInput 组件,我在 Formik Form 中。我正在尝试让我的 Formik 值更新为从 React Select 返回的值。完成这项工
我试图按如下方式获取表单设置的初始值,但它不起作用: const mapStateToProps = (state, props) => ({ initialValues: state.chart
我设置了所有线程通用的ThreadLocal初始值。当调用构造函数时,我更改了值并且它打印正确。但是当启动线程时,它又变成了初始值?这是预期的吗?如果是,解释是什么?下面是我的两个类。提前致谢。 My
我需要在我的数据库中的所有表中有一个以偏移量开头的唯一 ID,比方说 1000。该偏移量以下的 ID 保留给由 Java 代码中的常量引用的特殊记录。换句话说,我希望 ID 为 1000 的任何表中保
所以我的屏幕代码看起来像这样。我有一个 useState amount,它在重新呈现时不断重置为 initialValue。我有大约 3 个 useEffects。其中之一在此处的示例代码中,我从数据
我正在使用 Bloc 库并在产生新状态后注意到我的 TextFormField初始值不会改变。 我的应用程序比这更复杂,但我做了一个最小的例子。还跟踪它在推送事件后正在改变的状态。 Bloc 应该正确
在 MDN Array.prototype.reduce() ,allNames[name]是什么意思? allNames应该是 {}首先,但如果对象为空,allNames[name] = 1等于 {
由于多次调用 ThreadLocal 的 initialValue(),我们发现了一个问题。 private static class MonMetricsTLS extends ThreadLoca
在我所有的实体上,我手动定义了 allocationSize 和 initialValue,就像这样: @Id @SequenceGenerator(name = "ID_GENERATOR", se
我有一个包含一些字段的表单,其中一个是日期字段: GestureDetector( onTap: () { selectDate(context); }, child: Abso
以initializingFromState为例在 Redux-Form 中,我试图动态设置它。这是编辑书籍列表中的特定书籍,并使用在 express.js 中设置的简单 api。 完整容器如下。我不
我知道这个问题可能看起来很基础,但我正在学习 React 和 Formik。我正在尝试构建一个表单组件,用户可以在其中根据需要动态添加新输入。这存储在将导入到“调查”组件中的“名称”组件中。 似乎 N
我只想以 redux 形式设置并渲染表单的初始值。数据位于 redux 中,我相信我的映射是正确的......但表单未填充。该表单对于插入来说效果很好,但现在我正在将其连接起来以进行更新。 Redux
@TableGenerator(name="Emp_Gen",table="ID_GEN", pkColumnName = "GEN_NAME",pkColumnValue = "Employee_G
我确定我读错了,但是 MDN 是这么说的...... initialValue Value to use as the first argument to the first call of the
我对 threadLocal 的 initialValue 和 withInital 方法有点困惑。 考虑一种情况,我在父线程中有数据,并且我正在使用 InheritableThreadLocal。
我有一个 redux 表单,我正在尝试使用 initialValues 初始化表单。 .给定以下代码,表单未填充名称或年龄: const EmployeesForm = reduxForm({ f
每个人。 我正在使用没有任何自己的 TextEditController 的 Form 和 TextFieldForm。有 3 个带有初始值的 TextFieldForm (Value_1, Valu
我在使用 redux-form/immutable (v6.0.5) 和自定义组件渲染传递给表单的 initialValues 时遇到问题: // WRAPPER COMPONENT import R
我是一名优秀的程序员,十分优秀!