当前位置: 首页 > 知识库问答 >
问题:

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

康弘义
2023-03-14

首先,我尝试检查用户的id是否与DB中的ID匹配。如果是这样,那么为hasAppldedtoggle设置一个新状态,但我收到以下警告在现有状态转换期间无法更新(例如在渲染或其他组件中)...

我甚至试着调用一个函数,它在render之外,并且说了同样的话。但是如果我从按钮组件调用render byonPress={}方法之外的函数,那么一切都很好。但是在这种情况下,当用户访问页面时,我需要首先检查此项,如果已应用返回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个答案

东门理
2023-03-14

使用React,您不应该也不需要在render()中设置state。

我建议将状态检查放在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,则不会呈现任何内容(null)。

最后一件事,因为我不知道在这种情况下你的组件/容器结构是什么,所以我不确定你引用的userID是存储在这个组件还是父容器中。如果它在父容器的状态下可用,您肯定希望将其作为道具传递下去。如果你有任何关于实现这个的问题,让我知道!

使用我描述的方法,您可以在这里找到一个很好的解决方案。

 类似资料:
  • 问题内容: 我需要能够在文本区域(即,,,)中呈现一些HTML标记,但是textareas仅将其内容解释为文本。有没有一种简单的方法,而无需依赖外部库/插件(我正在使用jQuery)?如果没有,您知道我可以使用任何jQuery插件吗? 问题答案: 这与不可能。您正在寻找的是一个内容可编辑的 div,这很容易做到:

  • 问题内容: 我被困住了。我在单独的文件上有几个单独的组件。如果我在main.jsx中渲染它们,如下所示: 一切正常,但我想知道这是否是一个好习惯?也许可以做一些像只有一个ReactDom.render这样的事情: 我尝试了各种LandingPageBox变量,以某种方式包括了其他两个组件,但没有运气。它们有时在页面外渲染,依此类推。我认为应该看起来像这样: 但是此代码仅呈现PageTop和Page

  • 问题内容: 我需要能够在文本区域(即)中呈现一些HTML标记,但是textareas仅将其内容解释为文本。有没有一种简单的方法,而无需依赖外部库/插件(我正在使用jQuery)?如果没有,您知道我可以使用任何jQuery插件吗? 问题答案: 这与不可能。您正在寻找的是一个内容可编辑的 div,这很容易做到: jsFiddle

  • 页面渲染设置 页面渲染功能开启后能自动加载出网页中的ajax内容 服务器中需要安装谷歌浏览器,支持linux、win系统 centos7安装chrome的命令: wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm yum localinstall google-chrome-stable_

  • 我在Javascript上制作了一个程序,创建了mandelbrot分形,并在html画布上绘制了它。我的渲染方法是每行迭代,从0到500像素,然后简单地循环创建500行500像素。 我的问题是,当我渲染它的时候,(用更多的放大率刷新页面),它需要很多时间。300倍的放大率大约在30秒内工作,但5000倍需要一个多小时。请帮忙。我想有非常高的放大率和图像加载迅速。 我通过一个下载的文件运行我的程序

  • 问题内容: 我有以下代码: 我想做的是使用base64编码在JEditorPane上呈现图像以存储图像。它不必是base64,但这是我尝试在JEditorPane上呈现HTML内容时所获得的,但是我需要使用BufferedImage上的图像(由应用程序生成),并且,确实希望不必将映像保存到硬盘中的文件中。 我能以某种方式在Swing组件中显示BufferedImage以及HTML(在IMG标签给定