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

响应引用未获取表单中的文本输入字段数据

  •  0
  • donald  · 技术社区  · 6 年前

    我在自定义输入字段中使用了react-ref,但它没有获取输入内容。

    我正在React类组件中创建一些引用,并将它们用于表单自定义输入字段引用。然后我在表单中有一个按钮,它有一个“onclick”事件来获取数据。当我得到“ref.current.value”时,我总是在控制台中未定义

    class LandingAfterSignIn extends React.Component {
    
        titleTextFieldRef = React.createRef();
        shortDescriptionMetaTextFieldRef = React.createRef();
        longDescriptionMetaTextFieldRef = React.createRef();
        imageFieldRef = React.
    
    createRef();
        webFieldRef = React.createRef();
        contactTextFieldRef = React.createRef();
    
    constructor(props) {
        super(props);
        // we use this to make the card to appear after the page has been rendered
        this.state = {
            cardAnimaton: "cardHidden",
            isLoading: false,
            error: null
        };
    
       // super(props);
    
    
    
    
        this.state = {
            errors: []
        };
    
    }
    
    
    
    render() {
        let image= require("assets/img/landing-bg.jpg") ;
        const { classes, ...rest } = this.props;
    
        //let titleTextFieldRef= this.titleTextFieldRef  ;
        //let  shortDescriptionMetaTextFieldRef  = this.shortDescriptionMetaTextFieldRef ;
    
        return (
            <div
                className={classes.pageHeader}
                style={{
                    backgroundImage: "url(" + image + ")",
                    backgroundSize: "cover",
                    backgroundPosition: "top center",
                    width: "100%"
                }}
            >
                <Header
                    color="transparent"
                    routes={dashboardRoutes}
                    brand="StockNap"
                    rightLinks={<HeaderLinks />}
                    fixed
                    changeColorOnScroll={{
                        height: 400,
                        color: "white"
                    }}
                    {...rest}
                />
                <div>
                    <div className={classes.container}>
    
                        <div className={classes.container}>
                            <GridContainer>
                                <GridItem xs={12} sm={12} md={6}>
    
                                    <h1 className={classes.title}>Welcome {firebase.auth().currentUser.displayName} </h1>
                                    <FirebaseDatabaseMutation type="push" path="user_bookmarks">
                                        {({ runMutation }) => (
                                            <form>
    
    
                                                <GridContainer>
                                                        <GridItem xs={12} sm={12} md={6}>
                                                            <CustomInput
                                                                labelText="Company Name/Title"
                                                                id="titleTextField"
                                                                formControlProps={{
                                                                    fullWidth: true
                                                                }}
                                                                inputRef={this.titleTextFieldRef}
                                                                >
                                                            </CustomInput>
                                                        </GridItem>
                                                        <GridItem xs={12} sm={12} md={6}>
                                                            <CustomInput
                                                                labelText="short Description"
                                                                id="shortDescription"
                                                                formControlProps={{
                                                                    fullWidth: true,
                                                                    className: classes.textArea
                                                                }}
                                                                inputRef={this.shortDescriptionMetaTextFieldRef}
                                                            />
                                                        </GridItem>
                                                        <GridItem xs={12} sm={12} md={6}>
                                                            <CustomInput
                                                                labelText="long Description"
                                                                id="longDescription"
                                                                formControlProps={{
                                                                    fullWidth: true,
                                                                    className: classes.textArea
                                                                }}
                                                                inputProps={{
                                                                    multiline: true,
                                                                    rows: 2
                                                                }}
                                                                inputRef={this.longDescriptionMetaTextFieldRef}
                                                            />
                                                        </GridItem>
                                                    <GridItem xs={12} sm={12} md={6}>
                                                        <CustomInput
                                                            labelText="contact"
                                                            id="contactTextField"
                                                            formControlProps={{
                                                                fullWidth: true,
    
                                                            }}
    
                                                            inputRef={this.contactTextFieldRef}
                                                        />
                                                    </GridItem>
    
                                                        <Button
                                                            style={{
                                                                width: 50,
                                                                height: 50,
                                                                alignSelf: "center",
                                                                background: "#039BE5",
                                                                color: "white"
                                                            }}
                                                            variant="fab"
                                                            type="submit"
                                                            onClick={async ev => {
                                                                console.log("submit") ;
                                                                ev.preventDefault();
                                                                ev.stopPropagation();
                                                                ev.nativeEvent.stopImmediatePropagation();
    
    
                                                                const titleTextField = get(
                                                                    this.titleTextFieldRef,
                                                                    "current.value",
                                                                    ""
                                                                );
                                                                const shortDescriptionMetaTextField = get(
                                                                    this.shortDescriptionMetaTextFieldRef,
                                                                    "current.value",
                                                                    ""
                                                                );
                                                                const longDescriptionkMetaTextField = get(
                                                                    this.longDescriptionMetaTextFieldRef,
                                                                    "current.value",
                                                                    ""
                                                                );
                                                                const contactTextField = get(
                                                                    this.contactTextFieldRef,
                                                                    "current.value",
                                                                    ""
                                                                );
    
                                                                console.log(this.titleTextFieldRef);
                                                                console.log(this.shortDescriptionMetaTextFieldRef);
    
                                                                await runMutation({
                                                                    titleTextField: titleTextField,
                                                                    shortDescriptionMetaTextField: shortDescriptionMetaTextField,
                                                                    created_at: firebase.database.ServerValue.TIMESTAMP,
                                                                    updated_at: firebase.database.ServerValue.TIMESTAMP
                                                                });
    
    
                                                                set(this.titleTextFieldRef, "current.value", "");
                                                               set(this.shortDescriptionMetaTextFieldRef, "current.value", "");
                                                            }}
                                                        >
                                                            +
                                                        </Button>
    
                                                    </GridContainer>
    
                                            </form>
                                        )}
                                    </FirebaseDatabaseMutation>
    
                                </GridItem>
                            </GridContainer>
                        </div>
                    </div>
                </div>
                <div className={classNames(classes.main, classes.mainRaised)}>
                    <div className={classes.container}>
    
                    </div>
                </div>
                <br/>
                <Footer />
            </div>
        );
    }
    

    }

    我想再添加一个信息,自定义输入是功能组件 我想从父母那里得到参考

    function CustomInput({ ...props }) {
      const {
        classes,
        formControlProps,
        labelText,
        id,
        labelProps,
        inputProps,
        error,
        white,
        inputRootCustomClasses,
        success
      } = props;
    
      const labelClasses = classNames({
        [" " + classes.labelRootError]: error,
        [" " + classes.labelRootSuccess]: success && !error
      });
      const underlineClasses = classNames({
        [classes.underlineError]: error,
        [classes.underlineSuccess]: success && !error,
        [classes.underline]: true,
        [classes.whiteUnderline]: white
      });
      const marginTop = classNames({
        [inputRootCustomClasses]: inputRootCustomClasses !== undefined
      });
      const inputClasses = classNames({
        [classes.input]: true,
        [classes.whiteInput]: white
      });
      var formControlClasses;
      if (formControlProps !== undefined) {
        formControlClasses = classNames(
          formControlProps.className,
          classes.formControl
        );
      } else {
        formControlClasses = classes.formControl;
      }
      return (
        <FormControl {...formControlProps} className={formControlClasses}>
          {labelText !== undefined ? (
            <InputLabel
              className={classes.labelRoot + " " + labelClasses}
              htmlFor={id}
              {...labelProps}
            >
              {labelText}
            </InputLabel>
          ) : null}
          <Input
            classes={{
              input: inputClasses,
              root: marginTop,
              disabled: classes.disabled,
              underline: underlineClasses
            }}
            id={id}
            {...inputProps}
          />
        </FormControl>
      );
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Nino Filiu    6 年前

    official docs :

    在典型的react数据流中,props是父组件与子组件交互的唯一方式。若要修改子对象,请使用新的道具重新渲染它。

    你的第一个倾向可能是在你的应用程序中使用refs来使事情发生。如果是这样的话,请花点时间仔细考虑一下在组件层次结构中应该在哪里拥有状态。通常情况下,很明显,拥有该状态的适当位置在层次结构中处于更高级别。查看 Lifting State Up 这方面的示例指南。

    目前,您正在做不应该做的事情:使用refs访问组件方法。那就是 反模式 制定你的代码 对错误敏感 就像你现在正在经历的。您应该:

    • 如果需要将数据从一个组件传递到另一个组件,请提升状态
    • 使用状态容器库,如 Redux 如果你需要触发动作

    不管是哪种方式,我强烈建议您在任意方向上重构代码。