当前位置: 首页 > 面试题库 >

如何在React中编辑多个输入控制的组件?

尉迟兴修
2023-03-14
问题内容

我有一个将联系人对象存储为状态的组件-{firstName:“ John”,lastName:“ Doe”,电话:“
1234567890}我想创建一个表单来编辑此对象,但是如果我希望输入保留值对于原始的接触参数,我需要使每个输入成为受控组件,但是,由于状态仅保留{contact:{…}},因此我不知道如何创建一个可以适应每个参数的handleChange函数。以下是我目前拥有的-

  getInitialState: function () {
    return ({contact: {}});
  },
  handleChange: function (event) {
    this.setState({contact: event.target.value });
  },
  render: function () {
    return (
        <div>
          <input type="text" onChange={this.handleChange} value={this.state.contact.firstName}/>
          <input type="text" onChange={this.handleChange} value={this.state.contact.lastName}/>
          <input type="text" onChange={this.handleChange} value={this.state.contact.lastName}/>
        </div>
      );
    }

我希望在我的handleChange中我可以做类似的事情

  handleChange: function (event) {
    this.setState({contact.firstName: event.target.value });
  }

问题答案:

有一种“简单”的方式来执行此操作,又有一种“智能”的方式。如果您问我,以聪明的方式做事并不总是最好的,因为以后我可能会更难处理。在这种情况下,两者都是可以理解的。

旁注:我想请您考虑的一件事,是您需要更新contact对象,还是可以firstName直接将其他对象保持在状态?也许您在组件状态下有很多数据?如果是这样,将其分成责任更小的较小组件可能是一个好主意。

“简单”的方式

  changeFirstName: function (event) {
    const contact = this.state.contact;
    contact.firstName = event.target.value;
    this.setState({ contact: contact });
  },
  changeLastName: function (event) {
    const contact = this.state.contact;
    contact.lastName = event.target.value;
    this.setState({ contact: contact });
  },
  changePhone: function (event) {
    const contact = this.state.contact;
    contact.phone = event.target.value;
    this.setState({ contact: contact });
  },
  render: function () {
    return (
      <div>
        <input type="text" onChange={this.changeFirstName.bind(this)} value={this.state.contact.firstName}/>
        <input type="text" onChange={this.changeLastName.bind(this)} value={this.state.contact.lastName}/>
        <input type="text" onChange={this.changePhone.bind(this)} value={this.state.contact.phone}/>
      </div>
    );
  }

“智能”方式

  handleChange: functhtml" target="_blank">ion (propertyName, event) {
    const contact = this.state.contact;
    contact[propertyName] = event.target.value;
    this.setState({ contact: contact });
  },
  render: function () {
    return (
      <div>
        <input type="text" onChange={this.handleChange.bind(this, 'firstName')} value={this.state.contact.firstName}/>
        <input type="text" onChange={this.handleChange.bind(this, 'lastName')} value={this.state.contact.lastName}/>
        <input type="text" onChange={this.handleChange.bind(this, 'phone')} value={this.state.contact.lastName}/>
      </div>
    );
  }

本节包含与以上所示相同的示例,但使用的是ES2015 +中的功能。

为了在浏览器中支持以下功能,您需要使用例如es2015预设和react和插件stage-0与Babel一起转换代码。

下面是一些更新的示例,使用对象分解来从状态获取联系人,使用
扩散运算符创建一个更新的联系人对象,而不是对现有对象进行变异,通过扩展React.Component将组件创建为类,并使用箭头功能创建回调,因此我们不必。bind(this)

ES2015 + 的“简单”方式 __

class ContactEdit extends React.Component {

  changeFirstName = (event) => {
    const { contact } = this.state;
    const newContact = {
      ...contact,
      firstName: event.target.value
    };
    this.setState({ contact: newContact });
  }
  changeLastName = (event) => {
    const { contact } = this.state;
    const newContact = {
      ...contact,
      lastName: event.target.value
    };
    this.setState({ contact: newContact });
  }
  changePhone = (event) => {
    const { contact } = this.state;
    const newContact = {
      ...contact,
      phone: event.target.value
    };
    this.setState({ contact: newContact });
  }

  render() {
    return (
      <div>
        <input type="text" onChange={this.changeFirstName} value={this.state.contact.firstName}/>
        <input type="text" onChange={this.changeLastName} value={this.state.contact.lastName}/>
        <input type="text" onChange={this.changePhone} value={this.state.contact.phone}/>
      </div>
    );
  }
}

ES2015 + 的“智能”方式 __

请注意,这handleChangeFor是一个curried函数:使用调用它propertyName会创建一个回调函数,该函数在被调用时会更新状态[propertyName]中的(新)联系人对象。

class ContactEdit extends React.Component {

  handleChangeFor = (propertyName) => (event) => {
    const { contact } = this.state;
    const newContact = {
      ...contact,
      [propertyName]: event.target.value
    };
    this.setState({ contact: newContact });
  }

  render() {
    return (
      <div>
        <input type="text" onChange={this.handleChangeFor('firstName')} value={this.state.contact.firstName}/>
        <input type="text" onChange={this.handleChangeFor('lastName')} value={this.state.contact.lastName}/>
        <input type="text" onChange={this.handleChangeFor('phone')} value={this.state.contact.lastName}/>
      </div>
    );
  }
}


 类似资料:
  • 我在react中的多个输入中添加了动态值,然后尝试对其进行编辑,但它根本不可编辑。代码如下: 我没有使用defaultValue属性,并且添加了onChange事件,但它不起作用!

  • 问题内容: 这是我的小提琴 https://codepen.io/seunlanlege/pen/XjvgPJ?editors=0011 我有两个输入,并且我试图使用一种方法来处理任何输入字段的事件。 我已经在互联网上四处寻找解决方案,但一无所获。 我正在使用es6,请问该如何处理? 问题答案: 您尚未将属性传递给handeChange函数。像传递它一样,并且接收道具的顺序是错误的,属性将是第一个

  • 我有一些多行文字作为控制台输入。诸如此类: 行数可能每次都不同(一、二、三、四等,但不是零),但这个文本总是在瞬间用行分隔符(一个粘贴,而不是按回车键输入几个)输入。这个Java应用程序必须立即开始对这些行做些什么,但出于某种原因,我不明白如何做出这种行为。我的意思是,它必须将所有这些行保存到,或,或

  • 是的,有关于这个问题的早期线索和指南。他们告诉我答案应该是或。但是做任何这些都会给我一个。 我想做的是每次将某样东西写入组合框时清除所选内容。这是因为当你在组合框中写了一些东西,而在组合框弹出窗口中仍然选择了其他东西时,它会导致问题和看起来很奇怪。 这是一个SSCCE:

  • 我正在为Joomla 3.0开发一个自定义组件,并且在我的一个视图中使用一个编辑器字段。我使用纯HTML和JS开发视图,而不是使用Joomla XML结构。我已经成功地加载并使用了编辑器字段,但是当我使用ajax将表单数据发布到控制器时,编辑器字段没有显示,或者为空。 如何使用ajax将编辑器的内容发布到控制器? 表格代码- Javascript代码- 请假设ajax请求以及与将数据发布到相关控制

  • 警告:组件正在更改要控制的非受控输入类型复选框。输入元件不应从不受控制切换到受控(反之亦然)。决定在组件的生命周期内使用受控或不受控制的输入元件。 我的代码: