当前位置: 首页 > 知识库问答 >
问题:

将React的“ref”属性与材质UI一起使用

全心思
2023-03-14

我试图在Material UI的TextField上使用React的“ref”属性访问输入数据。通过“inputRef”或“inputProps”似乎没有一种简单的方法可以做到这一点。

下面的示例显示了第26行的inputProps的使用。将TextField的名称指定给“ref”属性似乎不会生成有效的对象。

对于“inputRef”,根据Material ui文档,它强制使用函数,尝试将字段数据作为属性传入也不起作用。例:(txt)=

有人找到解决办法了吗?

class MediaForm extends Component {
  constructor (props) {
    super(props)
    this.state = {}
    this.handleSubmit = this.handleSubmit.bind(this)
  }

  handleSubmit (e) {
    const { title, colour } = this.refs
    e.preventDefault()
    window.alert(`New colour: ${title.value} ${colour.value}`)
  }

  render () {
    const { classes } = this.props
    return (
      <form className={classes.root}
        onSubmit={this.handleSubmit}>
        <div className={classes.field}>
          <TextField
            name='title'
            type='text'
            label='Title'
            placeholder='Movie title...'
            autoFocus
            inputProps={{ref: this.name}}
            required />
        </div>
        <div className={classes.field}>
          <Tooltip title='Add a colour the reflects the mood of the film'>
            <TextField
              name='colour'
              type='color'
              label='Mood'
              inputProps={{ref: this.name}}
              required />
          </Tooltip>
        </div>
        <Button
          variant='raised'
          color='primary'
          className={classes.button}>
          ADD
        </Button>
      </form>
    )
  }
}

MediaForm.propTypes = {
  classes: PropTypes.object.isRequired
}

export default withRoot(withStyles(styles)(MediaForm))

共有2个答案

晋天逸
2023-03-14
class MediaForm extends Component {
  refs = {}  // <____ notice this
  constructor (props) {
    super(props)
    this.state = {}
    this.handleSubmit = this.handleSubmit.bind(this)
  }

  handleSubmit (e) {
    const { title, colour } = this.refs
    e.preventDefault()
    window.alert(`New colour: ${title.value} ${colour.value}`)
  }

  render () {
    const { classes } = this.props
    return (
      <form className={classes.root}
        onSubmit={this.handleSubmit}>
        <div className={classes.field}>
          <TextField
            inputProps={{ref => this.refs.title = ref}}
            name='title'
            type='text'
            label='Title'
            placeholder='Movie title...'
            autoFocus
            required />
        </div>
        <div className={classes.field}>
          <Tooltip title='Add a colour the reflects the mood of the film'>
            <TextField
              name='colour'
              inputProps={{ref => this.refs.colour = ref}}
              type='color'
              label='Mood'
              required />
          </Tooltip>
        </div>
        <Button
          variant='raised'
          color='primary'
          className={classes.button}>
          ADD
        </Button>
      </form>
    )
  }
}

MediaForm.propTypes = {
  classes: PropTypes.object.isRequired
}

export default withRoot(withStyles(styles)(MediaForm))
王季萌
2023-03-14

你不需要参考文献。submit事件包含作为目标的表单。您可以通过表单访问表单中的输入。元素

handleSubmit (event) {
    const { title, colour } = event.currentTarget.elements;
    event.preventDefault();
    window.alert(`New colour: ${title.value} ${colour.value}`);
}

关于你的参考文献的问题:。名称请参阅?您没有在任何地方声明它,因此它是未定义的。将undefined传递到ref道具无效。另外,如何将两个输入引用绑定到同一实例属性name。您是否知道渲染函数中的this引用了MediaForm组件的实例,因此this。name是组件实例(未定义)上的属性name

如果要获得每个输入的单个引用,则应使用回调模式。请注意,字符串引用已弃用,不应使用:

render() {
    return(
        <TextField
            name='title'
            type='text'
            label='Title'
            placeholder='Movie title...'
            autoFocus
            inputProps={{ref: input => this.titleInput = input}}
            required 
        />
    );
}

编辑:

你可能想要的是所谓的受控组件。在此模式中,父组件跟踪其子组件的值(通常是输入):

class MediaForm extends Component {
    constructor(props) {
        super(props);
        this.state = {
            title: '',
            colour: '',
        };
    }

    handleChange = event => {
        const {name, value} = event.currentTarget;
        this.setState({[name]: value});
    };

    handleSubmit = event => {
        event.preventDefault();
        const {title, colour} = this.state;
        window.alert(`New colour: ${title} ${colour}`);
    };

    render() {
        const {classes} = this.props;
        const {title, colour} = this.state;

        return (
            <form className={classes.root} onSubmit={this.handleSubmit}>
                <div className={classes.field}>
                    <TextField
                        name="title"
                        type="text"
                        value={title}
                        onChange={this.handleChange}
                        label="Title"
                        placeholder="Movie title..."
                        required
                    />
                </div>
                <div className={classes.field}>
                    <Tooltip title="Add a colour the reflects the mood of the film">
                        <TextField
                            name="colour"
                            type="color"
                            value={colour}
                            onChange={this.handleChange}
                            label="Mood"
                            required
                        />
                    </Tooltip>
                </div>
                <Button
                    type="submit"
                    variant="raised"
                    color="primary"
                    className={classes.button}
                >
                    ADD
                </Button>
            </form>
        );
    }
}

现在,您的父级可以通过this.state.titlethis.state.colour完全控制和访问每个输入的值。这里也不需要任何裁判。

 类似资料:
  • 从 1.2 版本开始, UI 的 Sprite 组件支持自定义材质的使用,其使用界面如下图: 其使用方法与其他材质并无不同,但由于 Sprite 面板有基于 UI 内置材质的功能,所以有一些需要注意的点: 当设置自定义材质数量为 0 或为空时,会使用默认材质进行渲染,面板功能及使用方法可参考 Sprite UI 并不支持多材质,自定义材质的数量最多为一个 当使用了 ui 自定义材质之后,面板上的

  • 如果你的javascript语言基础还可以,应该明白类、基类、子类、父类等概念。如果你有这些类的概念,那么在学习Threejs的过程中,如何查找Threejs文档将会比较顺利。 点材质PointsMaterial、基础线材质LineBasicMaterial、基础网格材质MeshBasicMaterial、高光网格材质MeshPhongMaterial等材质都是父类Material的子类。 各种各

  • 我已经学会了我可以使用参考文献来实现这一点。但是,当我将一个ref与几个TextInputs一起使用时,我只与最后一个TextInputs一起使用

  • 问题内容: 在Material UI中,我想在按钮上设置borderRadius。传递属性似乎适用于,但不适用于。 对于,borderRadius应用于父对象(这是必需的),而不是自身(也是必需的) 这是Material UI中的错误吗?还是这种行为是故意的?如果需要,那么如何制作带有圆角的RaisedButton? 问题答案: 这是预期的行为,并在docs中这样说。作为记录,您永远不希望将道具传

  • 实际上,我们使用Google IdP作为应用程序的SSO/SAML身份验证类型。我们已将其配置为将用户连接到应用程序,并且运行良好。但最近,我们还想要求用户对应用程序生命周期中可能发生的不同操作进行重新验证。 更详细地说,当我们向Google Idp发送SAML请求时,我们在节点“AuthnRequest”中添加了属性ForceAuthn=“true”,我们还添加了AuthnContextClas

  • 属性文件如何与Apache Camel一起使用,以引用可配置的属性。例如,如果有从文件夹读取文件的路由,那么如何在属性文件中配置该文件夹位置。我正在使用JavaDSL。