javascript - Hvordan få tilgang til en offentlig metode fra en innpakket komponent ved bruk av TypeScript?
Jeg jobber med et React-prosjekt som bruker TypeScript. De pakket react-select-komponenten inn i en annen komponent. Den innpakkede komponenten er som følger:
import * as React from "react";
import Select from "react-select";
import { Props as SelectProps } from "react-select/lib/Select";
export interface SelectValue {
label: string;
value: string;
}
export interface SelectFieldProps<TValue> extends SelectProps<TValue> {
label?: string;
}
type GenericSelectField<TValue> = React.StatelessComponent<
SelectFieldProps<TValue>
>;
const SelectField: GenericSelectField<SelectValue> = ({
label = "",
...rest
}) => (
<div className="react-select-wrapper">
{label ? <span className="input__label">{label}</span> : null}
<Select classNamePrefix="react-select" {...rest} />
</div>
);
export default SelectField;
Jeg ønsker å få tilgang til metoden blur fra react-select:
React-select eksponerer to offentlige metoder:
...
blur() - gjør kontrollen uskarp programmatisk
Men jeg vet ikke hvordan jeg skal eksponere det i komponenten min, slik at jeg kan kalle det. Noen ideer?
Svar #1
Du kan bruke ref-egenskapen på Select-komponenten for å få en referanse til forekomsten av denne komponenten.
Da kan du kalle blur-metoden til denne instansen.
const SelectField: GenericSelectField<SelectValue> = ({label = "",...rest}) => {
const selectEl = React.useRef(null);
// this function could be a callback
function handleBlur() {
selectEl.current.blur();
}
return (
<div className="react-select-wrapper">
{label ? <span className="input__label">{label}</span> : null}
<Select ref={selectEl} classNamePrefix="react-select" {...rest} />
</div>
);
}
export default SelectField;
Hvis du trenger å få tilgang til blur-metoden utenfor SelectField-komponenten din, kan du bruke forwardRef for å referere til Select i stedet for SelectField.
const SelectField = (props, ref) => {
const {label = "",...rest} = props;
const selectEl = React.useRef(null);
return (
<div className="react-select-wrapper">
{label ? <span className="input__label">{label}</span> : null}
<Select ref={ref} classNamePrefix="react-select" {...rest} />
</div>
);
}
export default React.forwardRef(SelectField);
Da kan du kalle blur-metoden med referansen til SelectField-komponenten :
const ref = React.createRef();
<SelectField ref={ref} label=""/>;
ref.blur();
Svar #2
Hvis jeg forstår dette riktig, vil du utløse Select's blur() inne i SelectField.
Det finnes mange måter, for eksempel foreldre-barn-binding via props. Her er en diskusjon om dette:
Kall barne-metode fra forelder
