[{"data":1,"prerenderedAt":669},["ShallowReactive",2],{"quirekit-doc:\u002Fapi\u002Feditor":3},{"id":4,"title":5,"body":6,"description":658,"extension":659,"keywords":660,"locale":661,"meta":662,"navigation":663,"order":69,"path":664,"section":665,"seo":666,"stem":667,"__hash__":668},"docs\u002Fapi\u002Feditor.zh-CN.md","Editor：状态、命令与生命周期",{"type":7,"value":8,"toc":651},"minimark",[9,24,28,56,181,200,212,216,219,372,389,392,482,496,513,516,519,606,609,612,615,637,640,647],[10,11,12,13,18,19,23],"p",{},"先通过",[14,15,17],"a",{"href":16},"\u002Fbuild","完整产品工程","理解这些方法如何共同工作。本页解释实际调用语义；完整源码签名在 ",[14,20,22],{"href":21},"\u002Fapi\u002Fcore","Core API","。",[25,26,27],"h2",{"id":27},"创建与状态",[10,29,30,34,35,38,39,38,42,38,45,38,48,51,52,55],{},[31,32,33],"code",{},"new Editor(options)"," 同时确定 Schema、命令与创建期扩展。常用 options 是 ",[31,36,37],{},"extensions","、",[31,40,41],{},"content",[31,43,44],{},"editable",[31,46,47],{},"element",[31,49,50],{},"mode","。在 SSR 阶段不传 DOM；需要视图时先安装对应 adapter，再显式挂载。更换不相容的 Schema 应创建新会话并迁移内容，不能靠 ",[31,53,54],{},"setOptions({ extensions })"," 热换整套模型。",[57,58,63],"pre",{"className":59,"code":60,"language":61,"meta":62,"style":62},"language-ts shiki shiki-themes github-light github-light github-dark","const editor = new Editor({ extensions, content, editable: true })\nconst view = editor.mount({ element, mode: 'canvas', id: 'main' })\nconst pm = editor.state.pm\nconst { from, to } = pm.selection\nconst document = editor.state.doc\n","ts","",[31,64,65,98,129,142,168],{"__ignoreMap":62},[66,67,70,74,78,81,84,88,92,95],"span",{"class":68,"line":69},"line",1,[66,71,73],{"class":72},"sDD9d","const",[66,75,77],{"class":76},"sUNQB"," editor",[66,79,80],{"class":72}," =",[66,82,83],{"class":72}," new",[66,85,87],{"class":86},"sgQzM"," Editor",[66,89,91],{"class":90},"sVPnS","({ extensions, content, editable: ",[66,93,94],{"class":76},"true",[66,96,97],{"class":90}," })\n",[66,99,101,103,106,108,111,114,117,121,124,127],{"class":68,"line":100},2,[66,102,73],{"class":72},[66,104,105],{"class":76}," view",[66,107,80],{"class":72},[66,109,110],{"class":90}," editor.",[66,112,113],{"class":86},"mount",[66,115,116],{"class":90},"({ element, mode: ",[66,118,120],{"class":119},"s-HEn","'canvas'",[66,122,123],{"class":90},", id: ",[66,125,126],{"class":119},"'main'",[66,128,97],{"class":90},[66,130,132,134,137,139],{"class":68,"line":131},3,[66,133,73],{"class":72},[66,135,136],{"class":76}," pm",[66,138,80],{"class":72},[66,140,141],{"class":90}," editor.state.pm\n",[66,143,145,147,150,153,156,159,162,165],{"class":68,"line":144},4,[66,146,73],{"class":72},[66,148,149],{"class":90}," { ",[66,151,152],{"class":76},"from",[66,154,155],{"class":90},", ",[66,157,158],{"class":76},"to",[66,160,161],{"class":90}," } ",[66,163,164],{"class":72},"=",[66,166,167],{"class":90}," pm.selection\n",[66,169,171,173,176,178],{"class":68,"line":170},5,[66,172,73],{"class":72},[66,174,175],{"class":76}," document",[66,177,80],{"class":72},[66,179,180],{"class":90}," editor.state.doc\n",[10,182,183,184,187,188,191,192,195,196,199],{},"外部 ",[31,185,186],{},"editor.state"," 是 QuireKit 状态包装，原生 PM 状态在 ",[31,189,190],{},".pm","。raw command 回调里的 ",[31,193,194],{},"state"," 则是共享事务支持的 PM facade，可直接读 ",[31,197,198],{},"state.selection","；不要把两种上下文混用。",[10,201,202,203,207,208,23],{},"创建选项、内容替换参数与全部事件的字段见",[14,204,206],{"href":205},"\u002Fapi\u002Foptions","配置与事件参考","；位置、光标和节点选区见",[14,209,211],{"href":210},"\u002Fconcepts\u002Fselection","选区概念",[213,214],"docs-api",{"name":215},"QuireEditorState",[25,217,218],{"id":218},"读写方法",[220,221,222,238],"table",{},[223,224,225],"thead",{},[226,227,228,232,235],"tr",{},[229,230,231],"th",{},"方法",[229,233,234],{},"输入 → 返回",[229,236,237],{},"使用与副作用",[239,240,241,255,268,281,294,307,320,333,346,359],"tbody",{},[226,242,243,249,252],{},[244,245,246],"td",{},[31,247,248],{},"getJSON()",[244,250,251],{},"无 → 规范 JSON",[244,253,254],{},"保存、下载、转换时显式序列化，不用于每次输入的控件刷新",[226,256,257,262,265],{},[244,258,259],{},[31,260,261],{},"getHTML()",[244,263,264],{},"无 → HTML 字符串",[244,266,267],{},"由当前扩展的 serializer 决定；不包含分页 Canvas 的像素",[226,269,270,275,278],{},[244,271,272],{},[31,273,274],{},"getText(options?)",[244,276,277],{},"文本序列化选项 → string",[244,279,280],{},"纯文本，可指定块间分隔符与节点序列化器",[226,282,283,288,291],{},[244,284,285],{},[31,286,287],{},"getMarkdown()",[244,289,290],{},"无 → string",[244,292,293],{},"由已安装的 Markdown 转换规则决定",[226,295,296,301,304],{},[244,297,298],{},[31,299,300],{},"commands.setContent(content, options)",[244,302,303],{},"相容内容与解析\u002F事件选项 → boolean",[244,305,306],{},"普通正文替换，不负责更新完整文档顶层属性",[226,308,309,314,317],{},[244,310,311],{},[31,312,313],{},"commands.replaceDocument(content, options)",[244,315,316],{},"完整文档 → boolean",[244,318,319],{},"文件恢复；连同顶层属性替换，选择回到开头，以 import origin\u002Fnon-history 提交",[226,321,322,327,330],{},[244,323,324],{},[31,325,326],{},"commands.insertContent(content)",[244,328,329],{},"文字\u002FHTML\u002FJSON → boolean",[244,331,332],{},"在当前选区插入，保留命令\u002F历史语义",[226,334,335,340,343],{},[244,336,337],{},[31,338,339],{},"isActive(name, attrs?)",[244,341,342],{},"Node\u002FMark 名与条件 → boolean",[244,344,345],{},"只读格式查询，不代表可执行或已保存",[226,347,348,353,356],{},[244,349,350],{},[31,351,352],{},"setEditable(value, emitUpdate?)",[244,354,355],{},"boolean → void",[244,357,358],{},"更新编辑策略，默认可发 update；宿主仍须更新自身权限控件",[226,360,361,366,369],{},[244,362,363],{},[31,364,365],{},"setOptions(options)",[244,367,368],{},"部分 options → void",[244,370,371],{},"更新实例选项；不要借此假定扩展重新编译或持久内容已迁移",[10,373,374,377,378,381,382,23,386,388],{},[31,375,376],{},"setContent"," \u002F ",[31,379,380],{},"replaceDocument"," 的非法内容策略应显式配置，恢复前仍需",[14,383,385],{"href":384},"\u002Fguide\u002Fcontent","独立校验",[31,387,261],{}," 需要 DOM document，服务端不能直接假定可用。命令 handled、真实 doc 变化与保存成功是三个不同结果。",[25,390,391],{"id":391},"命令的三种执行模式",[57,393,395],{"className":59,"code":394,"language":61,"meta":62,"style":62},"editor.commands.toggleBold()                  \u002F\u002F 立即执行\neditor.chain().focus().toggleBold().run()      \u002F\u002F 共享事务，run 提交\neditor.can().toggleBold()                     \u002F\u002F dry run，不 dispatch\neditor.can().chain().toggleBold().run()        \u002F\u002F dry-run chain\n",[31,396,397,412,441,458],{"__ignoreMap":62},[66,398,399,402,405,408],{"class":68,"line":69},[66,400,401],{"class":90},"editor.commands.",[66,403,404],{"class":86},"toggleBold",[66,406,407],{"class":90},"()                  ",[66,409,411],{"class":410},"sqmzS","\u002F\u002F 立即执行\n",[66,413,414,417,420,423,426,428,430,432,435,438],{"class":68,"line":100},[66,415,416],{"class":90},"editor.",[66,418,419],{"class":86},"chain",[66,421,422],{"class":90},"().",[66,424,425],{"class":86},"focus",[66,427,422],{"class":90},[66,429,404],{"class":86},[66,431,422],{"class":90},[66,433,434],{"class":86},"run",[66,436,437],{"class":90},"()      ",[66,439,440],{"class":410},"\u002F\u002F 共享事务，run 提交\n",[66,442,443,445,448,450,452,455],{"class":68,"line":131},[66,444,416],{"class":90},[66,446,447],{"class":86},"can",[66,449,422],{"class":90},[66,451,404],{"class":86},[66,453,454],{"class":90},"()                     ",[66,456,457],{"class":410},"\u002F\u002F dry run，不 dispatch\n",[66,459,460,462,464,466,468,470,472,474,476,479],{"class":68,"line":144},[66,461,416],{"class":90},[66,463,447],{"class":86},[66,465,422],{"class":90},[66,467,419],{"class":86},[66,469,422],{"class":90},[66,471,404],{"class":86},[66,473,422],{"class":90},[66,475,434],{"class":86},[66,477,478],{"class":90},"()        ",[66,480,481],{"class":410},"\u002F\u002F dry-run chain\n",[10,483,484,485,487,488,491,492,495],{},"自定义 raw command 只修改提供的 ",[31,486,226],{},"，需要时检查 ",[31,489,490],{},"dispatch","；不得在 ",[31,493,494],{},"can()"," 触发网络、弹窗或写真实状态。返回 false 不应被 UI 解读为成功。",[10,497,498,500,501,504,505,508,509,23],{},[31,499,494],{}," 不是权限检查，",[31,502,503],{},"setEditable(false)"," 也不会禁止所有程序命令。",[31,506,507],{},"run()"," 返回 false 不会自动撤销其他链式步骤；具体边界见",[14,510,512],{"href":511},"\u002Fconcepts\u002Fcommands","命令与事务",[213,514],{"name":515},"CommandProps",[25,517,518],{"id":518},"挂载与退出",[220,520,521,533],{},[223,522,523],{},[226,524,525,527,530],{},[229,526,231],{},[229,528,529],{},"返回",[229,531,532],{},"生命周期",[239,534,535,548,568,581,594],{},[226,536,537,542,545],{},[244,538,539],{},[31,540,541],{},"mount({ element, mode, id?, editable? })",[244,543,544],{},"mounted view",[244,546,547],{},"首次为主视图，再次为额外视图，额外视图默认只读",[226,549,550,555,557],{},[244,551,552],{},[31,553,554],{},"mount(element)",[244,556,544],{},[244,558,559,560,563,564,567],{},"兼容简写选择 ",[31,561,562],{},"html","，不等于原生 ",[31,565,566],{},"dom","；产品教程使用显式对象",[226,569,570,575,578],{},[244,571,572],{},[31,573,574],{},"changeMode(mode, options?)",[244,576,577],{},"替换后的主视图",[244,579,580],{},"保留 Core 文档与历史，需要提前注册该模式",[226,582,583,588,591],{},[244,584,585],{},[31,586,587],{},"unmount()",[244,589,590],{},"void",[244,592,593],{},"释放主视图和额外视图，保留 Core 状态",[226,595,596,601,603],{},[244,597,598],{},[31,599,600],{},"destroy()",[244,602,590],{},[244,604,605],{},"最终销毁；之后不能继续发命令或挂载",[213,607],{"name":608},"QuireEditorMountOptions",[213,610],{"name":611},"QuireEditorChangeModeOptions",[25,613,614],{"id":614},"事件订阅",[10,616,617,620,621,624,625,628,629,632,633,636],{},[31,618,619],{},"on('transaction', listener)"," 在事务接受后观察规范状态；",[31,622,623],{},"update"," 用于内容变化，",[31,626,627],{},"selectionUpdate"," 用于选区，",[31,630,631],{},"focus\u002Fblur"," 只在需要焦点事实时订阅。始终用相同函数引用 ",[31,634,635],{},"off","，并在销毁前释放宿主订阅。默认示例只用 transaction 做一次有界控件投影，另有保存状态通知。",[213,638],{"name":639},"QuireEditorTransactionEvent",[10,641,642,643,23],{},"实际事件处理、dirty 与并发保存见",[14,644,646],{"href":645},"\u002Fbuild\u002Fcommands","session 完整实现",[648,649,650],"style",{},"html pre.shiki code .sDD9d, html code.shiki .sDD9d{--shiki-default:#D73A49;--shiki-light:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sUNQB, html code.shiki .sUNQB{--shiki-default:#005CC5;--shiki-light:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sgQzM, html code.shiki .sgQzM{--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVPnS, html code.shiki .sVPnS{--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s-HEn, html code.shiki .s-HEn{--shiki-default:#032F62;--shiki-light:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sqmzS, html code.shiki .sqmzS{--shiki-default:#6A737D;--shiki-light:#6A737D;--shiki-dark:#6A737D}",{"title":62,"searchDepth":100,"depth":100,"links":652},[653,654,655,656,657],{"id":27,"depth":100,"text":27},{"id":218,"depth":100,"text":218},{"id":391,"depth":100,"text":391},{"id":518,"depth":100,"text":518},{"id":614,"depth":100,"text":614},"按开发任务查参数、返回值、状态形状与生命周期副作用。","md",null,"zh-CN",{},true,"\u002Fapi\u002Feditor","API 与参考",{"title":5,"description":658},"api\u002Feditor.zh-CN","HLMpFyban3MOtv7kqHguHd7ZBUIBaH3CgE5yDJP8M5M",1793045209084]