我有一个编辑器App,它由3个元素组成:MenuBar,EditorContentdiv用于代码视图.MenuBar包含用于切换编辑器视图的所有按钮,包括在编辑器视图(RichText)和代码视图(Html)之间切换,这是通过使用

let [isCodeViewMode, setIsCodeViewMode] = useState(false);
useImperativeHandle(
    ref,
    () => ({
        getIsCodeViewMode: () => {
            return isCodeViewMode;
        },
    }),
    [isCodeViewMode]
);

并通过单击按钮来切换此值.在我的主应用程序中,我试图获取此状态的值,如果为假,则将d-none个类添加到代码视图中.以下是我在App中的代码:

    let menuBarRef = useRef<any>();
    let isCodeViewMode = menuBarRef.current?.getIsCodeViewMode();
    console.log(isCodeViewMode);

return (
        <div
            id="editor-container"
            className="ps-relative s-textarea p0 d-flex fd-column"
            style={{ width: "1500px", zIndex: 10 }}
        >
            <div className="js-sticky py6 bg-inherit btr-sm w100 ps-sticky t0 l0 z-nav s-editor-shadow js-plugin-container js-sticky">
                <MenuBar editor={editor as Editor} ref={menuBarRef} />
            </div>
            <div
                id="editor-content"
                className="overflow-scroll fl-grow1 outline-none p12 pt6 w100 s-prose js-editor ProseMirror"
            >
                <EditorContent editor={editor} />
            </div>

            <div
                className={`mw-editor__codemirror ${isCodeViewMode ? "" : "d-none"}`}
            >
                <textarea></textarea>
            </div>

问题是,虽然值isCodeViewModeMenuBar组件中被正确更新,但在App组件中却没有被更新.我应该做些什么更改才能使其正常工作?

推荐答案

考虑

更改ref.Current属性时,Reaction不会重新呈现 您的组件.Reaction不知道您何时更改它,因为Ref 是一个普通的JavaScript对象.

caveats

您需要向MenuBar组件添加一个函数,以通知isCodeViewMode值已更改:

MenuBar:

useEffect(() => {
   onViewChanged(isCodeViewMode)
}, [isCodeViewMode])

App:

const [editorView, setEditorView] = useState(false);

...
 <div className="js-sticky py6 bg-inherit btr-sm w100 ps-sticky t0 l0 z-nav s-editor-shadow js-plugin-container js-sticky">
   <MenuBar editor={editor as Editor} ref={menuBarRef} onViewChanged={setEditorView} />
 </div>

...

 <div className={`mw-editor__codemirror ${editorView ? "" : "d-none"}`} >
    <textarea></textarea>
 </div>

Reactjs相关问答推荐

有没有方法覆盖NextJS 14中的布局?

在react中向数组状态添加值时出错

条件索引路由

props 可以在Reaction中锻造吗?

避风港访问端口以包含Reaction应用程序

Reaction中的数据加载不一致

如何测试根据 prop 更改 CSS 属性的 useEffect 钩子?

Syncfusion:带有 TabItemsDirective 的选项卡组件不显示任何内容

每次状态更改时都会提交react 表单

Firebase Storage: 对象不存在图片上传路径错误

在react 中单击父级中的按钮时如何将数据从子级发送到父级?

如何读取 null 的属性?

useEffect 渲染没有依赖数组的组件

React Native PermissionsAndroid 不包括 READ_MEDIA_IMAGES.如何解决这个问题?

渲染的钩子比预期的少.这可能是由 React Hooks 中意外的提前返回语句引起的

如何从 extrareducer redux 更改对象中元素的值

理解 React 中的 PrevState

如何通过 Material Ui 设计将 Accordion 添加到您的 React 项目中?

多次响应获取发送请求

Map 函数只返回 Array 中的图像