【问题标题】:Getting values from form input groups从表单输入组中获取值
【发布时间】:2017-03-21 11:39:27
【问题描述】:

我有一组这样生成的表单输入:

有关完整组件,请参阅下面的更新 2。

因此,如果有三列,则该组中的三列将显示在表单中。我正在尝试从这些输入中提取数据,但我只需要 id。如何从TextField 中提取列 ID?

另外,我需要获取每个组的数据(即 ID),以便它们出现在数组中:

transformations: [{columnId: 1, ruleId: 4}, {columnId: 2, ruleId: 2}, {columnId:3 , ruleId: 1}]

这些只是示例值,正如我提到的主要问题是我不确定如何从第一个输入中提取 columnId 的值。我也在努力获取多组数据。

对于这个问题的任何帮助将不胜感激。

感谢您的宝贵时间。

更新:

handleRuleChange 看起来像这样:

handleRuleChange = (e, index, value) => {
  this.setState({
    ruleId: value
  })
}

更新 2:

这是组件:

import React from 'react'
import Relay from 'react-relay'

import { browserHistory } from 'react-router'

import SelectField from 'material-ui/SelectField'
import MenuItem from 'material-ui/MenuItem'
import TextField from 'material-ui/TextField'

import CreateTransformationSetMutation from '../mutations/CreateTransformationSetMutation'

class CreateTransformationSetDialog extends React.Component {

  componentWillMount() {
    this.props.setOnDialog({
      onSubmit: this.onSubmit,
      title: 'Create and Apply Transformation Set'
    })
  }

  initial_state = {
    targetTableName: '',
    ruleId: 'UnVsZTo1',
  }

  state = this.initial_state

  onSubmit = () => {
    const onSuccess = (response) => {
      console.log(response)
      browserHistory.push('/table')
    }

    const onFailure = () => {}

    Relay.Store.commitUpdate(
      new CreateTransformationSetMutation(
        {
          viewer: this.props.viewer,
          version: this.props.viewer.version,
          targetTableName: this.state.targetTableName,
          transformations: ///this is where I need to get the values///,
        }
      ),
      { onSuccess: onSuccess }
    )
  }

  handleTextChange = (e) => {
    this.setState({
      targetTableName: e.target.value
    })
  }

  handleRuleChange = (e, index, value) => {
    this.setState({
      ruleId: value
    })
  }

  render() {
    return (
      <div>
        <TextField
          floatingLabelText="Table Name"
          value={this.state.targetTableName}
          onChange={this.handleTextChange} 
        />
        <br />
        {
          this.props.viewer.version.columns.edges.map((edge) => edge.node).map((column) =>
            <div key={column.id}>
              <TextField
                id={column.id}
                floatingLabelText="Column"
                value={column.name}
                disabled={true}
                style={{ margin: 12 }} 
              />
              <SelectField
                floatingLabelText="Select a Rule"
                value={this.state.ruleId}
                onChange={this.handleRuleChange}
                style={{ margin: 12 }}
              >
                {
                  this.props.viewer.allRules.edges.map(edge => edge.node).map(rule =>
                    <MenuItem
                      key={rule.id}
                      value={rule.id}
                      primaryText={rule.name}
                    />
                  )
                }
              </SelectField>
            </div>
          )
        }

      </div>
    )
  }

}

export default Relay.createContainer(CreateTransformationSetDialog, {
  fragments: {
    viewer: () => Relay.QL`
      fragment on Viewer {
        ${CreateTransformationSetMutation.getFragment('viewer')}
        version(id: $modalEntityId) @include(if: $modalShow) {
          ${CreateTransformationSetMutation.getFragment('version')}
          id
          name
          columns(first: 100) {
            edges {
              node {
                id
                name
              }
            }
          }
        }
        allRules(first: 100) {
          edges {
            node {
              id
              name
            }
          }
        }
      }
    `
  },
  initialVariables: {
    modalEntityId: '',
    modalName: '',
    modalShow: true,
  },
  prepareVariables: ({ modalEntityId, modalName }) => {
    return {
      modalEntityId,
      modalName,
      modalShow: modalName === 'createTransformationSet'
    }
  }
})

它正在使用Relay,但这与问题无关,只需将输入中的数据提取到转换数组中。

【问题讨论】:

  • 你能展示你的handleRuleChange方法吗?
  • 如果你不删除之前的问题会很棒;-)
  • 你的initial state 呢?最好在这里添加完整的组件。不确定你在那里做什么?
  • 对不起,那是我的错!对代码进行了一些重写,所以这个问题对我来说不再重要了。但我同意你的看法,我删除它是一种糟糕的形式!
  • @JyothiBabuAraja 更新了问题

标签: forms reactjs material-ui


【解决方案1】:

这可以满足您的要求。大多数代码都是可以理解的。随时询问。

class CreateTransformationSetDialog extends React.Component {

  componentWillMount() {
    this.props.setOnDialog({
      onSubmit: this.onSubmit,
      title: 'Create and Apply Transformation Set'
    })
  }

  initial_state = {
    targetTableName: '',
    transformations: [];
    ruleId:'UnVsZTo1' //default values for all rules
  }

  state = this.initial_state

  onSubmit = () => {
    const onSuccess = (response) => {
      console.log(response)
      browserHistory.push('/table')
    }

    const onFailure = () => {}

    Relay.Store.commitUpdate(
      new CreateTransformationSetMutation(
        {
          viewer: this.props.viewer,
          version: this.props.viewer.version,
          targetTableName: this.state.targetTableName,
          transformations: this.state.transformations,
        }
      ),
      { onSuccess: onSuccess }
    )
  }

  handleTextChange = (e) => {
    this.setState({
      targetTableName: e.target.value
    })
  }

  handleRuleChange = (index, ruleId, columnId) => { //TODO: make use of index if needed
    let transformations = this.state.transformations;
    const isInStateWithIndex = transformations.findIndex((el) => el.columnId === columnId);
    if(isInStateWithIndex > -1){
      transformations[isInStateWithIndex].ruleId = ruleId; //changed rule
    }else{
      transformations.push({columnId: columnId, ruleId: ruleId}); //new column added to state.
    }
    this.setState({
      transformations: transformations
    }); //do with es6 spread operators to avoid immutability if any
  }

  render() {
    return (
      <div>
        <TextField
          floatingLabelText="Table Name"
          value={this.state.targetTableName}
          onChange={this.handleTextChange} 
        />
        <br />
        {
          this.props.viewer.version.columns.edges.map((edge) => edge.node).map((column) =>
            <div key={column.id}>
              <TextField
                id={column.id}
                floatingLabelText="Column"
                value={column.name}
                disabled={true}
                style={{ margin: 12 }} 
              />
              <SelectField
                floatingLabelText="Select a Rule"
                value={this.state.ruleId}
                onChange={(e, index, value) => this.handleRuleChange(index, value, column.id )}
                style={{ margin: 12 }}
              >
                {
                  this.props.viewer.allRules.edges.map(edge => edge.node).map(rule =>
                    <MenuItem
                      key={rule.id}
                      value={rule.id}
                      primaryText={rule.name}
                    />
                  )
                }
              </SelectField>
            </div>
          )
        }

      </div>
    )
  }

}

在动态创建的columns 状态下维护transformations 的状态。

【讨论】:

  • 当我尝试更改第一列之后任何列的选择字段值时,这给了我一个错误:Uncaught TypeError: Cannot read property 'id' of undefined。另外,我设置 ruleId 状态的原因是因为这是默认规则 ID,如果它没有更改,则应该与列相关联,因此也需要在其中。
  • 索引值也有一些奇怪的地方,当我点击第二个下拉菜单时,它给我的索引是 2,而它应该是 1。
  • 哦,对不起,我现在看看
  • 是的,行得通!谢谢!还有一个问题。我需要用原始初始状态的 id 填充 ruleId,因此起始数组实际上应该是[{ruleId: 'UnVsZTo1'}, {ruleId: 'UnVsZTo1'}, {ruleId: 'UnVsZTo1'}],然后需要将 columnId 推入每个对象中,当然可以更改 ruleId。你能告诉我你对如何做到这一点的想法吗?很抱歉,我才意识到我需要默认规则!
  • 我的错,我描述得很糟糕,在初始化转换时应该已经填充了[{columnId: 1, ruleId: 'UnVsZTo1'}, {columnId: 2, ruleId: 'UnVsZTo1'}, {columnId: 3, ruleId: 'UnVsZTo1'}]。然后,当下拉列表中的选择发生更改时,需要更新规则 ID。我也有单独的 ruleId,因为我需要更新下拉列表中选择的内容,以便需要单独更新。对此有什么想法吗?
猜你喜欢
  • 2017-02-21
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 2019-08-09
相关资源
最近更新 更多