首先,我尝试检查用户的ID是否与数据库中的ID匹配。如果是这样,则为hasApplied
和toggle
设置一个新状态,但是我收到以下警告Cannot update during an existing state transition (such as within 'render' or another component)...
我什至试图调用在render之外的函数,并说同样的话。但是,如果我从按钮组件通过onPress={}
方法在render外部调用该函数,那么一切都很好。但是在这种情况下,我需要在用户访问该页面时首先进行检查,如果hasApplied
返回false
,然后使用按钮
render() {
let { hasApplied } = this.state;
let { toggle } = this.state;
let matchUserId = [];
const textValue = toggle ? 'APPLIED' : 'APPLY NOW';
const buttonBg = toggle ? '#848d95' : '#34ed1c';
const buttonState = toggle ? 'false' : 'true';
const { navigation } = this.props;
const { goBack } = this.props.navigation;
const { jobBusiness, locationBusiness } = this.props.navigation.state.params;
let { user, location, job, data, business } = this.props.navigation.state.params;
// Check the available applied ids and concatenate objects in Array
// Check if user_id match any of appliedUserId
if (!hasApplied) {
job.applied.map(o => {
matchUserId.push(o.user_id);
});
const resultUserId = [].concat.apply([], matchUserId);
hasApplied = resultUserId.includes(this.props.user_id)
// this.onButtonPress()
this.setState({hasApplied: true, toggle: true})
}
任何人对此都有解决方案吗?
谢谢
答案 0 :(得分:1)
使用React,您不需要,也不需要在render()中设置setState。
我建议将您的状态检查放在componentDidMount()中。这样可以保证在呈现组件时执行componentDidMount()函数中的任何代码,从而使您可以执行检查,设置程序等。
基本上,请执行以下操作:
componentDidMount() {
// check if the user ID matches what's in the database
// if the above is true, setState as needed
}
请注意,您可以使用三元表达式在React渲染中显示或不显示内容。让我举个例子:
{ (this.state.whateverStateYouWantToCheck)
? <div className="class-of-your-choice">Content you wish to display.</div>
: null }
在上面,如果this.state.whateverStateYouWantToCheck为true,则'?'之后的代码将被渲染。如果为false,则不会呈现任何内容(空值)。
最后一件事,由于在这种情况下我不知道您的组件/容器结构是什么,因此我不确定您要引用的userID是存储在此组件还是父容器中。如果它在父容器的状态内可用,则您肯定希望将其作为道具传递。如果您对执行此操作有任何疑问,请告诉我!
使用我描述的方法,您可以在此处做出很好的解决方案。