Tengo una lista de matriz y cuando empiezo a escribir en la input
lista de matriz se filtrará correspondiente a la value
. Funciona pero pierdo el foco input
después de escribir un personaje.
Mi código:
const MyPage = (props) => {
const [searchTerm, setSearchTerm] = useState("");
const results = !searchTerm
? people
: people.filter(person =>
person.toLowerCase().includes(searchTerm.toLocaleLowerCase())
);
const handleChange = event => {
setSearchTerm(event.target.value);
};
const Desktop = ({ children }) => {
const isDesktop = useMediaQuery({ minWidth: 992 })
return (
isDesktop?
<View>
<input
type="text"
placeholder="Search"
value={searchTerm}
onChange={handleChange}
/>
<View style={{width:100, height:100, backgroundColor:'red'}}>
{results.map(item => (
<Text>{item}</Text>
))}
</View>
</View>
:null
)
}
return(
<View style={{width:'100%',justifyContent:'center'}}>
<Desktop/>
</View>
)
}
En lugar de regresar <Desktop/>
si pongo directamente
<input
type="text"
placeholder="Search"
value={searchTerm}
onChange={handleChange}
/>
<View style={{width:100, height:100, backgroundColor:'red'}}>
{results.map(item => (
<Text>{item}</Text>
))}
</View>
Funcionará. ¿Alguna idea de cómo solucionar este problema?
Cualquier consejo o comentario será apreciado!
¡Gracias por adelantado!
reactjs
react-native
kirimi
fuente
fuente
Respuestas:
Mover el
Desktop
componente fuera delMyApp
componente soluciona este problema. La razón principal de esto es que elDesktop
componente se recrea en cada render (cada vez que escribe), lo que hace que el elemento de entrada pierda su foco. También podría mitigar esto utilizando los ganchosuseCallback
yuseMemo
, ambos descritos en detalle en la documentación oficial de React , pero en este ejemplo no son necesarios.También vea esta respuesta al declarar otros componentes dentro de un componente .
fuente
Usar
autoFocus={true}
propiedad de la entradafuente
También como truco hacky puedes usar la
autoFocus
propiedad de tu entrada:fuente
El problema es que tiene un componente dentro de un componente. Entonces, cuando su estado cambia, el
Desktop
componente se reinicia , lo que haceinput
que pierda el foco. Fusioné ambos componentes en uno. Si realmente necesitaDesktop
ser su propio componente, entonces es posible que desee declararDesktop
fueraMyPage
y pasarsearchTerm, results, handleChange
como accesoriosDesktop
.fuente