javascript - 基于所选复选框的渲染属性

标签 javascript reactjs

我已经在CodeSandBox的评论中解释了这些问题。 基本上我有一个使用复选框呈现的 field.names 数组。当选择每个框时,用户应该能够输入 lengthTypesize 的单独值。截至目前,相同的值将应用于每个选中的框。

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      fields: ["action", "callee", "caller", "duration", "message"],
      fieldNames: [],
      size: [],
      lengthType: []

    };
  }

  fieldNamesChanged = newFieldNames => {
    console.log(newFieldNames);
    this.setState({ fieldNames: newFieldNames });
  };

    onChange = (e) => {
    this.setState({ [e.target.name]: e.target.value });
    console.log([e.target.name])
}

updateLengthType = (e) => {
    this.setState({ lengthType: e.target.value });
    console.log(this.state.lengthType)
}
  handleChange = event => {
    const schema = this.state.schemas.find(
      schema => schema.name === event.target.value
    );
    if (schema) {
      axios({
        method: "get",
        url: `${schema.selfUri}`,
        headers: { Accept: "  " }
      })
        .then(response => {
          console.log(response);
          this.setState({
            fields: response.data.data.fields,
            selectedId: response.data.data.id
          });
          console.log(this.state.selectedId);
          console.log(this.state.fields);
        })
        .catch(error => console.log(error.response));
    }
  };

API 调用的字段数组响应示例并将 fields.name 呈现为复选框值

  "fields": [
    {
        "name": "action",
        "dataType": "string",
    },
    {
        "name": "callee",
        "dataType": "string",
    },
    {
        "name": "caller",
        "dataType": "string",
    },
    {
        "name": "duration",
        "dataType": "double",
    },
    {
        "name": "message",
        "dataType": "string",
    },
]



  render() {
    const { fields, fieldNames } = this.state;

    return (
      <div className="App">
        <h1>Checkbox Group</h1>

        <div>
          <fieldset>
            <legend>Choose field names</legend>
            <br />
            <CheckboxGroup
              checkboxDepth={5}
              name="fieldNames"
              value={this.state.fieldNames}
              onChange={this.fieldNamesChanged}
            >
              {fields &&
                fields.map(field => {
                  return (
                    <label>
                      <Checkbox value={field} />
                      {field}
                    </label>
                  );
                })}
              <br />
            </CheckboxGroup>

            <label>Length Type:</label>
            <select
              value={this.state.lengthType}
              onChange={this.updateLengthType}
              required
            >
              <option value="">Select Length Type...</option>
              <option value="fixed">Fixed</option>
              <option value="variable">Variable</option>
            </select>
            <br />

            <label>Size:</label>
            <input
              value={this.state.size}
              onChange={this.onChange}
              type="number"
              name="size"
              placeholder="1"
              min="0"
              required
            />
            <br />
          </fieldset>
        </div>
      </div>
    );
  }
}

https://codesandbox.io/s/7z0y46jw0q

最佳答案

我发现的一些问题

  1. 我没有看到任何应该处理您输入的大小的 onChange 函数。
  2. 构造函数中未定义初始大小状态
  3. 为子组件提供关键 props

======================

更新

我创建了一个示例

https://codesandbox.io/s/kkxv3nl7n5

我不太确定这是否是您想要做的。请参阅我的沙箱链接并检查这是否是您想要执行的操作。

我认为如果选中了复选框,则应显示上次选中的复选框的 lengthType, size 值。因此,您的 size, lengthType 状态应该是 Object。因为它会保存每个 fieldName 的大小和长度类型。所以我将其更改如下。

onChange = e => {
    e.persist();
    const { fieldNames } = this.state;
    const lastCheckedFieldName = fieldNames[fieldNames.length - 1];
    this.setState(prevState => {
      return {
        size: {
          ...prevState.size,
          [lastCheckedFieldName]: e.target.value
        }
      };
    });
  };

在渲染函数中,您的输入值引用 this.state.size 我根本不明白这一点,因为您说您想要每个字段都有单独的大小。这应该动态引用一个对象或数组,其键可能由状态确定,以便分隔每个字段的值。

const lastCheckedFieldName = fieldNames[fieldNames.length - 1];

<input
      value={this.state.size[lastCheckedFieldName] || 1}
      onChange={this.onChange}
      type="number"
      name="size"
      placeholder="1"
      min="0"
      required
/>

关于javascript - 基于所选复选框的渲染属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52862422/

相关文章:

javascript - 在 AngularJS 中将数组从父组件传递到子组件

javascript - 如何在angularjs中绑定(bind)和显示数组的数组

javascript - React onClick 事件触发点击子元素

javascript - 如何删除 Meteor 集合中数组中的某个字段?

javascript - 为什么 React 类中的 React 函数会在表单输入更改事件中重复调用

javascript - 将 URL 从 javascript 传递到 ActiveX 会是一个安全漏洞吗?

javascript - (VueJS) Vuex getter 应该根据另一个模块状态变化进行更新

javascript - 这是什么类型的 JavaScript 数据类型?

ReactJs - 在 ES6 中使用 Mixins

javascript - React - 组合返回两个 api 调用的数据并使用这些值设置数组的状态