React 表单,提交对象,然后将其推送到数组

2024-03-17

我是 React 新手,不确定如何执行此操作。

我有一组已映射并在视图中渲染的对象。我想要做的是设置一个表单,将每个字段的值提交到新对象的相应属性,但我不确定如何执行此操作。

这是我的初始数据,它在视图中呈现:

contactArray = [
  {
    name: 'John'
    email: '[email protected] /cdn-cgi/l/email-protection'
    number: 111-111-111
  },
  {
    name: 'Dave'
    email: '[email protected] /cdn-cgi/l/email-protection'
    phone: '222-222-222'
  }
]

然后我有一个表格:

class InputForm extends Component {
  render() {
    return (   
        <form>
          <input type='text' onChange={this.handleChange}/>
          <input type='text' onChange={this.handleChange}/>
          <input type='text' onChange={this.handleChange}/>
          <button type='submit' onSubmit={this.handleSubmit}>SUBMIT</button>
        </form>
    ) 
  }

然后我假设我将状态声明为:

constructor(props) {
  super(props);
  this.state = {
    name: '',
    email: '',
    phone: ''
  }
}

然后提交功能我真的不知道如何处理......

handleSubmit() {
  // not sure about this...
  this.setState({
    name: // ????
    email: // ????
    phone: // ????
  })
}

然后我想清除提交表单,以及用于推送新对象的对象,该对象现在位于数组中(我希望这是有意义的......)

所以,我什至不确定如何在这种情况下使用状态,但最终我想push()呈现的数组的新对象,以及表单中完成的所有属性。

抱歉,到目前为止,我无法更完整地完成我的工作,但至少会感谢对此的一些指示!


据我了解,你想把新人推向现有的人contactArray?我将分享我的做法。看一看:

const contactArray = [
{
    name: 'John',
    email: '[email protected] /cdn-cgi/l/email-protection',
    phone: '111-111-111'
  },
  {
    name: 'Dave',
    email: '[email protected] /cdn-cgi/l/email-protection',
    phone: '222-222-222'
  }
];

class Form extends React.Component {

  constructor() {
    super();
    this.state = {
      contacts: contactArray
    };
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleSubmit(e) {
    e.preventDefault();
    const
    { contacts } = this.state,
    name = this.refs.name.value,
    email = this.refs.email.value,
    phone = this.refs.phone.value;
    this.setState({
      contacts: [...contacts, {
        name,
        email,
        phone
      }]
    }, () => {
      this.refs.name.value = '';
      this.refs.email.value = '';
      this.refs.phone.value = '';
    });
  }

  render() {
    const { contacts } = this.state;
    console.log('message',this.state.contacts);
    return (   
      <div>
        <h2>Add Someone</h2>
        <form onSubmit={this.handleSubmit}>
          <input type="text" ref="name" placeholder="name" />
          <input type="text" ref="email" placeholder="email" />
          <input type="text" ref="phone" placeholder="phone" />
          <button type="submit">Submit</button>
        </form>
        <h2>Exsiting contacts:</h2>
        <ul>
          {contacts.map((contact) => 
           <li>{`Name: ${contact.name} Email: ${contact.email} Phone: ${contact.phone}`}</li>
          )}
        </ul>
      </div>
    ) 
  }
}

ReactDOM.render(<Form />, document.getElementById('root'));

所以我们要做的第一件事就是保存contactArray在我们要使用它的实际组件中,接下来我们声明并绑定我们的handleSubmit我在用refs以获得输入的值。this.setState ({ contacts: [...contacts] , { Object });这里我们使用 ES6 spread 运算符将所有现有联系人传递到新状态并添加新联系人。{ name, email, phone }完全就像做{ name:name, email:email ...}这只是一个简写this.setState({}, () => { Callback! });在回调函数中this.setState({});我要清除输入值。现场演示:http://codepen.io/ilanus/pen/qaXNmb http://codepen.io/ilanus/pen/qaXNmb

这是另一种方法,不同的方法会产生相同的结果。

const contactArray = [
  {
    name: 'John',
    email: '[email protected] /cdn-cgi/l/email-protection',
    phone: '111-111-111'
  },
  {
    name: 'Dave',
    email: '[email protected] /cdn-cgi/l/email-protection',
    phone: '222-222-222'
  }
];

class Form extends React.Component {

  constructor() {
    super();
    this.state = {
      contacts: contactArray,
      newContact: {
       name: '',
       email: '',
       phone: ''
     }
    };
    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleInput = this.handleInput.bind(this);
  }

  handleSubmit(e) {
    e.preventDefault();
    const { contacts, newContact } = this.state;
    this.setState({
      contacts: [...contacts, newContact],
    }, () => {
      for (let val in newContact) {
        newContact[val] = ''; // Clear the values...
      }
      this.setState({ newContact });
    });
  }

  handleInput(e, element) {
    const { newContact } = this.state;
    newContact[element] = e.target.value;
    this.setState({ newContact });
  }

  render() {
    const { contacts, newContact } = this.state;
    const { name, email, phone } = newContact;
    return (   
      <div>
        <h2>Add Someone</h2>
        <form onSubmit={this.handleSubmit}>
          <input type="text" value={name} onChange={e => this.handleInput(e, 'name')} placeholder="name" />
          <input type="text" value={email} onChange={e => this.handleInput(e, 'email')} placeholder="email" />
          <input type="text" value={phone} onChange={e => this.handleInput(e, 'phone')} placeholder="phone" />
          <button type="submit">Submit</button>
        </form>
        <h2>Exsiting contacts:</h2>
        <ul>
          {contacts.map((contact) => 
           <li>{`Name: ${contact.name} Email: ${contact.email} Phone: ${contact.phone}`}</li>
          )}
        </ul>
      </div>
    ) 
  }
}

ReactDOM.render(<Form />, document.getElementById('root'));

现场演示:http://codepen.io/ilanus/pen/LRjkgx http://codepen.io/ilanus/pen/LRjkgx

我强烈建议使用第一个示例。因为它的性能会更好:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 表单,提交对象,然后将其推送到数组 的相关文章

随机推荐

  • 未找到获取命令:rasa 使用 rasa 命令

    我已经安装了rasa using pip3 install rasa 当我尝试使用时rasa命令如 rasa init 我收到 zsh 错误 找不到命令 rasa 错误 我在 Mac OS Catalina 上使用 Python版本2 7
  • 将 Mayavi 安装到 Anaconda 中

    我想将 Mayavi 安装到我的 anaconda 安装中 因为我运行了以下命令 但收到一条错误消息 我不知道如何处理 user Kubuntu source activate myenv myenv user Kubuntu conda
  • 仅在训练折叠上使用 sklearn 的 RandomizedSearchCV 和 SMOTE 过采样

    我有一个高度不平衡的数据集 99 5 0 5 我想使用以下命令对随机森林模型执行超参数调整sklearn s RandomizedSearchCV 我希望使用 SMOTE 对每个训练折叠进行过采样 然后在最终折叠上评估每个测试 保持原始分布
  • Golang SSH 到思科无线控制器并运行命令

    我正在尝试通过 Go SSH 到 Cisco 无线控制器 使用 Go 的golang org x crypto ssh库 以编程方式配置接入点 我遇到的问题是在 Go 中正确解析控制器 CLI 例如 这是控制器的典型 SSH 登录 ssh
  • 找不到 Angular Material 核心主题

    我已将 Angular Material2 包添加到我的项目中 但是 我在浏览器中收到以下警告消息 我创建了一个自定义 scss 文件并导入了包 但它仍然抛出警告消息 找不到 Angular Material 核心主题 大多数 Materi
  • 表中所有列的边框高度相等

    I am having 3 columns in a row 我需要将货物正确描述和每包净数量中间的边框延伸到平行列 标记和包裹数量 边框高度 Used to table height 100 table height 100 Demo h
  • 如何查看/监视用户界面上的控件正在触发哪些事件

    我正在 C 中使用 winforms 创建一个 GUI 所有控件都有大量事件 我想知道哪些事件被触发以及何时被触发 一种方法是在每个事件处理程序上放置调试语句 但这需要太多工作 在 Visual Studio 2008 2010 中是否有任
  • 随机 PHP FastCGI / 连接被对等方重置 / 不完整的标头

    我一直在随机500 Internal Server我在各种共享主机上基于 PHP MySQL 的网站上出现错误 我在共享 Linux 服务器上通过 CGI FastCGI 使用 PHP 5 2 17 当我查看日志时 我看到以下内容 erro
  • 多个独立maven项目的通用测试数据

    我有一个 Maven 项目 可以将特定格式的文本文件转换为另一种格式 为了进行测试 我在 src test resources 中放入了大量的测试文件 我还有另一个项目 它使用第一个项目进行转换 然后对输出格式执行一些额外的操作 我还想针对
  • MongoDB:如何计算文档中键的数量?

    假设一个文档是 a 1 b 1 c 2 z 2 如何计算该文档中键的数量 谢谢 如果通过聚合框架使用 MongoDB 3 6 及更高版本 则完全有可能 使用 objectToArray https docs mongodb com manu
  • 在 matplotlib 中将多个饼图分解在一起

    我真的很喜欢 matplotlib 饼图上的 爆炸 选项 我希望能够 集体爆发 我正在绘制许多小切片 分为 3 或 4 类 我想将所有小切片作为组爆炸在一起 我认为这并不完全清楚 所以我呼吁我严重缺乏绘制基本形状的能力 并制作这张图片来展示
  • 如何使azure应用程序服务信任OnPrem CA颁发的证书?

    我正在尝试在 https 协议下使用来自 Azure APP 服务的本地 Web 服务 当我这样做时 我收到了错误 经验证远程证书无效 程序 这是有意义的 因为默认情况下 Azure 不必信任该服务 而是提供由 OnPrem CA 颁发的证
  • 使用 Swing 的 Java 聊天应用程序(概念)

    我想使用 Swing 作为界面用 Java 编写一个聊天应用程序 我想出了一个主意 在疯狂程序员 https stackoverflow com users 992484 madprogrammer 但我不确定这是否是解决此问题的最佳方法
  • 如何在linux下用c写一个http1.0代理服务器?

    我必须开发仅在 Linux 和 c 中使用 HTTP 1 0 的代理服务器 我需要一些提示才能开始开发 我假设您对使用 linux 和 c 语言有信心 没有任何提示 否则不要从开发代理开始 阅读并理解RFC 1945 HTTP 1 0 ht
  • 从低均值泊松分布中绘制数字的性能

    为了在C 中从泊松分布中抽取随机数 通常建议使用 RNG type rng std poisson distribution
  • 如何在 Visual Studio 中传递多个命令参数?

    我正在使用 LZMA SDK 开发一个压缩 解压缩项目 主程序包含一些我必须用来运行应用程序的参数 要从命令行运行它 我使用 LzmaUtil exe e input elf output elf 我正在使用 VS 2013 所以我添加了e
  • org.xml.sax.SAXParseException:src-resolve:无法将名称“repository:auditing-attributes”解析为(n)“属性组”组件

    在项目上运行 Maven 测试时出现以下错误 我正在使用 Spring Data Neo4j 构建一个测试应用程序 java lang IllegalStateException Failed to load ApplicationCont
  • 将双精度数转换为没有小数位的字符串的最佳方法

    将双精度数转换为没有小数位的字符串的最佳方法是什么 关于什么String valueOf int documentNumber 双精度数小数点后始终为 0 我不需要舍入或截断 如果您确定 double 确实是一个整数 请使用这个 Numbe
  • Delphi - 反向查找“谁包括这个单元”

    我正在调试分布在许多单元上的大型应用程序 我在低级单元中遇到了编译错误 并且完全不知道该单元在应用程序的哪个部分被引用 有没有办法使用 RAD studio 2010 的 IDE 创建某种包含图 由于大多数使用的单元不是项目的一部分 并且分
  • React 表单,提交对象,然后将其推送到数组

    我是 React 新手 不确定如何执行此操作 我有一组已映射并在视图中渲染的对象 我想要做的是设置一个表单 将每个字段的值提交到新对象的相应属性 但我不确定如何执行此操作 这是我的初始数据 它在视图中呈现 contactArray name