सामग्री ui से स्वत: पूर्ण घटक पर परिवर्तन को संभालें


12

मैं Autocompleteइनपुट टैग के लिए घटक का उपयोग करना चाहता हूं । मैं टैग प्राप्त करने और उन्हें सहेजने की कोशिश कर रहा हूं ताकि मैं बाद में उन्हें डेटाबेस पर सहेज सकूं। मैं प्रतिक्रिया में कक्षाओं के बजाय कार्यों का उपयोग कर रहा हूं। मैंने कोशिश की onChange, लेकिन मुझे कोई नतीजा नहीं मिला।

<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 />)} />

जवाबों:


26

जैसा कि युकी ने पहले ही उल्लेख किया है, सुनिश्चित करें कि आपने onChangeफ़ंक्शन का ठीक से उपयोग किया है। यह दो मापदंडों को प्राप्त करता है। प्रलेखन के अनुसार:

हस्ताक्षर : function(event: object, value: any) => void

event: कॉलबैक का ईवेंट स्रोत

value: अशक्त (स्वत: पूर्ण घटक के भीतर मूल्य / मूल्य)।

यहाँ एक उदाहरण है:

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 },
];

बहुत बहुत धन्यवाद मैं TextField घटक पर बुकक्रॉफ्ट का उपयोग कर रहा था
बुका लाउ

4

क्या आप सुनिश्चित हैं कि आपने onChangeसही तरीके से उपयोग किया है?

onChange हस्ताक्षर :function(event: object, value: any) => void


बहुत बहुत धन्यवाद मैं TextField घटक पर बुकक्रॉफ्ट का उपयोग कर रहा था
बुका लाउ

3

@Dworo

इनपुट फ़ील्ड में ड्रॉपडाउन से चयनित आइटम प्रदर्शित करने में किसी को भी समस्या होती है।

मुझे एक वर्कअराउंड मिला। मूल रूप से आप एक बाध्य करने के लिए है inputValueपर onChageदोनों के लिए Autocompleteऔर TextField, shitty सामग्री यूआई।

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 />
  )}
/>

0
  <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
                  />
                )}
                />

उपरोक्त कोड का उपयोग करने पर, मैं अभी भी चयनित विकल्प को प्रदर्शित करने के लिए स्वत: पूर्ण बॉक्स प्राप्त नहीं कर सकता हूं .. किसी भी विचार दोस्तों?


onTagsChange = (घटना, मान) => {const {handleChange} = this.props; handleChange ('searchKeyword', मान)}
Dworo

मुझे वास्तव में एक ही समस्या है, डॉक्स से कोड की प्रतिलिपि बनाई, और यह काम नहीं कर रहा है। अविश्वसनीय!
डेडा

0

बैकएंड से अपने टैग प्राप्त करने के लिए मुझे अपने इनपुट परिवर्तन पर अपने एपीआई को हिट करने की आवश्यकता है!

यदि आप प्रत्येक इनपुट परिवर्तन पर अपने सुझाए गए टैग प्राप्त करना चाहते हैं, तो सामग्री-यूआई onInputChange का उपयोग करें!

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

जब मैं स्वतः पूर्ण से कोई विकल्प चुनता हूं तो मैं अपनी स्थिति को अपडेट करना चाहता था। मेरे पास एक वैश्विक ऑनचेंज हैंडलर था जो सभी इनपुट के लिए प्रबंधन करता है

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

वह वस्तु को क्षेत्र के नाम के आधार पर गतिशील रूप से अद्यतन करता है। लेकिन स्वतः पूर्ण पर नाम खाली आता है। तो मैं से हैंडलर बदल onChangeकरने के लिए onSelect। फिर या तो परिवर्तन को संभालने के लिए एक अलग फ़ंक्शन बनाएं या जैसा कि नाम में पारित नहीं हुआ है, तो यह जांचने के लिए कि क्या एक बयान जोड़ा गया है।

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

उपर्युक्त दृष्टिकोण काम करता है अगर यू के पास एक स्वत: पूर्ण है। यदि आपके पास कई यू हैं, तो नीचे दिए गए एक कस्टम फ़ंक्शन पास कर सकते हैं

<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:
    }
  };
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.