当前位置: 首页 > 面试题库 >

为什么React无法正确呈现我的组件状态?

施文彬
2023-03-14
问题内容

我已经尝试了两个类组件:

class Foo extends React.Component {
    x = 3;
    componentDidMount () {
        fetch(apiURL).then(() => {
            x = 5;                
        });
    }

    render () {  
        return <div>{x}</div>;
    }
}

并使用功能组件:

let x = 3;
fetch(apiURL).then(() => {
    x = 5;                
});

const Foo = () => <div>{x}</div>;

页面上显示的x值永远不会改变,或者似乎是随机改变的。是什么赋予了?


问题答案:

当您告诉React某些更改时,React仅知道使用其为状态管理提供的功能来重新渲染:

class Foo extends React.Component {
    // In class components state must be an object
    state = {
        x: 3,
    };
    componentDidMount () {
        fetch(apiURL).then(() => {
            // Note that we change state with the setState method.
            this.setState({ x: 5 });               
        });
    }

    render () {
        return <div>{this.state.x}</div>;
    }
}

另外,功能组件应该是 组件(没有副作用),因此要更新它们,React会给我们带来麻烦:

const Foo = () => {
    const [x, setX] = useState(3);
    useEffect(() => {
        fetch(apiURL).then(() => {
            // We use the setter returned from useState.
            setX(5);               
        });
    }, []);

    return <div>{x}</div>;
}

因此,您不能只是分配给一个变量并期望React知道:您必须使用它的更新函数,以便它知道需要将数据重新呈现到页面。



 类似资料:
  • 问题内容: 我做了一个将我的JFrame设置为全屏的JButton: 这是JFrame: 为什么当我运行游戏并全屏选择JButton时,JPanel渲染不正确? 我的意思是说,在我的黑色背景上有一个很大的灰色JPanel,没有JButton呈现。 问题答案: 问题是您正在创建多个不同的实例,但您完全不知道屏幕上实际可见哪个实例。 ,创建实例和调用,它创建的实例,以及......别急,我们,为什么我

  • 问题内容: 我正在使用 JSF 2.1.8 实现Web应用程序,而 ui:include 标记存在问题。我有这个代码 该 navigationManagerSystem bean是JSF会话管理,在这一段代码首先呈现的,它应该是显示包括路径内容。如果我以这样的常量执行此操作,则包括这些工作,但是如果我将其放入变量中则不行,即使我已经看到变量在屏幕打印之前就保持了该值。我不知道它是否可以与包含/sy

  • 我有两个组件,一个包含复选框,另一个是按钮。其目的是前一个组件让我们称之为行,如果复选框被更改,编辑按钮将自动启用,如果复选框不再勾选,编辑按钮将自动禁用。我本来打算添加onclick事件监听器,但最近我读了一些关于状态的文章,认为这可能是一个更好的主意。 这是我的按钮: 这是我的行组件 我的主应用程序呈现可能是这样的 我的意图是,如果单击了复选框,检查所有复选框的状态以确保选中了某些内容,如果选

  • 我一直在尝试一些组件,这些组件执行react-cache风格的事情,并在render方法中执行web服务调用,将promise抛出到React.Suspense组件,并在数据存在时重新呈现。它们调用web服务,检查响应,并根据响应呈现或抛出错误到错误边界。我注意到,每当在组件中抛出错误时,它都会呈现两次。第一次callstack看起来正常,第二次callstack包括对invokeGuardedC

  • 我通过使用map函数迭代来显示我的状态,这是一个数组。此外,我有一个按钮,在点击反转数组。 我认为我想做什么是相当明显的。但这对我不起作用,我不知道为什么。我必须单击两次来完成第一次还原,出现了奇怪的情况,即呈现的数组和Chrome中React开发工具在组件状态中显示的数组不匹配。 我无法解释这种行为。我开始认为这与我从道具中获得阵列有关,但我真的不知道。有什么想法吗?

  • 我正在尝试一个用户界面3.5,所有组件都工作正常,除了selectonemenu,它不能正确渲染。 它的文本字段在选择任何下拉字段时不显示。 我不能发布图片,因为我没有那么多的声誉 代码 屏幕拍摄 我怎样才能解决这个问题?