3

使用 Material UI + redux-form 创建自定义样式时,redux-form 中的 Field 元素不会应用自定义类名称。当简单地使用 Material UI 中的 FieldText 时。我已经注释掉了下面无效的代码行。

自定义样式对象正在通过原型上定义的名为“类”的道具应用于反应组件。

import React, {Component} from 'react';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';
import { Field, reduxForm } from 'redux-form';
import { connect } from 'react-redux';
import {createOrder} from '../actions';

const styles = theme => ({
  root: {
    display: 'flex',
    flexWrap: 'wrap',
    justifyContent: 'center'
  },
  margin: {
    margin: theme.spacing.unit,
  },
  textField: {
    flexBasis: 400,
  },
  button: {
    margin: theme.spacing.unit,
  },
  input: {
    display: 'none',
  },
});


class Order extends Component {

  renderField(field) {
    return (
      <div>
        <TextField
          id="outlined-simple-start-adornment"
          // className={classNames(classes.margin, classes.textField)}
          variant="outlined"
          label="Age"

          {...field.input}
        />

      </div>
    )
  }

  render() {
    const { classes } = this.props;
    return (
      <form >
        <div className={classes.root}>
          <Field
            name="age"
            label="age"
            component={this.renderField}
          />
          <TextField
            id="outlined-simple-start-adornment"
            className={classNames(classes.margin, classes.textField)}
            variant="outlined"
            label="Company Name"
          />
        </div>
      </form>
    );
  }
}

Order.propTypes = {
  classes: PropTypes.object.isRequired,
};



export default reduxForm({
  form: 'Form'
})(
  connect(null, {createOrder})(withStyles(styles)(Order))
);
4

3 回答 3

2

这是一个旧线程,但我刚刚遇到了一个类似的问题,我想分享一下我是如何解决材料 UI 和 Redux-form 的相同问题的人的:

  1. 将类作为道具传递
<Field
  component={this.renderInput}
  classes={classes}
/>
  1. props 包含可用的类
renderInput(props) {
  console.log('console logging render input', props);
  return (
    <InputBase
      placeholder='Search…'
      inputProps={{ 'aria-label': 'search' }}
      classes={{
        root: props.classes.root, //call your className
      }}
    />
  );
}
于 2020-06-23T20:06:13.017 回答
0

因为classes是未定义的,所以可以classes从 props 访问。

像这样。

className={classNames(this.props.classes.margin, this.props.classes.textField)}

TextField应该是这样的。

<TextField
      id="outlined-simple-start-adornment"
      className={classNames(this.props.classes.margin, this.props.classes.textField)}
      variant="outlined"
      label="Age"
      {...field.input}
    />
于 2018-11-22T09:03:26.090 回答
0

我认为你已经定义const { classes } = this.props;了,但由于它的范围,它render()在里面是不可访问的。renderField(field){...}

您不能解构整个组件的道具。解构只能分配局部变量,因此您需要解构每个函数中的道具。否则不用写也没什么错this.props.value.

所以在这里你有两种选择

1] 将道具传递给或再次在内部renderField() 解构const { classes } = this.propsrenderField()

2]直接使用this.props.classes而不是仅仅classesrenderField()

于 2018-11-22T09:44:07.083 回答