在 React Native Input/TextInput 中输入值时如何更新 JSON 对象值

Posted

技术标签:

【中文标题】在 React Native Input/TextInput 中输入值时如何更新 JSON 对象值【英文标题】:How to update a JSON object value when value is entered in React Native Input/TextInput 【发布时间】:2021-12-27 19:16:29 【问题描述】:

作为调查的一部分,我有一个供用户完成的问题列表,我将问题呈现在不同的组件中,这些组件都位于父文件中。我能够从状态中更新的子组件中获取每个值,但现在想要更新我在当前设置为 Null 的 JSON 对象中拥有的 Answer 字段。

这是我的 JSON 对象,名为 data

我需要访问每个问题并更新answer 字段。

我的父文件目前如下所示:

export default function SurveyScreen(navigation, route) 
  const [childNameValue, setChildNameValue] = useState('');

const updateQuestion = (answer, type_index, question_index) => 
    console.log(answer);
  ;

return (
<ScrollView style=styles.cardContainer>
        <View>
          <Text style=styles.title>Please fill out all questions below</Text>
        </View>
        <View>

          <BasicTextInput
            title="Child's full name"
            value=childNameValue
            onChangeValue=newValue => setChildNameValue(newValue)
            updateQuestion(newValue);
          />
       );

及子组件文件:

export default function BasicTextInput(title, onChangeValue, updateQuestion) 
  return (
    <View style=styles.container>
      <View style=styles.containerHeader>
        <Text style=styles.questionTitle>title</Text>
      </View>
      <View style=styles.answerContainer>
        <TextInput
          style=styles.input
          onChangeText=onChangeValue
          updateQuestion=updateQuestion
        />
        <View />
      </View>
    </View>
  );

我在我的父组件中得到了答案,并成功运行了 console.log(answer)。

我希望能够在运行 axios 请求提交之前更新 JSON 对象中的答案字段。

我认为在我的 updateQuestion 函数中运行一些类似的东西可能会起作用,但想知道最好的方法吗?

data.questions[type_index].questions[question_index].answer.answer = answer;

提前谢谢你!

【问题讨论】:

【参考方案1】:

你当然可以改变你想要更新的字段。

或者您可以使用 React 能够检测到的适当的不可变更新:

// something like
const replace = (arr, i, insert) => [...arr.slice(0, i), insert, ...arr.slice(i+1)];
const updateDeepDeepAnswer = 
  ...data,
  questions: replace(data.questions, type_index, 
  ... data.questions[type_index],
  questions: replace(data.questions[type_index].questions, question_index, 
    ...data.questions[type_index].questions[question_index],
    answer: 
      ...data.questions[type_index].questions[question_index].answer,
      answer,
    ,
  ),
),

这就是为什么我们在 React 状态下尽量保持数据简单的原因。

我很想:

    将问题集和问题存储在不同的状态切片上。因此,对答案字段的更新并不是深度更新。 单独存储答案及其问题 ID。然后将这些 questionId + answer 对象发送到您的 api 以保存在数据库中。

【讨论】:

感谢您的帮助,我最终更改了代码,以便通过数据映射并动态列出问题,然后将 updateQuestion 函数作为道具传递,但您的回答确实帮助了我!欣赏它

以上是关于在 React Native Input/TextInput 中输入值时如何更新 JSON 对象值的主要内容,如果未能解决你的问题,请参考以下文章

React Native - 在 Android 上构建 react-native-camera 错误

用 react-native-firebase 编译 react-native

在带有 wix/react-native-navigation 的模态中使用 react-native-gesture-handler (RNGH)

在 react-native-device-info 之后 React Native 代码中断

使用 react-native-firebase 在 React Native 上自定义通知

React-Native + crypto:如何在 React-Native 中生成 HMAC?