javascript - 如何在 React 中访问和更新对象数组中的字段?
问题描述
我正在尝试填写输入数组中的“ans”字段,但是当我输入其中一个输入时,它会覆盖该状态中的所有其他对象。当我以正确的方式在其中一个输入中键入内容时,如何更新对象数组中的“ans”字段,而不会覆盖状态内数组中的其他对象?
我的代码:
import React, { useState } from "react";
import {
StyleSheet,
View,
Text,
KeyboardAvoidingView,
ScrollView,
TextInput,
Button,
} from "react-native";
export default function List({ navigation }) {
const [data, setData] = useState({
"creator": {
"creatorAuthor": "Alisson",
"user": "",
},
"customField": [
{
"ans": "",
"quests": "Quest 1",
},
{
"ans": "",
"quests": "Quest 2",
},
{
"ans": "",
"quests": "Quest 3",
},
],
"date": {
"dateCreator": "01/01/2021",
"dateUser": "",
},
"id": "-MQxtMmc_K7rDIgutcNC",
"title": "Google",
}
);
return (
<KeyboardAvoidingView style={{backgroundColor: 'white', flex: 1}} enabled>
<ScrollView contentContainerStyle={{ padding: 10 }}>
<View>
<Text>{data.title}</Text>
</View>
<View>
<Text>{ data.creator.creatorAuthor}</Text>
<TextInput
style={{marginBottom: 20}}
placeholderTextColor= '#808080'
value={data.creator.user}
onChangeText={value => setData({ ...data, creator: {...data.creator, user: value} })}
placeholder='Usuário'
multiline={true}
/>
</View>
<View>
<Text>{data.date.dateCreator}</Text>
<TextInput
style={{marginBottom: 20}}
placeholderTextColor= '#808080'
value={data.date.dateUser}
onChangeText={value => setData({ ...data, date: {...data.date, dateUser: value} })}
placeholder='Data das repostas'
/>
</View>
{
data.customField.map((q, id) => (
<View key={id}>
<Text>{q.quests}</Text>
<TextInput
style={{marginBottom: 20}}
placeholderTextColor= '#808080'
value={q.ans}
onChangeText={value => setData({ ...data, customField: [{...q, ans: value}] })}
placeholder='Resposta'
multiline={true}
/>
</View>
))
}
<Button
title='Salvar'
onPress={() => {}}
/>
</ScrollView>
</KeyboardAvoidingView>
);
}
解决方案
这只会产生一个包含一个值的数组:
onChangeText={value => setData({ ...data, customField: [{...q, ans: value}] })}
您必须复制原始数组并替换要更新的值:
onChangeText={value => setData({ ...data, customField: [data.customField.filter(cf => cf.quests !== q), {...q, ans: value}] })}
我没有测试语法,但应该是这样的。
我建议将数据拆分为多个状态字段,因为它可以让您使用更简单的语法,并且您所做的事情会更加明显:
const [customField, setCustomField] = useState({ -your custom field data here-});
{
customField.map((q, id) => (
<View key={id}>
<Text>{q.quests}</Text>
<TextInput
style={{marginBottom: 20}}
placeholderTextColor= '#808080'
value={q.ans}
onChangeText={value => setCustomField([ customField.filter(cf => cf.quests !== q), {...q, ans: value}]}
placeholder='Resposta'
multiline={true}
/>
</View>
))
}
推荐阅读
- r - 为knitr中的特定块设置本地块选项?
- python - 从 excel 中抓取 Python 网页:如何为每 100 行添加睡眠
- python-3.x - 接收错误:NameError:名称“size_cost”未定义
- javascript - How to Await an IndexedDB Open when Onupgradeneeded Fires
- sql - 带有 Varchar 的 IN 不起作用 sql server
- java - 如何在 android 中以编程方式在 SVG 上设置和获取色调颜色?
- tensorflow - 在哪些情况下我们使用属性 trainable_variables 而不是 trainable_weights,反之亦然 TF2 中的 tf.keras.Model?
- java - eclipse中的链接源文件夹在其他编辑器和终端中不起作用
- php - 无法从处理程序类 laravel 获取会话消息
- android - 当 Json 内容以对象 ({) 开头时,我无法使用 Kotlin 访问