【问题标题】:Reactjs Material load defaultValue in TextField & Cannot read property 'map' of undefinedReactjs Material在TextField中加载defaultValue&无法读取未定义的属性'map'
【发布时间】:2019-12-20 05:47:59
【问题描述】:

我这里有两个问题。

  1. 无法在TextField 中加载defaultValue。我正在使用 reactjs 材料
  2. 当我开始输入 TextField 时。它在下面抛出错误

无法读取未定义的属性“地图”

谁能告诉我哪里出错了?

ShipmentDetail.tsx

    interface ShipmentInterface {
      detail: any;
    }

    export class ShipmentDetail extends Component<any, ShipmentInterface> {
      constructor(props: any) {
        super(props);

        this.state = {
          detail: ''
        };

        this.handleChange = this.handleChange.bind(this);
        // nameUpdate: this.state.detail.name;
      }

      componentDidMount() {
        this.getShipmentDetail();
      }

      getShipmentDetail() {
        let { params } = this.props.match;
        params = params.id;
        axios
          .get(`http://localhost:3001/shipments/${params}`)
          .then((response: any) => {
            this.setState({ detail: response.data });
          });
      }

      handleChange = (event: any) => {
        event.preventDefault();
         this.setState({
           detail: {
            name: event.target.value
           }
        });
      };

      render() {
        return (
          <Card className="Card">
            <CardContent className="Card-Content">
              <Grid container spacing={3}>
                <Grid item xs={12}>
                  <div className="Card-Content__Header">
                    <TextField
                      id="outlined-name"
                      label="Name"
                      defaultValue={this.state.detail.name || ''}
                      className="Card-Content__Header--Title"
                      onChange={this.handleChange}
                      fullWidth={true}
                      margin="normal"
                      variant="outlined"
                    />
                  </div>
                </Grid>
               // I believe second error comes from here 
                <Grid item xs={12} className="Card-Content__Table">
              {this.state.detail &&
                this.state.detail.cargo.map((item: any, index: number) => (
                  <CargoList key={index} value={item} />
                ))}
            </Grid>
              </Grid>
            </CardContent>
          </Card>
        );
      }
    }

    export default ShipmentDetail;

db.json

 {
      "id": "S1002",
      "name": "PO89634, PO27X",
      "cargo": [
        {
          "type": "Bikes model 27X",
          "description": "100 Bikes model 27X",
          "volume": "100"
        }
      ],
      "mode": "air",
      "type": "LCL",
      "destination": "Saarbrücker Str. 38, 10405 Berlin",
      "origin": "Shanghai Port",
      "services": [
        {
          "type": "customs"
        }
      ],
      "total": "10000",
      "status": "COMPLETED",
      "userId": "U1001"
    }

【问题讨论】:

  • 尝试在初始状态下将detail 设置为空对象。您还确定您的 api 返回正确的数据吗?
  • @Clarity,是的,db.json 是来自/shipment/{id} 的响应对象。如果我设置为空对象,map 方法将抛出未定义的错误。

标签: reactjs react-tsx es6-map react-material


【解决方案1】:

第二个错误是因为您正在覆盖您的状态,您需要确保保留 detail 上的其他道具,特别是 cargo 数组:

handleChange = (event: any) => {
        event.preventDefault();
         this.setState({
           detail: {
            ...this.state.detail,
            name: event.target.value
           }
        });
      };

【讨论】:

  • 这段代码修复了我的第二个错误。你知道如何在TextField 中加载 defaultValue 吗?
  • 我相信 defaultValue 只能在初始渲染时设置,并且在您的状态更改时不会更新。我建议你改用value
  • 我试过了,但值不能像固定值那样改变。例如:value={this.state.detail.name || ''}
  • 不能更改是什么意思?不就是价值的目的吗?也许这个帖子会有所帮助:github.com/mui-org/material-ui/issues/1328
猜你喜欢
  • 2017-08-15
  • 2018-03-16
  • 1970-01-01
  • 2022-07-11
  • 2022-07-27
  • 1970-01-01
  • 2020-04-23
  • 2016-08-08
  • 2018-12-16
相关资源
最近更新 更多