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 表单,提交对象,然后将其推送到数组 的相关文章

  • Excel 宏与 Javascript

    我希望使用 Javascript 中的宏而不是默认的 VBA 来操作 Excel 电子表格 我可以使用以下 VBA 代码执行 javascript 代码 javascript to execute Dim b As String b fun
  • AngularJS:选择非 2 路绑定到模型

    我正在使用选择来显示客户名称 用户应该能够选择现有客户端 然后更新范围属性 控制器 初始化 首选 if scope clients length gt 0 scope existingClient scope clients 0 View
  • 未捕获的类型错误:无法读取未定义的属性“prop”

    我有 6 个输入复选框 如果选中的复选框超过 3 个 则最后一个复选框将被取消选中 为了更好地理解 请参阅我之前的question https stackoverflow com questions 35195235 if checkbox
  • 是否可以进行条件解构或有后备?

    我有一个具有许多深层嵌套属性的对象 我希望能够访问 MY KEY 上的属性 如下 但如果该属性不存在 则获取 MY OTHER KEY 我怎样才能做到这一点 const X Y MY KEY Values segments segment
  • Chrome JavaScript 日期构造函数获取 1884 年之前的日期似乎是错误的

    如果我将 1 1 1753 午夜 的 unix 毫秒时间戳值 6847786800000 传递给 Chrome 中的 JavaScript Date 构造函数 则 Chrome 给出的日期看起来非常奇怪 当我使用带有七个参数的 Date 构
  • 修剪日期格式 PrimeNG 日历 - 删除时间戳、角度反应形式

    我将以下内容推入我的反应形式 obj 中2016 01 01T00 00 00 000Z但我想要以下2016 01 01 有谁知道有一个内置函数可以实现上述目的 我已经搜索过文档here https www primefaces org p
  • 如何避免 TypeScript 中出现虚假的“未使用参数”警告

    我遇到过很多次这种情况 最后决定弄清楚正确的方法是什么 如果我有一个声明方法的抽象父类 然后一些具体子类在其实现中实现真正的逻辑 并且显然使用方法参数 但某些子类不需要在该方法中执行任何操作 因此不要使用方法参数 那些不必执行任何操作的方法
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • Browserify:如果需要,使用 module.exports,否则暴露全局

    我正在考虑采用浏览器化 http browserify org 对于我的一些项目 但想确保其他人如果想使用 捆绑的 代码就不必使用 browserify 执行此操作的明显方法是通过以下方式公开模块导出module exports以及通过一个
  • 动态更改 vuejs 2 中的选择输入选项

    如何动态更改选择下拉 v model 中的选项 我有 2 个选择输入 其中一个应该根据其他输入进行更改 例如 如果我选择 水果 则选择显示水果 如果我选择 蔬菜 则选择显示蔬菜 我不使用Vuejs 但查看文档后 var TypesArr F
  • 在电子生成器反应电子应用程序后,在 Windows 中出现空白屏幕

    在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 这是package json 在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 name SmallBusinessManagement version 0 1
  • 过滤嵌套的 JSON 对象

    我有一个搜索栏 您可以在其中输入员工姓名 它应该根据过滤器返回姓名 我有一个嵌套的 JSON 对象 如下所示 我需要深入了解该对象以访问数组中的员工姓名 您可以看到我尝试实现的多个选项 它们已被注释掉 我的问题是代码没有过滤名称并返回所有名
  • 适用于多应用项目的 Grunt 和 requirejs 优化器

    我在让 Grunt 对具有以下结构的项目执行 requirejs 优化时遇到问题 static js apps app js dash js news js many more app files build collections lib
  • Socket.io 与服务器离线连接

    如何检测服务器是否离线或由于其他原因无法连接 我的代码看起来像这样 this socket io connect connectionInfo reconnect false 它不会抛出任何错误 因此 try catch 子句不起作用 Us
  • Angular 停止 Enter 键提交

    I am trying to stop the Enter from submitting my button and rather make it point to another function I tried trapping th
  • 什么是 TinyMCE jQuery 包?

    我被要求在项目中使用 TinyMCE 编辑器 在下载页面上 有一个主包 然后是一个 jQuery 包 This package contains special jQuery build of TinyMCE and a jQuery in
  • 在firefox上用js改变表单方法

    我需要使用 javascript jQuery 或纯 更改表单的方法属性 我的表单有 method post 我尝试用以下方法更改它 submit button click function var url input id url val
  • Javascript/jQuery 外部高度()

    Does idOfLememt outerHeight 对所有浏览器产生相同的结果 IE7 有什么不同吗 只要去http api jquery com outerHeight http api jquery com outerHeight
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo
  • Angular 2:使用正则表达式进行数字验证

    我正在尝试验证 IE 11 中的数字字段

随机推荐

  • 未找到获取命令: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