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

反应异步状态

沈永新
2023-03-14

我对状态同步有问题。当我点击编辑器的外部(想要关闭它),我想把实际的文本传回给父节点(回调函数)。但是当我在queryText之外单击时,状态似乎总是落后一步。(例如:如果编辑器内部有abc,我键入dCALLBACK: abc,我键入eCALLBACK: abcd等等)。

如果我在编辑器外单击,将出现queryText的实际状态,如何实现这一点?

import React, {useEffect, useState} from "react";
import AceEditor from "react-ace";

import "ace-builds/src-noconflict/mode-mysql";
import "ace-builds/src-noconflict/theme-eclipse";
import "./SQLEditor.css"


function SQLEditor({queryTab, active, callback}) {
    const [queryText, setQueryText] = useState(queryTab[active].content)

    //Setting a onClickListener somewhere else
    //This function is getting called when I click outside of the Editor
    function handleClickOutside() {
            document.removeEventListener("mousedown", handleClickOutside);
            console.log("CALLBACK:" + queryText) //Problem here
            callback(active, {content: queryText})
            setInEditor(false)
        }
    }

    //Implementing useEffect for debugging

    useEffect(() => {
        console.log(queryText); //Here I'm getting the right one.
    }
    return (
            <AceEditor
                mode="mysql"
                theme="eclipse"
                name="blah2"
                onChange={(newValue) => {
                    setQueryText(newValue) //Seting text to new value
                    console.log(newValue) //Getting the correct updated value
                }}
                fontSize={16}
            />
        </div>
    )
}
export default SQLEditor;

共有2个答案

王泓
2023-03-14

我以前从未见过useEffect返回整个组件,我无法让您的代码在沙箱中运行。然而,前几天我也遇到了同样的问题,我的状态是同步的。我是这样处理的

  1. 创建在单击时设置的useState钩子
  2. 将状态添加到您的use效应依赖列表
  3. 将单击操作移动到您的use效应方法

它可能看起来像这样

const [someVar, setSomeVar] = useState(null);

const handleClick = (e) => {
    setSomeVar(e.target.value); // or whatever
}

useEffect(() => {
    if (someVar != null) { // useEffect will get called on mount, so this logic is to ensure it will only get called if someVar is not equal to it's default value
        // implement handle click logic here
    }
}, [someVar]) // useEffect will get called each time someVar gets updated because we've added someVar to useEffect's dependencies
屈博
2023-03-14

在下面添加useffect

useEffect(() => {
    if(!inEditor){
        callback(active, {content: queryText});
        console.log(queryText);
    }
}, [inEditor, queryText])

并更新你的handleClickOut到,

function handleClickOutside() {
    document.removeEventListener("mousedown", handleClickOutside);
    setInEditor(false);
}
 类似资料:
  • 问题内容: 我正在尝试使用新的react useReducer API来获取一些数据,并停留在需要异步获取的阶段。我只是不知道如何:/ 如何将数据获取放置在switch语句中,或者这不是应该完成的方式? 我试图这样做,但它不能与异步一起工作;( 问题答案: 这是一个有趣的案例,示例没有涉及。我认为减速器不是异步加载的正确位置。来自Redux的心态,您通常会将数据加载到其他位置,例如以thunk,可

  • 问题内容: 我需要执行RestRequest并获取一些JSON,因此我不确定我的方法是否真正异步,因为使用此方法时,UI仍然有些冻结。 特别针对以下代码行: 真的不同步吗?因为它似乎阻塞了UI。您能告诉我如何使此函数正确异步吗? 问题答案: 似乎作为参数传递给的委托正在UI线程上执行。如果是这种情况,只需使用即可在线程池上运行委托。 是田野吗?在我看来,它应该是局部变量。另外,在反序列化json之

  • 有人能用一个真实的例子来帮助我理解React中的状态吗?

  • 问题内容: 在这里,我尝试设置为’hello’,然后打印它,但是状态似乎为空。当我刚刚使用更新状态时怎么办?设置为全局变量。 问题答案: 从reactjs文档中: 不会立即变异,但会创建待处理的状态转换。调用此方法后进行访问可能会返回现有值。 https://facebook.github.io/react/docs/component- api.html 您可以做的是将状态更新后传递给回调函数:

  • 问题内容: 保持不变,尽管我在函数中调度了一个动作: 输出为NO_AUTH(的初始值) 减速器: 知道为什么吗? 问题答案: 您当前正在直接在未映射到的componentDidMount内部调度: 这应该做的工作: 现在,这将获得authState: