Reagieren Deaktivierungsoptionen auswählen

Lesezeit: 4 Minuten

Ich habe Probleme beim Deaktivieren bestimmter Optionen in einer großen Liste innerhalb eines React Select-Elements. Ich habe ungefähr 6.500 Optionen, die in die Auswahl geladen werden. Zuerst hatte ich Probleme mit der Verzögerung der Suchfunktion, aber dann fing ich an, React-Select-Fast-Filter-Optionen zu verwenden, die dieses Problem behoben haben. Jetzt ist das Problem, dass ich bestimmte Optionen abhängig von den propType “Picks” deaktivieren muss. Hier ist der Code:

import React, {Component} from 'react'
import PropTypes from 'prop-types';
import 'react-select/dist/react-select.css'
import 'react-virtualized/styles.css'
import 'react-virtualized-select/styles.css'
import Select from 'react-virtualized-select'
import createFilterOptions from 'react-select-fast-filter-options';

let options = [];
if(typeof stockSearchStocks !== 'undefined') {
    //loads in all available options from backend by laying down a static js var
    options = stockSearchStocks
}
const filterOptions =  createFilterOptions({options});

class StockSearch extends Component {
    static propTypes = {
        exchanges: PropTypes.array.isRequired,
        onSelectChange: PropTypes.func.isRequired,
        searchDisabled: PropTypes.bool.isRequired,
        picks: PropTypes.array.isRequired,
        stock_edit_to_show: PropTypes.number
    }

    /**
     * Component Bridge Function
     * @param stock_id stocks id in the database
     */
    stockSearchChange = (stock_id) => {
        this.props.onSelectChange(stock_id);
    }

     //this is my current attempt to at least 
     //disable options on component mount but this doesn't seem to be working
    componentWillMount = () => {
        console.log('picks!: ' + JSON.stringify(this.props.picks));
        let pickIDs = this.props.picks.map((p) => p.stock_id);
        options = options.map((o) => {
            // console.log(pickIDs.indexOf(o.value));
            if(pickIDs.indexOf(o.value)) {
                // console.log('here is the option: ' + JSON.stringify(o));
                // console.log('here is the option: ' + o.disabled);
                o.disabled = true;
            }
        })

    }

    /**
     * handles selected option from the stock select
     * @param selectedOption
     */
    handleSelect = (selectedOption) => {
        this.stockSearchChange(selectedOption.value);
    }

    render() {
        return (
            <div className="stock-search-container">
                <Select
                    name="stock-search"
                    options={options}
                    placeholder="Type or select a stock here..."
                    onChange={this.handleSelect}
                    disabled={this.props.searchDisabled}
                    value={this.props.stock_edit_to_show}
                    filterOptions={filterOptions}
                />
            </div>
        )
    }
}

export default StockSearch;

Ich habe versucht, die Picks-Requisiten zu filtern und diese Optionsvariable so zu ändern, dass sie enthalten ist disabled:true aber das verzögert die Anwendung und ich bin mir nicht sicher, ob das jetzt funktionieren wird, da ich React-Select-Fast-Filter-Optionen verwende, da es anscheinend eine Art Indexierung durchführt. Gibt es eine Möglichkeit, die Optionsvariable zu filtern, um alle Instanzen der Picks-Prop zu finden und diese Optionen schnell zu deaktivieren?

Benutzeravatar von Saurabh Suman
Saurabh Suman

isDisabled={this.props.disabled}

Sie übergeben eine falsche Requisite. Für v2 ist die Requisite deaktiviert.

https://github.com/JedWatson/react-select/issues/145

  • Warum ist das nirgendwo dokumentiert?

    – Aluminium

    9. November 2019 um 5:30 Uhr

  • Es ist dokumentiert hier

    – Stuart Hallows

    18. August 2021 um 0:38 Uhr

Benutzeravatar von Alla Sorokina
Alla Sorokina

In React-Select v2:

  1. Fügen Sie Ihrem Array von Optionen eine Eigenschaft ‘disabled’ hinzu: ‘yes’ (oder ein beliebiges anderes Paar, um deaktivierte Optionen zu identifizieren)

  2. Verwenden Sie isOptionDisabled-Requisiten der React-Select-Komponente, um Optionen basierend auf der Eigenschaft „deaktiviert“ zu filtern

Hier ist ein Beispiel:

import Select from 'react-select';

const options = [
  {label: "one", value: 1, disabled: true},
  {label: "two", value: 2}
]

render() {

 <Select id={'dropdown'}
         options={options}
         isOptionDisabled={(option) => option.disabled}>
 </Select>

}

Weitere Informationen zu React-Select-Requisiten finden Sie in der Dokumente und hier ist ein Beispiel sie verweisen.

Benutzeravatar von Beu
Beu

Verwenden Sie Folgendes, um eine Option zu deaktivieren.

import Select from 'react-select';

render() {
  const options = [
    {label: "a", value: "a", isDisabled: true},
    {label: "b", value: "b"}
  ];

  return (
    <Select
      name="myselect"
      options={options}
    </Select>
  )
}

  • In der aktuellen Version von react-selectder Schlüssel ist isDisablednicht disabled.

    – Stéphane Laurent

    29. September 2019 um 3:17 Uhr

Die Leute machen es zu einem JavaScript-Problem. Ich sage, mach es zu einem CSS und vereinfache es. Benutze das

style={{display: month === '2' ? 'none' : 'block'}} 

So… Der Februar hat nur 28 Tage


const ComponentName =() => {

  const [month, setMonth] = useState("")
  const [day, setDay] = useState("")


return (
<>
<select 
onChange={(e) => {
    const selectedMonth = e.target.value;
    setMonth(selectedMonth)> 
   <option selected disabled>Month</option>
   <option value="1">January</option>
   <option value="2">February</option>
</select>

<select
onChange={(e) => {
    const selectedDay = e.target.value;
    setDay(selectedDay)> 
   <option selected disabled>Day</option>
   <option value="28">28</option>
   <option value="29" style={{display: month === '2' ? 'none' : 'block'}}>29</option>
   <option value="30">30</option>
</select>

</>
)

}

export default ComponentName;

1438320cookie-checkReagieren Deaktivierungsoptionen auswählen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy