reactjs - 匹配对象内函数的最佳方法 - React Native
问题描述
我想要的是在单击栏时调用 openMenu 函数,并在单击关闭图标时调用 closeMenu 函数。
我注意到icon.callFunc == openMenu总是错误的。日志
这是整个组件的来源。
const MenuBar = () => {
const onPressHandler = () => {
setIcon({
icon: icon.icon === 'bars'? "window-close" : 'bars',
callFunc: icon.callFunc == openMenu ? closeMenu : openMenu
});
console.log(icon.callFunc);
icon.callFunc()
}
const closeMenu = () => {
console.log("Closed");
}
const openMenu = () => {
console.log("Opened");
}
const [icon, setIcon] = useState({
icon: "bars",
callFunc: openMenu
})
return (
<TouchableOpacity
onPress={onPressHandler}>
<Icon
name={icon.icon}
size={25}
color="white"
solid
style={{ paddingLeft: 14, padding: 20 }} />
</TouchableOpacity>
);
}
有什么建议吗?
解决方案
根据@Tarukami 的建议,您可能应该使用状态来管理您的菜单是否显示。
如果你真的想使用这条路线,你可以尝试检查函数名称而不是它的引用,这可能会有所不同。
const onPressHandler = () => {
setIcon({
icon: icon.icon === "bars" ? "window-close" : "bars",
callFunc: icon.callFunc.name === "openMenu" ? closeMenu : openMenu
});
console.log(icon.callFunc);
icon.callFunc();
};
我建议然后在“componentDidMount”useEffect 中初始化您的图标。
useEffect(() => {
setIcon({
icon: "bars",
callFunc: openMenu
});
}, []);
完整代码如下
import React, { useState, useEffect } from "react";
const App = (props) => {
const closeMenu = () => {
console.log("Closed");
};
const openMenu = () => {
console.log("Opened");
};
const [icon, setIcon] = useState({});
useEffect(() => {
setIcon({
icon: "bars",
callFunc: openMenu
});
}, []);
const onPressHandler = () => {
setIcon({
icon: icon.icon === "bars" ? "window-close" : "bars",
callFunc: icon.callFunc.name === "openMenu" ? closeMenu : openMenu
});
console.log(icon.callFunc);
icon.callFunc();
};
return <div onClick={onPressHandler}>fokoff</div>;
};
export default App;
CodeSandbox,请注意控制台中的“打开”和“关闭”切换。
同样重要的是要注意 setIcon 方法是异步的,因此即使您将 icon.callFunc 设置为 openMenu,因为它是“closeMenu”,“closeMenu”仍将在 icon.callFunc() 处触发,并且 openMenu 将在下一次调用 onPressHandler 时触发。
推荐阅读
- java - Apache Flink Job 集群 rpc.address 绑定到 kubernetes 上的 localhost
- wordpress - WooCommerce 本地取货加挂
- java - 比较POST请求的参数
- ios - AVPlayer 播放断断续续,仅在使用 AVMutableComposition 时出现不良网络行为
- kotlin - Kotlin 中的属性观察器(向 ArrayList 添加元素时)
- permissions - Wix 自定义操作和刻录引导程序的权限问题
- html - 我想添加背景图片
- xamarin.forms - RelativeLayout 忽略 RelativeToView
- r - 如何组合 R 中同一日期拍摄的数据值?
- python-3.x - Pandas 如何对列进行分组、排序和排名