1
votes

Comment renvoyer la valeur par défaut comme valeur d'entrée si vous ne souhaitez pas que la valeur soit modifiée?

J'ai attribué des valeurs par défaut à la balise d'entrée. Lorsque j'essaye de soumettre sans changer les valeurs de la balise d'entrée, la valeur transmise n'est pas définie.

Ce que je veux, c'est que si la valeur d'entrée est modifiée, mettre à jour la valeur d'état avec la nouvelle valeur et si la valeur de la balise d'entrée n'est pas modifiée, puis passer la valeur par défaut à l'état.

Je suis nouveau sur React.

import React, { Component } from 'react';
import Firebase from '../Firebase';
import _ from 'lodash';
import '../App.css';


class Modify extends Component {
  constructor(props) {
    super(props);
    //state
    this.state = {
      personDetails: {},
      detail: ''
    };

    //bind
    this.renderData = this.renderData.bind(this);
    this.handleChange = this.handleChange.bind(this);
    this.saveEdit = this.saveEdit.bind(this);
  }

  //lifecycle
  componentDidMount() {
    Firebase.database().ref('/nannydetails').on('value', (snapshot) => {
      this.setState({
        personDetails: snapshot.val()
      })
    })
  }

  //handle change
  handleChange(event) {
    this.setState({
      [event.target.name]: event.target.value.toLowerCase()
    });
  }

  //render data
  renderData() {
    return _.map(this.state.personDetails, (personDetail, key) => {
      return(
        <div className="pt-2 pb-1 m-2 border border-dark bg-warning row" key={key}>
          <div className="col-md-3 col-xs-3 text-right">
            <img src={require('./profile.png')} alt="cam"/>
          </div>
          <div className="col-md-9 col-xs-9 p-2">
            <div className="headline">
              <h1>Full Name: </h1>
              <input className="form-control" type="text" name="fullName" defaultValue={personDetail.fullname} onChange={this.handleChange}/>
            </div>
            <div className="headline">
              <h1>Contact Number: </h1>
              <input className="form-control" type="text" name="phone" defaultValue={personDetail.phone} onChange={this.handleChange}/>
            </div>
            <div className="headline">
              <h1>Experience: </h1>
              <input className="form-control" type="text" name="experience" defaultValue={personDetail.experience} onChange={this.handleChange}/>
            </div>
            <div className="headline">
              <h1>City: </h1>
              <input className="form-control" type="text" name="city" defaultValue={personDetail.city} onChange={this.handleChange}/>
            </div>
            <div className="headline">
              <h1>State: </h1>
              <input className="form-control" type="text" name="state" defaultValue={personDetail.state} onChange={this.handleChange}/>
            </div>
            <button className="btn btn-success" type="button" onClick={() => this.saveEdit(key)}><i className="fa fa-pencil-square-o"></i> Save Edit</button>
            <button className="btn btn-danger" type="button" onClick={() => this.handleDelete(key)}><i className="fa fa-trash"></i> Delete</button>
          </div>
        </div>
      )
    });
  }

  //handle save edit
  saveEdit(key) {
    // Firebase.database().ref(`/nannydetails/${key}`).push({
    //   fullname: this.state.fullname,
    //   phone: this.state.phone,
    //   experience: this.state.experience,
    //   city: this.state.city,
    //   state: this.state.state
    // });
    console.log(this.state.fullname);
    console.log(this.state.phone);
    console.log(this.state.experience);
    console.log(this.state.city);
    console.log(this.state.state);
  }

  //handle delete
  handleDelete(key) {
    const user= Firebase.database().ref(`/nannydetails/${key}`);
    user.remove();
  }

  render() {
    return (
      <div className="container mt-4">
        {this.renderData()}
      </div>
    );
  }
}

export default Modify;


1 commentaires

si la valeur de la balise d'entrée n'est pas modifiée, alors pour passer la valeur par défaut à l'état Si l'entrée ne change pas, react n'appellera pas le rappel onChange pour passer une valeur, par défaut ou non. Ils ne sont probablement pas définis car toutes les propriétés auxquelles vous essayez d'accéder seront sur this.state.personDetails , c'est-à-dire this.state.personDetails.fullname . Vous devez mettre à jour votre gestionnaire onChange pour mettre à jour ces valeurs au lieu d'ajouter de nouvelles propriétés.


4 Réponses :


0
votes

Faites-en un composant contrôlé. Fournissez un état initial dans votre composant et toutes les mises à jour seront effectuées dans l'état et qui se refléteront directement dans votre composant.

État initial:

input className="form-control" type="text" name="fullName" value={this.state.personDetail.fullname} onChange={this.handleChange}

Champ de saisie

this.state = {
      personDetails: {
        fullname :'test'
      },
      detail: ''
    };


2 commentaires

en fait, j'utilise Firebase. donc je veux mettre à jour les données de la base de feu en utilisant reactjs


setState prend également une fonction de rappel. Ainsi, après la mise à jour de l'état dans setState, vous pouvez ajouter votre fonction firebase dans le rappel. c'est-à-dire: - setState ({prénom: 'bonjour'}, () => {fonction Firebase})



0
votes

La meilleure façon d'aborder est qu'un composant principal prenne les données de n'importe quelle api (firebase dans votre cas) et un deuxième composant enfant qui sera chargé de prendre les entrées comme accessoires et de renvoyer l'entrée (par défaut / modifiée) sur l'action du formulaire ( nous faire parvenir). De cette façon, si les données changent, vous obtenez des données modifiées, sinon celles par défaut.

 class FormComp extends React.Component {
    constructor(props) {
    super(props);

    this.state = {
        name: this.props.form.name,
    };

    this.submit = this.submit.bind(this);
    this.handleChange = this.handleChange.bind(this);
  }

  submit(e) {
    e.preventDefault();
    console.log(this.state);
  }


  handleChange(e) {
    this.setState({name: e.target.value});
  }

  handleChan
  render() {
        return (
        <div>
          <form onSubmit={this.submit}>
          <input 
            type="text" 
            value={this.state.name} 
            onChange={this.handleChange} 
          />
            <button type="submit">Submit</button>
          </form>
        </div>
    );
  }
}

Reportez-vous à ce violon par exemple. https://jsfiddle.net/papish19/ys6utv3k/7/


1 commentaires

Veuillez ne pas définir et lier des fonctions à l'intérieur de la fonction de rendu, ce n'est pas une bonne pratique.



0
votes

onChange n'est déclenché que lorsque la valeur de l'entrée change. La valeur defaultValue peut être définie dans l'état initial et la valeur defaultValue est écrasée lorsque la valeur de l'entrée change.


0 commentaires

1
votes

Mettez à jour le gestionnaire de modifications pour mettre à jour / muter l'état existant au lieu d'ajouter une nouvelle propriété (clé), c'est-à-dire sur this.state.personDetails.X vs this.state.X

//handle change
handleChange(event) {
  // update the personDetails object you set in state on mount
  const newPersonDetails = { ...this.state.personDetails };
  newPersonDetails[event.target.name] = event.target.value.toLowerCase();
  this.setState({
    personDetails: newPersonDetails,
  });
}


2 commentaires

merci cela a fonctionné. En fait, j'ignorais la fonction onchange


@Parul Bienvenue!