javascript - 是否可以动态处理动态创建的组件的输入?

标签 javascript reactjs generic-programming material-ui

免责声明:我是 ReactJS、Javascript 以及更广泛的前端开发新手。

大家好,

我决定构建一个通用组件来根据给定的模板处理我将在项目中使用的所有表单。

生成非常简单:我在 Json 中循环模板并创建我需要的组件。

但现在我正在努力寻找一种解决方案来检索这些组件的输入值,而无需通过编写 JS 代码的某些代码生成。

附注:我正在使用 Material UI 组件。

这是模板的示例:

{ label: "General information",
                        elements: [ { label: "Firstname",
                                      element: "textfield",
                                      element_info: []
                                    },
                                    { label: "Lastname",
                                      element: "textfield",
                                      element_info: []
                                    },
                                    { label: "Email",
                                      element: "textfield",
                                      element_info: []
                                    },
                                    { label: "Password",
                                      element: "textfield",
                                      element_info: []
                                    },
                                    { label: "Phone number",
                                      element: "textfield",
                                      element_info: []
                                    }
                                  ]
                      },

这是到目前为止我的代码:

render: function() {
    var formPattern = this.props.form;
    var form = [];

    for (var paper in formPattern) {
      var elements = formPattern[paper].elements;
      var paper = [];

      for (var element in elements) {
        var label = elements[element].label;

        if (elements[element].element == "selectfield") {
          var element_info = elements[element].element_info;
          var items = [];

          for (var i = 0; i < element_info.length; i++) {
            items.push(<MenuItem value={i+1} primaryText={element_info[i]} />);
          }

          paper.push( <SelectField>
                        {items}
                      </SelectField>);

        } else if (elements[element].element == "toggle") {
          paper.push(<Toggle label={label} />);

        } else if (elements[element].element == "checkbox") {
          paper.push( <Checkbox
                        label={label}
                        style={checkboxStyle}
                    />);

        } else {
          paper.push(<TextField hintText={label} />);
        }
      }

      form.push(<Paper style={paperStyle}>
                  {paper}
                </Paper>);
    }

    return (
      <div>
        {form}
        <FlatButton
          label="Create"
          onTouchTap={this.props.onNewClick}
        />
      </div>
    );

因此,如果我们只专注于 TextField 组件,我需要添加一个“onChange”属性,以便让输入知道我不知道这个字段是谁,因为我使用的是通用组件。

显然,我需要能够从我将使用它的父组件访问结果数据。

我正在考虑将所有值连接到一个字符串中,格式如“fieldName:value”,甚至直接采用 JSON 格式。

但是:我如何检索这些值??????这就是问题所在!

我在这里。我已经寻找解决方案几个小时了,你们是我最后的机会/o/

预先感谢您的帮助!

最佳答案

您可能想要使用 handleChange(name, event) 函数,然后将每个实例与 name 属性绑定(bind)。您还需要使用不变性助手(React 或任何其他助手)来修改给定动态元素的状态;

handleChange: function(name, event){
    var newState = {};
    newState[name] = event.target.value;
    this.setState(React.addons.update(this.state, {$merge: newState}));
}

...

    } else {
      paper.push(<TextField hintText={label} onChange={this.handleChange.bind(this, elements[element].label)}/>);
    }

然后您可以从状态访问这些值 this.state.{{label name}}

关于javascript - 是否可以动态处理动态创建的组件的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37533353/

相关文章:

javascript - 调整 jQuery 字数计数器以将 URL 计为 3 个字

javascript - 根据对象属性更新对象数组中的项目

JavaScript:构建新实例的方法

c++ - 编译模板时无限循环

javascript - 如何在 Typescript 中定义对象变量的类型?

javascript - ReactJS返回页面的同一部分

reactjs - 无法从 getSelectors 推断出 selectIds 中的正确类型

javascript - 将函数从 HOC 传递到组件(React、React native)

c++ - 用于控制算法的仿函数的编译时容器?

c++ - 如何在不指定不必要的模板参数的情况下使用模板类的成员类型?