我有一个数组列表,当我开始输入input
数组列表时,将过滤与value
相对应的内容。它可以工作,但是在输入字符后我将注意力集中在input
上。
我的代码:
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>
)
}
如果我直接输入
,则不会返回<Desktop/>
<input
type="text"
placeholder="Search"
value={searchTerm}
onChange={handleChange}
/>
<View style={{width:100, height:100, backgroundColor:'red'}}>
{results.map(item => (
<Text>{item}</Text>
))}
</View>
它将起作用。知道如何解决此问题吗?
任何建议或评论将不胜感激!
谢谢!
答案 0 :(得分:6)
Moving the Desktop
component outside of the MyApp
组件解决了此问题。这样做的主要原因是Desktop
组件在每次渲染时都会重新创建(每次键入),这将导致输入元素失去焦点。您也可以使用described in detail in the official React documentation的useCallback
和useMemo
钩子来缓解这种情况,但是在此示例中不需要它们。
另请参阅this answer on declaring other components within a component。
答案 1 :(得分:1)
使用输入的autoFocus={true}
属性
答案 2 :(得分:0)
您也可以使用输入内容的autoFocus
属性作为骇客技巧:
<input
autoFocus={true}
type="text"
placeholder="Search"
value={searchTerm}
onChange={handleChange}
/>
答案 3 :(得分:0)
问题是您在组件内部有一个组件。因此,当您的状态更改时,Desktop
组件会被重新初始化,这会导致input
失去焦点。我将两个组件合并为一个。如果您实际上需要Desktop
作为它自己的组件,那么您可能想在Desktop
之外声明MyPage
并将searchTerm, results, handleChange
作为props传递给Desktop
。 / p>
const MyPage = props => {
const [searchTerm, setSearchTerm] = useState("");
const isDesktop = useMediaQuery({ minWidth: 992 });
const results = !searchTerm
? people
: people.filter(person =>
person.toLowerCase().includes(searchTerm.toLocaleLowerCase())
);
const handleChange = event => {
setSearchTerm(event.target.value);
};
return (
<View style={{ width: "100%", justifyContent: "center" }}>
{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>
)}
</View>
);
};