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.
这是
react-contenteditable
的已知问题,请参阅 lovasoa/react-contenteditable# 161:在链接问题中提出的解决方法中,您可以尝试 该评论,它是 遗留 React 文档 > 如何从
useCallback
读取经常变化的值?: