如何在渲染内部设置状态?

时间:2018-06-20 18:39:10

标签: javascript reactjs react-native

首先,我尝试检查用户的ID是否与数据库中的ID匹配。如果是这样,则为hasAppliedtoggle设置一个新状态,但是我收到以下警告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})
        }

任何人对此都有解决方案吗?

谢谢

1 个答案:

答案 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是存储在此组件还是父容器中。如果它在父容器的状态内可用,则您肯定希望将其作为道具传递。如果您对执行此操作有任何疑问,请告诉我!

使用我描述的方法,您可以在此处做出很好的解决方案。