Search code examples
javascriptreactjsinputaxiosdefault-value

defaultValue of Input not working with axios


I want to update my register form with reactJS, when I run my backend with Postman, it works well. But,when I run my frontend, and update the input, I get the alert: "Input field value is missing" which, close quickly, after that, I get cannot POST.

You can see the code as below :

Router :

exports.editclient = function(req, res) {
    var data = {
        Prenom: req.body.Prenom,
        Nom: req.body.Nom,
        FAX: req.body.FAX,
        Telephone: req.body.Telephone,
        Email: req.body.Email,
        Adresse1: req.body.Adresse1,
        Adresse2: req.body.Adresse2,
    };
    var Code = req.params.Code
    connection.query("UPDATE clients set ? WHERE Code = ? ", [data, req.params.Code], function(error, results, fields) {
        if (error) throw error;
        else {
            res.send(JSON.stringify(results));
            console.log("Data is updated");
        }
    });
};

Server :

router.put('/editclient/:Code', clients.editclient);

Class :

class EditClient extends Component {
  constructor(props) {
    super(props)
    this.state = {
      clients: [],
      Code: props.match.params.Code,
      Prenom: '',
      Nom: '',
      FAX: '',
      Telephone: '',
      Email: '',
      Adresse1: '',
      Adresse2: ''
    }
    this.handleEdit = this.handleEdit.bind(this);
  }
  componentDidMount() {
    axios.get('http://localhost:4000/app/viewclient/' + this.props.match.params.Code).then(response => {
      if (response && response.data) {
        this.setState({ clients: response.data });
      }
    }).catch(error => console.log(error));
  }
  handleEdit() {
    if (this.state.FAX.length == 8 && this.state.Telephone.length == 8) {
      var client = {
        Prenom: this.state.Prenom,
        Nom: this.state.Nom,
        FAX: this.state.FAX,
        Telephone: this.state.Telephone,
        Email: this.state.Email,
        Adresse1: this.state.Adresse1,
        Adresse2: this.state.Adresse2
      }
      axios({
        method: 'put',
        url: "http://localhost:4000/app/editclient/" + this.props.match.params.Code,
        data: client,
      }).then(function(response) {
        this.setState({ Prenom: "" });
        this.setState({ Nom: "" });
        this.setState({ FAX: "" });
        this.setState({ Telephone: "" });
        this.setState({ Email: "" });
        this.setState({ Adresse1: "" });
        this.setState({ Adresse2: "" });
      }.bind(this)).catch(function(error) {
        console.log(error);
      });
    }
    else {
      alert("Input field value is missing");
    }
  }
  handleCodeChange = (e) => {
    this.setState({ Code: e.target.value });
  }
  handlePrenomChange = (e) => {
    this.setState({ Prenom: e.target.value });
  }
  handleNomChange = (e) => {
    this.setState({ Nom: e.target.value });
  }
  handleFAXChange = (e) => {
    this.setState({ FAX: e.target.value });
  }
  handleTelephoneChange = (e) => {
    this.setState({ Telephone: e.target.value });
  }
  handleEmailChange = (e) => {
    this.setState({ Email: e.target.value });
  }
  handleAdresse1Change = (e) => {
    this.setState({ Adresse1: e.target.value });
  }
  handleAdresse2Change = (e) => {
    this.setState({ Adresse2: e.target.value });
  }
  render() {
    let { clients } = this.state;
    var btn = {
      display: 'block',
      margin: 'auto'
    }
    var Cd = { pointerEvents: 'none' }
    return (<div className="animated fadeIn">

           <Row>
          <Col xs="12"  >

              <Card>
                <CardHeader>
              <h4><strong>    <i className="fa fa-user"> </i> Modifier le client  </strong></h4>

                </CardHeader>

                  <CardBody>
                  {   this.state.clients.map(client => (
                    <Form className="form-horizontal"  method="POST"  key={client.Code} >


                   <FormGroup row >
                       <Col md="3">
                    <h5>  <Label htmlFor="hf-id"><strong>Code client</strong></Label></h5>
                    </Col>

                      <Col xs="12" md="9" >
                        <div className="controls">
                          <InputGroup className="input-code">
                            <InputGroupAddon addonType="prepend">
                              <InputGroupText><i className="fa fa-id-card-o" aria-hidden="true"></i></InputGroupText>
                            </InputGroupAddon>
                            <Input id="Code" style = { Cd } size="16" type="text" placeholder="Entrer le code du client"   onChange={this.handleCodeChange.bind(this)} defaultValue={client.Code}     readonly="readonly"/>
                            <FormFeedback className="help-block">Entrez le code SVP ! </FormFeedback>
                          </InputGroup>
                        </div>
                        </Col>
                      </FormGroup>

                      <FormGroup row>
                       <Col md="3">
                    <h5>  <Label htmlFor="hf-pren"><strong>Prénom</strong></Label></h5>
                    </Col>
                    <Col xs="12" md="9">
                        <div className="controls" >
                          <InputGroup className="input-pren">
                            <InputGroupAddon addonType="prepend">
                              <InputGroupText><i className="fa fa-user-circle-o" aria-hidden="true"></i></InputGroupText>
                            </InputGroupAddon>
                            <Input id="prénom" size="16" type="text"    defaultValue={client.Prenom}  onChange={this.handlePrenomChange.bind(this)} placeholder="Entrer le prénom du client" autoComplete='given-name' />

                          </InputGroup>

                        </div>
                        </Col>
                      </FormGroup>

                      <FormGroup row>
                       <Col md="3">
                    <h5>  <Label htmlFor="hf-nom"><strong>Nom</strong></Label></h5>
                    </Col>
                    <Col xs="12" md="9">
                        <div className="controls">
                          <InputGroup className="input-nom">
                            <InputGroupAddon addonType="prepend">
                              <InputGroupText><i className="fa fa-user-circle" aria-hidden="true"></i></InputGroupText>
                            </InputGroupAddon>
                            <Input id="nom" size="16" type="text"    defaultValue={client.Nom}     onChange={this.handleNomChange.bind(this)} placeholder="Entrer le nom du client" autocomplete='family-name' />

                          </InputGroup>

                        </div>
                        </Col>
                      </FormGroup>


                     <FormGroup row>
                       <Col md="3">
                    <h5>  <Label htmlFor="hf-tel"><strong>Numéro de FAX</strong></Label></h5>
                    </Col>
                    <Col xs="12" md="9">
                        <div className="controls">
                          <InputGroup className="input-fax">
                            <InputGroupAddon addonType="prepend">
                              <InputGroupText><i className="flag-icon flag-icon-tn " title="tn" id="tn"></i></InputGroupText>
                            </InputGroupAddon>
                            <Input id="fax" size="16" type="tel"   defaultValue={client.FAX}   onChange={this.handleFAXChange.bind(this)} placeholder="Entrer le numéro du FAX du client" autoComplete='tel' />

                          </InputGroup>

                        </div>
                        </Col>
                      </FormGroup>
                      <FormGroup row>
                       <Col md="3">
                    <h5>  <Label htmlFor="hf-tel"><strong>Numéro de Téléphone</strong></Label></h5>
                    </Col>
                    <Col xs="12" md="9">
                        <div className="controls">
                          <InputGroup className="input-tel">
                            <InputGroupAddon addonType="prepend">
                              <InputGroupText><i className="flag-icon flag-icon-tn " title="tn" id="tn"></i></InputGroupText>
                            </InputGroupAddon>
                            <Input id="tel" size="16" type="tel"   defaultValue={client.Telephone}   onChange={this.handleTelephoneChange.bind(this) } placeholder="Entrer le numéro du télèphone du client" autoComplete='tel-national' />

                          </InputGroup>

                        </div>
                        </Col>
                      </FormGroup>


                      <FormGroup row>
                       <Col md="3">
                    <h5>  <Label htmlFor="hf-email"><strong>Email</strong></Label></h5>
                    </Col>
                    <Col xs="12" md="9">
                        <div className="controls">
                          <InputGroup className="input-email">
                            <InputGroupAddon addonType="prepend">
                              <InputGroupText><i className="fa fa-envelope" aria-hidden="true"></i></InputGroupText>
                            </InputGroupAddon>
                            <Input id="email" size="16"      defaultValue={client.Email}   onChange={this. handleEmailChange.bind(this)}type="email" placeholder="Entrer l'email du client" autoComplete='email' />

                          </InputGroup>

                        </div>
                        </Col>
                      </FormGroup>


                       <FormGroup row>
                       <Col md="3">
                    <h5>  <Label htmlFor="hf-adr"><strong>Adresse 1 </strong></Label></h5>
                    </Col>
                    <Col xs="12" md="9">
                        <div className="controls">
                          <InputGroup className="input-Adr">
                            <InputGroupAddon addonType="prepend">
                              <InputGroupText><i className="fa fa-location-arrow" aria-hidden="true"></i></InputGroupText>
                            </InputGroupAddon>
                            <Input id="adr" size="16" type="text"    defaultValue={client.Adresse1}  onChange={this.handleAdresse1Change.bind(this)} placeholder="Entrer l'adresse 1  du client" autocomplete='street-address' />

                          </InputGroup>

                        </div>
                        </Col>
                      </FormGroup>

                       <FormGroup row>
                       <Col md="3">
                    <h5>  <Label htmlFor="hf-adr"><strong>Adresse 2 </strong></Label></h5>
                    </Col>
                    <Col xs="12" md="9">
                        <div className="controls">
                          <InputGroup className="input-Adr2">
                            <InputGroupAddon addonType="prepend">
                              <InputGroupText><i className="fa fa-location-arrow" aria-hidden="true"></i></InputGroupText>
                            </InputGroupAddon>
                            <Input id="adr2" size="16" type="text"   defaultValue={client.Adresse2}  onChange={this.handleAdresse2Change.bind(this)} placeholder="Entrer l'adresse 2  du client" autoComplete='address-line2' />

                          </InputGroup>

                        </div>
                        </Col>
                      </FormGroup>


                      <div className="form-actions" >

                        <Button  active color="info" size="lg"    style={btn}  type="submit"  onClick={() => this. handleEdit()} >Modifier</Button>

                      </div>
                    </Form>
                  ))}
                  </CardBody>

              </Card>

          </Col>

        </Row>

        </div>);
  }
}
export default EditClient;

How can I fix that ?


Solution

  • You should try without data: before the client and the comma ',' after it.

    axios({
        method: 'put',
        url: "http://localhost:4000/app/editclient/" + this.props.match.params.Code,
        client
    });
    

    Hope it helps.