我对状态同步有问题。当我点击编辑器的外部(想要关闭它),我想把实际的文本传回给父节点(回调
函数)。但是当我在queryText
之外单击时,状态似乎总是落后一步。(例如:如果编辑器内部有abc
,我键入d
,CALLBACK: abc
,我键入e
,CALLBACK: 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;
我以前从未见过useEffect返回整个组件,我无法让您的代码在沙箱中运行。然而,前几天我也遇到了同样的问题,我的状态是同步的。我是这样处理的
use效应
依赖列表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
在下面添加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: