【问题标题】:How can I edit an input added dynamically, without my input data populating other inputs in that array?如何编辑动态添加的输入,而不用我的输入数据填充该数组中的其他输入?
【发布时间】:2019-09-03 19:38:21
【问题描述】:

我有一个formik 表单,它根据数组x 的长度将View 映射到两个inputs。 x的长度会根据不同的场景而有所不同。

这里是代码。

import React, { Component, Fragment } from "react";
import { Button, TextInput, View, StyleSheet } from "react-native";
import { Formik } from "formik";

class App extends Component {
  render() {
    const x = [1,2];
    return (
      <View>
        <Formik
          initialValues={{ name: "", description: "" }}
          onSubmit={values => alert(JSON.stringify(values))}
        >
          {({ values, errors, handleBlur, handleChange, handleSubmit }) => (
            <Fragment>
              <TextInput
                placeholder="name"
                value={values.name}
                handleBlur={() => handleBlur("name")}
                onChangeText={handleChange("name")}
                style={styles.input}
              />
              <TextInput
                placeholder="description"
                value={values.description}
                handleBlur={() => handleBlur("description")}
                onChangeText={handleChange("description")}
                style={styles.input}
              />
              {x.map(x => {
                return (
                  <View>
                    <TextInput key={x}
                      placeholder={`name`}
                      value={values.name}
                      handleBlur={() => handleBlur}
                      onChangeText={handleChange}
                      style={styles.input}
                    />
                    <TextInput
                      placeholder={`description`}
                      value={values.description}
                      handleBlur={() => handleBlur(x.toString())}
                      onChangeText={handleChange}
                      style={styles.input}
                    />
                  </View>
                );
              })}
              <Button title="submit" onPress={handleSubmit} />
            </Fragment>
          )}
        </Formik>
      </View>
    );
  }
}

当我提交时,我无法让它正常工作。当我输入时,文本也会填充该名称的所有其他输入,例如,如果我输入description 输入,则文本会填充description 的所有其他迭代,我该怎么做这份工作?

看看小吃

HERE

【问题讨论】:

    标签: javascript arrays reactjs react-native mapping


    【解决方案1】:

    您需要动态创建初始值对象以使提交正常工作,例如:

    const x = [1, 2];
    const initialFields = { name: "", description: "" };
    const extraFields = x.map(num => ({
      [`name${num}`]: "",
      [`description${num}`]: ""
    }));
    

    这可以像这样传递给您的 Formik 表单:

    <Formik
      initialValues={Object.assign(initialFields, ...extraFields)}
      onSubmit={values => alert(JSON.stringify(values))}
    >
    

    然后更改您动态添加的 TextInputs 以使用这些值,如下所示:

    {x.map(x => {
      return (
        <View>
          <TextInput
            placeholder={`name${x}`}
            value={values[`name${x}`]}
            handleBlur={() => handleBlur(`name${x}`)}
            onChangeText={handleChange(`name${x}`)}
            style={styles.input}
          />
          <TextInput
            placeholder={`description${x}`}
            value={values[`description${x}`]}
            handleBlur={() => handleBlur(`description${x}`)}
            onChangeText={handleChange(`description${x}`)}
            style={styles.input}
          />
        </View>
      );
    })}
    

    查看my fork of your CodeSandbox 以获得工作演示。

    【讨论】:

    • 谢谢@etarhan 如果你一开始不知道用户会添加多少元素,你会怎么做?例如,当它与订单一起使用时,用户可以在订单中添加 n 行吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多