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

React和多个表单字段

施俊哲
2023-03-14
问题内容

我正在阅读有关“
onChange”的文档,
并且对我的论坛有多个字段(例如选择框,复选框,文本区域和输入)会怎么办感到好奇?我是否要做类似的事情:

 getInitialState: function() {
    return {textArea: 'Hello!', input: 'World', ...};
  },

到初始状态,然后使用相同的概念来处理该字段的更改?


问题答案:

编辑:回想起来,这个答案很糟糕,请改用 Junle Li 的答案。

是的,您可以完全做到这一点。但是,当您获得许多表单组件时,编写所有处理程序和getInitialState调用可能会很冗长,那么mixin呢?

jsbin

注意还请查询react的valueLink混合

让我们看一下示例登录表单后视图的外观。您可以调用this.getFormData()以获得仅具有表单状态的对象,从而也可以在状态中存储其他值。

// create a mixin for our form
var formMixin = makeFormMixin([
    "username",
    "password"
]);

var App = React.createClass({
  mixins: [formMixin],
  render: function(){
    return (
      <div>
        <form>
          Username: <input 
                value={this.state.username} 
                onChange={this.handleUsernameChange} />

          Password: <input type="password"
                value={this.state.password} 
                onChange={this.handlePasswordChange} />
        </form>
      </div>
    );
  }
});

此函数采用字段名称数组,并设置初始状态,并为您提供处理程序函数。然后,您可以选择使用它们,或为特殊情况创建自己的处理函数。

function makeFormMixin(fields){
  var mixin = {
    getInitialState: function(){
      var state = {};
      fields.forEach(function(field){

        state[field] = this.props[field] || "";
      }, this);
      return state;
    },
    getFormData: function(){
      var data = {};
      fields.forEach(function(field){
        data[field] = this.state[field];
      }, this);
      console.log(data);
      return data;
    }
  };

  fields.forEach(function(field){
    var method = camelJoin(["handle", field, "change"]);
    mixin[method] = function(event){
      var update = {};
      update[field] = event.target.value;
      this.setState(update);
    }
  });

  return mixin;
}

// helper function ["Makes", "things", "camel", "case"] => "makesThingsCamelCase"
function camelJoin(parts){
  return parts.map(function(part, i){
    if (i === 0) {
      return part[0].toLowerCase() + part.slice(1);
    }
    else {
      return part[0].toUpperCase() + part.slice(1);
    }
  }).join("");
}


 类似资料:
  • 我有以下代码: 我的问题是我想让我的列表按多个东西排序: 1。)将它们分组为未来事件和过去事件(通过检查ystem.current毫秒()是否大于结束时间戳)2。)通过开始升序排序未来事件3。)通过结束降序排序过去事件 我可以用Java 8 Lambda来做这件事吗?或者我需要另一种排序项目的方法吗?

  • 我有一个表格: 以及存储两个表单字段的方法: 但是,只有“name”保存到db表中。任务表有两个列名 这是桌子: 还选中了“手动创建”选项: 输出: 谢谢

  • 这一节,我们将创建一个添加用户的功能组件。在client/src/components目录下面添加两个新文件: AddUser.jsx AddUser.test.js 添加测试代码: import React from 'react'; import { shallow } from 'enzyme'; import renderer from 'react-test-renderer'; im

  • 我有6个输入框,每个输入框有4位数字。输入4位数字后,光标将自动转到下一个输入框。所有这些都是强制性的。 现在,可以在“onChange”事件中将自动聚焦设置为下一个文本框。但如何将这6个输入框的值绑定到表单上的一个字段。我有办法吗?

  • 我需要在Cms后端表单(fields.yaml)中创建一个多选表单字段。我采用了以下方法 选择_字段: 此字段的选项将从模型中调用 一切正常,但当我提交表单时,只有第一个选择的选项作为JSON数据插入到数据库表文本字段中。我希望存储每个选定的选项。我也在模型中声明该字段为Jsonable,即受保护的$Jsonable=['field_name']; 注意:当我使用类型作为检查框列表时,它像我想的那

  • 每次用户提交我的联系人表单时,我都试图收到一封电子邮件。该表单包含以下字段: -电子邮件 -主题 -姓名 -轨道 -号码 -信息 但是,当发送电子邮件时,我只能在“邮件选项”下的“文本”字段中输入任何字段。如果我试图将其转换为数组或对象,它将不起作用,因为它表示块需要是字符串。 如何发送比文本中输入的表单字段更多的表单字段?这是我的密码: 节点邮件发送路线: 表单超文本标记语言