Javascript React-Native中的匿名函数
我是react native的初学者,最近,我在onPress属性中直接放置函数时遇到了一个无限循环。在某些情况下,直接函数调用是有效的,但在这种情况下,我必须使用匿名函数。 当我使用匿名函数时,到底发生了什么? 为什么它不会导致无限循环Javascript React-Native中的匿名函数,javascript,react-native,frontend,react-functional-component,Javascript,React Native,Frontend,React Functional Component,我是react native的初学者,最近,我在onPress属性中直接放置函数时遇到了一个无限循环。在某些情况下,直接函数调用是有效的,但在这种情况下,我必须使用匿名函数。 当我使用匿名函数时,到底发生了什么? 为什么它不会导致无限循环 export default function App() { const [state, setState] = useState({ searchQuery: "", active: f
export default function App()
{
const [state, setState] = useState({
searchQuery: "",
active: false,
data: []
});
function setSearchQuery(val) {
setState({...state, searchQuery: val});
}
function setActive(val) {
setState({...state, active: val});
}
function setData(val) {
setState({...state, data: val});
}
function keyboardDissmiss() {
setState({...state, active: false});
Keyboard.dismiss();
}
return (
<TouchableWithoutFeedback onPress={keyboardDissmiss}>
<SafeAreaView style={GlobalStyles.droidSafeArea}>
<View style={{height: 50,alignItems: 'center', backgroundColor: "blue"}}>
<Text>{state.searchQuery}</Text>
</View>
<View style={{flex:1}}></View>
<NavBar state={state.active} style={styles.container} onPress={() => setActive(true)}>
{state.active &&
<SearchBar
value={state.searchQuery}
onBlur={() => setActive(false)}
search={setSearchQuery}
/>}
</NavBar>
</SafeAreaView>
</TouchableWithoutFeedback>
);
}
导出默认函数App()
{
常量[状态,设置状态]=使用状态({
searchQuery:“”,
活动:错误,
数据:[]
});
函数setSearchQuery(val){
setState({…state,searchQuery:val});
}
功能设置激活(val){
setState({…状态,活动:val});
}
函数设置数据(val){
setState({…状态,数据:val});
}
函数键盘dissmiss(){
setState({…状态,活动:false});
键盘;
}
返回(
{state.searchQuery}
setActive(真)}>
{state.active&&
setActive(假)}
搜索={setSearchQuery}
/>}
);
}
我假设在您拥有onPress={setActive(true)}
之前,事件侦听器需要一个函数,您传递的值实际上是评估函数setActive的结果,而不是将setActive设置为事件侦听器
事件侦听器不能有任何参数,因此,为了使用值true调用setActive get,当按下元素时,需要将其包装到另一个不带参数的函数中(因此可以传递函数本身和函数的返回值)
它不必是箭头函数,您可以定义一个不带参数的setActiveToTrue
,只需调用setActive(true)
,但这太麻烦了,这就是箭头函数的用途
onPress={handleMethod(val)}
在上面的例子中,handleMethod函数在渲染发生时立即被调用,因此它遇到了一个无限循环
为了避免这种情况,您需要遵循以下步骤:
onPress={()=>handleMethod(val)}
如果没有任何参数要传递给handler方法,可以这样做
onPress={handleMethod}
onPress需要函数的引用,而不是函数调用