我正在尝试使用 setState onPress 更新布尔值。根据按下的按钮,其他布尔值将分别设置为 false 或 true。
法典:
export default class SettingsScreen extends React.Component {
constructor(){
super();
this.state = {
isMeat: true,
isVegan: false,
isVegetarian: false,
}
}
render() {
return (
<View style={styles.container}>
<View style={styles.menuTop}>
<MenuButton navigation = {this.props.navigation} />
<Text style={styles.menuText}>Settings</Text>
</View>
<View style = {styles.body}>
<Button title="make it vegan!"
style = {styles.vegan}
onPress = {()=> {
this.setState({isMeat : false}, {isVegan: true}, {isVegetarian: false})
}}
>
make it vegan!
</Button>
<Button title="vegetarian please"
style = {styles.vegetarian}
onPress = {()=> {
this.setState({isMeat : false}, {isVegan: false}, {isVegetarian: true})
}}
>
vegetarian please
</Button>
<Button title="meat me up, Scotty!"
style = {styles.meat}
onPress = {()=> {
this.setState({isMeat : true}, {isVegan: false}, {isVegetarian: false})
}}
>
meat me up, Scotty!
</Button>
</View>
</View>
);
}
}
当我按下其中一个按钮时,我收到错误消息:Invariant Violation: Invalid argument passed as callback. Expected a function. Instead received: [object Object]
但我不明白为什么。
好的,让我们深入研究一下。其他答案在显示如何修复代码方面是正确的,但没有解释为什么它们是正确的。你说当你按下按钮时就会发生这种情况,所以它与onPress
有关。
onPress = {()=> {
this.setState({isMeat : false}, {isVegan: true}, {isVegetarian: false})
}}
这就是你在按钮中拥有的内容,特别是 setState(...) 在 thunk/箭头函数内部传递。thunk/arrow函数很好 - 它与onPress
所需的类型相匹配,这是一个函数,并在您按下按钮时setState
运行。目前为止,一切都好。
现在,让我们来看看 React 中setState
的文档,特别是它需要哪些参数。如果你看下面,它需要两个参数——一个更新程序(经典的setState对象)和一个回调。
setState(updater[, callback])
好的,让我们再看看你有什么,更仔细:
this.setState({isMeat : false}, {isVegan: true}, {isVegetarian: false})
因此,如果我们将您编写的内容与文档中的内容进行比较,您将{isMeat: false}
作为更新程序传递,{isVegan: true}
作为可选回调传递,{isVegetarian: false}
作为第三个完全未使用的参数传递。
{isMeat: false}
不是一个函数,因此您会收到看到的消息。这就是您看到不变违规的原因。
您可以使用setState
一次分配多个属性,并避免像前面的答案建议的那样进行多次调用,如下所示:
this.setState({
isMeat: false,
isVegan: true,
isVegetarian: false
})
也许是因为您将多个对象传递到 setState() 函数中?
尝试将它们切换为单个对象,仅更新要更改的属性。例如:
<Button title="make it vegan!"
style = {styles.vegan}
onPress = {()=> {
this.setState({isVegan: true})
}}
>
像这样它的工作原理:
<Button title="make it vegan!"
style = {styles.vegan}
onPress = {()=> {
this.setState({isMeat : false})
this.setState({isVegetarian : false})
this.setState({isVegan : true})
}}
>
make it vegan!
</Button>
我有错误,因为我没有向OneSignal.promptForPushNotificationsWithUserResponse
传递回调
在读取堆栈跟踪时找到它