代码之家  ›  专栏  ›  技术社区  ›  Verbal_Kint

带有来自输入的动态值作为标签的单选按钮

  •  0
  • Verbal_Kint  · 技术社区  · 8 年前

    代码如下:

    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:"}/>
        }
    }
    

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

    有人能提供一个简单的例子“反应方式”让这个工作?

    1 回复  |  直到 8 年前
        1
  •  2
  •   sam    7 年前

    我认为应该将诸如input value和onInputChange函数之类的道具传递给输入组件的MUIRadioGroup,因为它被用作子组件。

    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);