suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wie kann dieser Fehler bezüglich des Status in React behoben werden?

Ich möchte eine einfache Reaktions-App erstellen, bei der, wenn ich die Eingabetaste für einen Block drücke, ein neuer Block unter diesem Block erscheint und der Rest dahinter unter dem neuen Block erscheint.

Aber wenn es mehrere Blöcke gibt und ich beim vorherigen Block die Eingabetaste drücke, verschwindet der letztere Block.

Ich verstehe nicht. Kann jemand auf diesen Fehler hinweisen?

Hier sind einige Codes und Bilder:

editablePage.tsx

import { useState } from "react";
import EditableBlock, { BlockType } from "../editableBlock";

export default function EditablePage() {
  const [blocks, setBlocks] = useState<BlockType[]>([
    { tag: "h1", content: "Welcome", position: 0 },
  ]);

  function addBlockHandler({ tag, position }: BlockType) {
    const nextPosition = position + 1;
    const newBlock: BlockType = {
      tag: tag,
      content: nextPosition.toString(),
      position: nextPosition,
    };
    console.log(blocks);
    const blocksBeforeNew = blocks.slice(0, nextPosition);
    const blocksAfterNew = blocks.slice(nextPosition).map((block) => {
      const copy = { ...block };
      copy.position += 1;
      return copy;
    });
    const updatedBlocks = blocksBeforeNew
      .concat(newBlock)
      .concat(blocksAfterNew);
    setBlocks(updatedBlocks);
  }

  return (
    <div>
      {blocks.map(({ tag, content, position }: BlockType) => {
        return (
          <EditableBlock
            key={position}
            tag={tag}
            position={position}
            content={content}
            addBlock={addBlockHandler}
          />
        );
      })}
    </div>
  );
}

editableBlock.tsx

import { useState } from "react";
import ContentEditable, { ContentEditableEvent } from "react-contenteditable";

type TagType = "h1" | "h2" | "h3" | "p";

export interface BlockType {
  tag: TagType;
  content: string;
  position: number;
}

export interface EditableBlockProps extends BlockType {
  addBlock: (currentBlock: BlockType) => void;
}

export default function EditableBlock({
  tag,
  content,
  position,
  addBlock,
}: EditableBlockProps) {
  const [text, setText] = useState<string>(content);

  const handleChange = (evt: ContentEditableEvent) => {
    setText(evt.target.value);
  };

  const handleKeyDown = (evt: React.KeyboardEvent<HTMLElement>) => {
    if (evt.key === "Enter") {
      evt.preventDefault();
      addBlock({ tag, content, position });
    }
  };

  return (
    <ContentEditable
      tagName={tag}
      html={text}
      onChange={handleChange}
      onKeyDown={handleKeyDown}
    />
  );
}

Vorher:

Nachdem Sie im ersten Block die Eingabetaste gedrückt haben:

Ich habe herausgefunden, dass der Fehler von Blöcken herrührt, aber ich verstehe nicht, warum das passiert.

P粉214176639P粉214176639244 Tage vor417

Antworte allen(1)Ich werde antworten

  • P粉557957970

    P粉5579579702024-04-02 08:08:07

    这是 react-contenteditable 的已知问题,请参阅 lovasoa/react-contenteditable# 161:

    在链接问题中提出的解决方法中,您可以尝试 该评论,它是 遗留 React 文档 > 如何从 useCallback 读取经常变化的值?:

    const useRefCallback = (
      value: ((...args: T) => void) | undefined,
      deps?: React.DependencyList
    ): ((...args: T) => void) => {
      const ref = React.useRef(value);
    
      React.useEffect(() => {
        ref.current = value;
      }, deps ?? [value]);
    
      const result = React.useCallback((...args: T) => {
        ref.current?.(...args);
      }, []);
    
      return result;
    };
    
    // Usage
    export function EditablePage() {
      // State, addBlockHandler function...
    
      const addBlock2 = useRefCallback(addBlockHandler);
    
      return (
        
    {blocks.map(({ tag, content, position }: BlockType) => { return ( ); })}
    ); }

    Antwort
    0
  • StornierenAntwort