Wie kann dieser Fehler bezüglich des Status in React behoben werden?
P粉214176639
P粉214176639 2024-04-01 09:32:43
0
1
447

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粉214176639
P粉214176639

Antworte allen(1)
P粉557957970

这是 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 ( ); })}
); }
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage