【问题标题】:Radio button with dynamic value from input as label具有来自输入的动态值作为标签的单选按钮
【发布时间】:2018-10-19 15:29:22
【问题描述】:

我正在尝试创建一个单选组组件,其中一个单选选项的值由输入动态设置为标签。我经常在表单中看到这些,并且之前没有做出反应就创建了它,但是在使用 react 和 material-ui 库时遇到了问题。值的传递似乎从输入到单选按钮,因此在选择时传递到 material-ui 单选组组件,但在每次击键后它都会取消焦点(如果选择了单选按钮,则取消选择)所以我必须单击输入/标签(并重新选中单选按钮)以继续一次输入一个字符。

代码如下:

import {FormControl, FormControlLabel, FormLabel, Radio} from "@material-ui/core";
import RadioGroup from "@material-ui/core/RadioGroup/RadioGroup";
import React from "react";
import Input from "@material-ui/core/Input/Input";


const MUIRadioGroup = ({ classes, isSubmitting, label, name, value, onChange, controls }) => {
    return (<FormControl component="fieldset" className={classes.formControl}>
            <FormLabel component="legend">{label}</FormLabel>
            <RadioGroup
                aria-label={label}
                name={name}
                className={classes.group}
                value={value}
                onChange={onChange}
            >
                {controls.map(({ value, disabled, label, ...rest }, i) => {
                  return (<FormControlLabel
                    key={value+i}
                    value={value}
                    disabled={ disabled || isSubmitting }
                    control={ <Radio disabled={ disabled || isSubmitting }/> }
                    label={ label }
                  />)
                })}
            </RadioGroup>
        </FormControl>)
};

class Test extends React.Component {
    state = {
        value: undefined,  // so we don't default select the radio with blank input
        radioInputValue: ''
    }

    handleChange = (e) => {
        this.setState({ value: e.target.value });
    };

    handleRadioInputChange = (e) => {
        this.setState({ radioInputValue: e.target.value });
    };

    render() {
        const controls=[
                {value: '1', label: 'Choice 1', disabled: false},
                {value: '2', label: 'Choice 2', disabled: false},
                {
                    value: this.state.radioInputValue,
                    label: <Input
                        id={'Ga-radio-input'}
                        key={'Ga-radio-input'}
                        onChange={this.handleRadioInputChange}
                        name={'Ga-radio-input'}
                        value={this.state.radioInputValue}
                    />,
                    disabled: false}
            ];
        return <MUIRadioGroup controls={controls} value={this.state.value} onChange={this.handleChange} isSubmitting={false} label={"Choose one:"}/>
    }
}

我感觉这与重新渲染有关,因为无状态子组件会让我相信我必须跟踪哪些组件被聚焦,然后将其作为道具传递。是这样吗?

有人可以提供一个简单的“反应方式”的例子来让它工作吗?

【问题讨论】:

    标签: javascript reactjs material-ui


    【解决方案1】:

    我认为您应该将输入值和 onInputChange 函数等道具传递给您的 Input 组件的 MUIRadioGroup,因为它被用作子组件。

    这个工作代码只是为了给你一些想法。我假设您的 RadioGroup 只有一个输入: https://codesandbox.io/s/1z65z506zl

    import {
      FormControl,
      FormControlLabel,
      FormLabel,
      Radio
    } from "@material-ui/core";
    import RadioGroup from "@material-ui/core/RadioGroup/RadioGroup";
    import React from "react";
    import ReactDOM from "react-dom";
    import Input from "@material-ui/core/Input/Input";
    
    const MUIRadioGroup = ({
      classes,
      isSubmitting,
      label,
      name,
      value,
      onChange,
      controls,
      InputVal,
      onInputChange
    }) => {
      return (
        <FormControl component="fieldset">
          <FormLabel component="legend">{label}</FormLabel>
          <RadioGroup
            aria-label={label}
            name={name}
            // className={classes.group}
            value={value}
            onChange={onChange}
          >
            {controls.map(({ value, disabled, label, ...rest }, i) => {
              return (
                <FormControlLabel
                  key={value + i}
                  value={label ? value : InputVal}
                  disabled={disabled || isSubmitting}
                  control={<Radio disabled={disabled || isSubmitting} />}
                  label={
                    label ? (
                      label
                    ) : (
                      <Input
                        id={"Ga-radio-input"}
                        key={"Ga-radio-input"}
                        onChange={onInputChange}
                        name={"Ga-radio-input"}
                        value={InputVal}
                      />
                    )
                  }
                />
              );
            })}
          </RadioGroup>
        </FormControl>
      );
    };
    
    class Test extends React.Component {
      state = {
        value: undefined, // so we don't default select the radio with blank input
        radioInputValue: ""
      };
    
      handleChange = e => {
        this.setState({ value: e.target.value }, () =>
          console.log(this.state.value)
        );
      };
    
      handleRadioInputChange = e => {
        this.setState({ radioInputValue: e.target.value }, () => {
          console.log(this.state.radioInputValue);
        });
      };
    
      render() {
        const controls = [
          { value: "1", label: "Choice 1", disabled: false },
          { value: "2", label: "Choice 2", disabled: false },
          {
            value: "",
            label: null,
            disabled: false
          }
        ];
        return (
          <MUIRadioGroup
            controls={controls}
            value={this.state.value}
            onChange={this.handleChange}
            isSubmitting={false}
            label={"Choose one:"}
            InputVal={this.state.radioInputValue}
            onInputChange={this.handleRadioInputChange}
          />
        );
      }
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<Test />, rootElement);
    

    【讨论】:

    • 我不认为它工作正常。在单选组组件中记录值将显示它不会在输入字段时记录单选输入值,也不会在选中单选输入框时记录值。原因是您在 map 函数上定义了从未传入的值,控件对象不包含 onInputChange 或 InputVal 值。从 map 函数中删除那些预期的输入,然后将这些变量指向作为 props 传递给组件的值(这是我们想要的),这会导致我最初观察到的行为。
    • @Verbal_Kint 是的,我犯了一个错误。我刚刚修复它,现在它工作正常。除了您指出的那些之外,我将初始值设置为空字符串而不是this.state.radioInputValue。子组件值不应直接由父组件的状态值设置。请再次查看该链接。
    • 输入字段值已记录,但检查单选按钮未正确设置 radioGroup 的值
    • @Verbal_Kint 我认为您应该能够通过查看我的代码自己弄清楚这一点。反正我只是给你修好了。请检查一下。
    猜你喜欢
    • 2020-05-07
    • 2021-12-06
    • 2021-06-16
    • 2015-08-17
    • 2014-06-01
    • 2022-01-10
    • 2016-07-15
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多