web-dev-qa-db-fra.com

Gérer le changement du composant de saisie semi-automatique à partir du matériau ui

Je veux utiliser le composant Autocomplete pour les balises d'entrée. J'essaie d'obtenir les balises et de les enregistrer sur un état afin de pouvoir les enregistrer plus tard dans la base de données. J'utilise des fonctions plutôt que des classes dans React. J'ai essayé avec onChange, mais je n'ai obtenu aucun résultat.

<div style={{ width: 500 }}>
    <Autocomplete
        multiple
        options={autoComplete}
        filterSelectedOptions
        getOptionLabel={option => option.tags}
        renderInput={params => (<TextField
                className={classes.input}
                {...params}
                variant="outlined"
                placeholder="Favorites"
                margin="normal"
                fullWidth />)} />
11
Buk Lau

Comme Yuki l'a déjà mentionné, assurez-vous d'avoir bien utilisé la fonction onChange. Il reçoit deux paramètres. Selon la documentation:

Signature: function(event: object, value: any) => void.

event: La source d'événement du rappel

value: null (La/les valeur (s) du composant de saisie semi-automatique).

Voici un exemple:

import React from 'react';
import Chip from '@material-ui/core/Chip';
import Autocomplete from '@material-ui/lab/Autocomplete';
import TextField from '@material-ui/core/TextField';

export default class Tags extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      tags: []
    };
    this.onTagsChange = this.onTagsChange.bind(this);
  }

  onTagsChange = (event, values) => {
    this.setState({
      tags: values
    }, () => {
      // This will output an array of objects
      // given by Autocompelte options property.
      console.log(this.state.tags);
    });
  }

  render() {
    return (
      <div style={{ width: 500 }}>
        <Autocomplete
          multiple
          options={top100Films}
          getOptionLabel={option => option.title}
          defaultValue={[top100Films[13]]}
          onChange={this.onTagsChange}
          renderInput={params => (
            <TextField
              {...params}
              variant="standard"
              label="Multiple values"
              placeholder="Favorites"
              margin="normal"
              fullWidth
            />
          )}
        />
      </div>
    );
  }
}

const top100Films = [
  { title: 'The Shawshank Redemption', year: 1994 },
  { title: 'The Godfather', year: 1972 },
  { title: 'The Godfather: Part II', year: 1974 },
  { title: 'The Dark Knight', year: 2008 },
  { title: '12 Angry Men', year: 1957 },
  { title: "Schindler's List", year: 1993 },
  { title: 'Pulp Fiction', year: 1994 },
  { title: 'The Lord of the Rings: The Return of the King', year: 2003 },
  { title: 'The Good, the Bad and the Ugly', year: 1966 },
  { title: 'Fight Club', year: 1999 },
  { title: 'The Lord of the Rings: The Fellowship of the Ring', year: 2001 },
  { title: 'Star Wars: Episode V - The Empire Strikes Back', year: 1980 },
  { title: 'Forrest Gump', year: 1994 },
  { title: 'Inception', year: 2010 },
];
19
germmand

Voulez-vous vraiment utiliser onChange correctement?

onChangesignature: function(event: object, value: any) => void

3
Yuki

@Dworo

Pour toute personne qui a un problème avec l'affichage d'un élément sélectionné dans la liste déroulante du champ de saisie.

J'ai trouvé une solution de contournement. Fondamentalement, vous devez lier une inputValue à onChage pour les deux Autocomplete et TextField, interface utilisateur matérielle merdique.

const [input, setInput] = useState('');

<Autocomplete
  options={suggestions}
  getOptionLabel={(option) => option}
  inputValue={input}
  onChange={(e,v) => setInput(v)}
  style={{ width: 300 }}
  renderInput={(params) => (
    <TextField {...params} label="Combo box" onChange={({ target }) => setInput(target.value)} variant="outlined" fullWidth />
  )}
/>
1
Deda
  <Autocomplete
                disableClearable='true'
                disableOpenOnFocus="true"
                options={top100Films}
                getOptionLabel={option => option.title}
                onChange={this.onTagsChange}
                renderInput={params => (
                  <TextField
                    {...params}
                    variant="standard"
                    label="Favorites"
                    margin="normal"
                    fullWidth
                  />
                )}
                />

En utilisant le code ci-dessus, je ne parviens toujours pas à obtenir la case de saisie semi-automatique pour afficher l'option sélectionnée. Des idées les gars?

0
Dworo

J'avais besoin d'appuyer sur mon API à chaque changement d'entrée pour obtenir mes balises du backend!

Utilisez Material-ui onInputChange si vous souhaitez obtenir vos balises suggérées à chaque changement d'entrée!

this.state = {
  // labels are temp, will change every time on auto complete
  labels: [],
  // these are the ones which will be send with content
  selectedTags: [],
}
}

//to get the value on every input change
onInputChange(event,value){
console.log(value)
//response from api
.then((res) => {
      this.setState({
        labels: res
      })
    })

}

//to select input tags
onSelectTag(e, value) {
this.setState({
  selectedTags: value
})
}


            <Autocomplete
            multiple
            options={top100Films}
            getOptionLabel={option => option.title}
            onChange={this.onSelectTag} // click on the show tags
            onInputChange={this.onInputChange} //** on every input change hitting my api**
            filterSelectedOptions
            renderInput={(params) => (
              <TextField
                {...params}
                variant="standard"
                label="Multiple values"
                placeholder="Favorites"
                margin="normal"
                fullWidth
              />
0
oyemujtaba

Je voulais mettre à jour mon état lorsque je sélectionne une option dans la saisie semi-automatique. J'avais un gestionnaire onChange global qui gère toutes les entrées

         const {name, value } = event.target;
         setTukio({
          ...tukio,
          [name]: value,
        });

Cela met à jour l'objet dynamiquement en fonction du nom du champ. Mais sur la saisie semi-automatique, le nom revient vide. J'ai donc changé le gestionnaire de onChange en onSelect. Ensuite, créez une fonction distincte pour gérer la modification ou, comme dans mon cas, ajoutez une instruction if pour vérifier si le nom n'est pas transmis.

// This one will set state for my onSelect handler of the autocomplete 
     if (!name) {
      setTukio({
        ...tukio,
        tags: value,
      });
     } else {
      setTukio({
        ...tukio,
        [name]: value,
      });
    }

L'approche ci-dessus fonctionne si vous avez une seule saisie semi-automatique. Si vous en avez plusieurs, vous pouvez passer une fonction personnalisée comme ci-dessous

<Autocomplete
    options={tags}
    getOptionLabel={option => option.tagName}
    id="tags"
    name="tags"
    autoComplete
    includeInputInList
    onSelect={(event) => handleTag(event, 'tags')}
          renderInput={(params) => <TextField {...params} hint="koo, ndama nyonya" label="Tags" margin="normal" />}
        />

// The handler 
const handleTag = ({ target }, fieldName) => {
    const { value } = target;
    switch (fieldName) {
      case 'tags':
        console.log('Value ',  value)
        // Do your stuff here
        break;
      default:
    }
  };
0
TRANS