Skip to content

出现2个编辑框 #320

@ningmengchongshui

Description

@ningmengchongshui
import React, {useEffect, useState, useCallback} from "react";
import {UnControlled as CodeMirror} from "react-codemirror2";
// // 脚本
import "codemirror/lib/codemirror.js";
// // 样式
import "codemirror/lib/codemirror.css";
// // 模型
import "codemirror/mode/properties/properties.js";
import "codemirror/mode/javascript/javascript.js";
import "codemirror/mode/yaml/yaml.js";
// // 主题
import "codemirror/theme/solarized.css";
import "codemirror/theme/xq-light.css";
// // 样式修改
import "@/assets/css/CodeMirror.css";

type CodeMirrorProps = {
  value: CodeMirror["props"]["value"];
  onChange?: CodeMirror["props"]["onChange"];
  mode?: CodeMirror["props"]["options"]["mode"];
};

const useTheme = () => {
  const [theme, setTheme] = useState("");
  const handleClassChange = useCallback(() => {
    const hasDarkClass = document.documentElement.classList.contains("dark");
    setTheme(hasDarkClass ? "solarized" : "xq-light");
  }, []);
  useEffect(() => {
    // 创建 MutationObserver 实例
    const observer = new MutationObserver(() => handleClassChange());
    // 开始监听 HTML 的 class 属性变化
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"],
    });
    // 初始化时检查当前主题
    handleClassChange();
    return () => {
      // 停止监听,防止内存泄漏
      observer.disconnect();
    };
  }, [handleClassChange]);

  return theme;
};

/**
 * CodeMirror 编辑器组件
 * @param props 组件属性
 * @returns JSX.Element
 */
const Code: React.FC<CodeMirrorProps> = React.memo((props) => {
  const {value, mode, onChange} = props;
  const theme = useTheme();
  return (
    <CodeMirror
      autoCursor={false}
      options={{
        mode: mode ?? "text/x-properties",
        theme: theme,
        lineNumbers: true,
      }}
      value={value}
      onChange={onChange}
    />
  );
});

export default Code;

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions