[{"data":1,"prerenderedAt":15598},["ShallowReactive",2],{"posts":3},[4,338,5893,6221,7117,8715,8949,9105,12865,13919,15222,15329],{"id":5,"title":6,"body":7,"date":328,"description":329,"extension":260,"meta":330,"navigation":331,"path":332,"seo":333,"stem":334,"tags":335,"__hash__":337},"content/life/一个从零实现的个人博客.md","一个从零实现的个人博客",{"type":8,"value":9,"toc":308},"minimark",[10,13,17,29,40,43,46,49,72,76,79,82,95,99,102,105,108,111,117,124,128,133,138,149,155,160,164,167,195,199,209,216,219,222,225,245,248,252,255,285,288,296,304],[11,12,6],"h1",{"id":6},[14,15,16],"h2",{"id":16},"起因",[18,19,20,21,25,26,28],"p",{},"我也有经常写笔记的习惯，经常使用",[22,23,24],"code",{},"Obsidian","，但写法、内容几乎都是面向我自己。我也有想过把内容分享出来，但在之前想完整复刻",[22,27,24],{},"的关系图谱很困难，一拖再拖就没有实现。",[18,30,31,32,39],{},"年后，在投递的这段时间里，我难免焦虑，不写代码快有两个月了，对常用的东西也会手生，所以我尝试开发了",[33,34,38],"a",{"href":35,"rel":36},"https://github.com/L0st1/ai-chat",[37],"nofollow","ai-chat","，整个过程很流畅。在出租屋里写代码的时候我也不再焦虑，那干脆就再开发一个博客项目吧",[18,41,42],{},"这大概就是我为什么没有直接使用一个博客框架的原因，博客一共分为三个部分，技术文章、我的思考、我的日常",[14,44,45],{"id":45},"选型",[18,47,48],{},"我并不是像正常的产品需求一样进行拆分，我没有原型，只是将需求的内容一点一点补充",[50,51,52,56,59,62,65],"ul",{},[53,54,55],"li",{},"我的博客部署在哪里",[53,57,58],{},"如何将md文档直接渲染成html，我如果想在md中写一些样式怎么实现",[53,60,61],{},"如何在文档提交后，就立即更新",[53,63,64],{},"是否需要制定版本与回滚、访问统计、性能指标",[53,66,67,71],{},[68,69,70],"del",{},"是否需要ESLint、CommitLint","肯定需要",[73,74,75],"h3",{"id":75},"部署",[18,77,78],{},"最初我的想法是托管在GitHub，为此我甚至准备好了Actions；但后来我切换到了Vercel\nGithub Pages仅支持静态HTML，如果以后想添加更丰富的内容就很困难\nVercel开箱即用，包含完整的CI/CD、数据收集、日志、性能指标（回滚需要Pro），也支持SSR、Serverless",[73,80,81],{"id":81},"渲染",[18,83,84,85,88,89],{},"简单来说就是md的渲染，",[22,86,87],{},"@nuxt/content","，毋庸置疑\n那如果想在md中写写一些样式呢，可以直接写Vue组件，也可以使用 ",[90,91,94],"tooltip",{"text":92,"tone":93},"Markdown Components","info","MDC",[73,96,98],{"id":97},"cicd","CI/CD",[18,100,101],{},"CI/CD依靠Vercel即可",[14,103,104],{"id":104},"遇到过的问题",[73,106,107],{"id":107},"文章的名称是纯中文字符时路由出错",[18,109,110],{},"像往常一样推送后发现很多文章都显示同样内容，并且路由都是父级路由，再发现它们都是纯中文命名",[112,113,114],"blockquote",{},[18,115,116],{},"Nuxt Content 用 slugify 生成 path，默认会去掉非 ASCII 字符，导致纯中文文件名被 slug 成空串，多个文件都变成 /engineering 或 /thinking，产生冲突。数据库显示 stem 仍正确，但 path 错误。正在向 nuxt.config.ts 添加 content:file:afterParse 钩子，根据 stem 恢复正确的 path。",[18,118,119,120,123],{},"所以每篇文章现在都添加了属性",[22,121,122],{},"path","作为它们的路由",[73,125,127],{"id":126},"lcp异常","LCP异常",[129,130,132],"h5",{"id":131},"fcpttfb","FCP、TTFB",[112,134,135],{},[18,136,137],{},"以下数据均为我在同一设备访问页面产生",[18,139,140,145],{},[141,142],"img",{"alt":143,"src":144},"优化前：FCP、LCP、TTFB 等指标（其一）","/img/blog-fcp-lcp-metrics-before-1.png",[141,146],{"alt":147,"src":148},"优化前：FCP、LCP、TTFB 等指标（其二）","/img/blog-fcp-lcp-metrics-before-2.png",[18,150,151],{},[152,153,154],"em",{},"当前 FCP 偏高的本质原因不是页面慢，而是卡在 1.8s 的阈值附近。从数据上看，FCP 和 LCP 完全重合，说明页面没有提前渲染任何可见内容，而是依赖主内容一次性渲染。同时 TTFB 达到 1s，也显著推迟了首屏时间。",[18,156,157],{},[152,158,159],{},"优先降低 TTFB，再让 FCP 和 LCP 解耦，从而把 FCP 降低至 1.8s 以内。",[129,161,163],{"id":162},"解决方案","解决方案：",[18,165,166],{},"TTFB指标表现差通常因为SSR 渲染、API（服务器处理请求并生成响应的时间）、CDN命中率、网络延迟",[50,168,169,188],{},[53,170,171,174,175,177,178,181,182,184,185],{},[22,172,173],{},"/","不进行SSR，",[22,176,173],{},"进行预渲染 —— ",[22,179,180],{},"/blog/**","已预渲染，但首页",[22,183,173],{},"仍为 SSR，每次请求都会在 Vercel 上执行 serverless +",[22,186,187],{},"queryCollection",[53,189,190,191,194],{},"降低首屏CSS —— 项目将 KaTeX 全局 CSS 在 ",[22,192,193],{},"app.vue"," 中加载，可改移到仅文章页",[129,196,198],{"id":197},"效果如下","效果如下：",[18,200,201,205],{},[141,202],{"alt":203,"src":204},"优化后：Vercel 性能指标（其一）","/img/blog-vercel-performance-after-1.png",[141,206],{"alt":207,"src":208},"优化后：Vercel 性能指标（其二）","/img/blog-vercel-performance-after-2.png",[18,210,211,212],{},"因为vercel当前统计数据是统计值，固有所偏差\n",[141,213],{"alt":214,"src":215},"Vercel 分析数据说明","/img/blog-vercel-analytics-variance.png",[73,217,218],{"id":218},"字体问题",[18,220,221],{},"我本地使用霞鹜文楷，我希望我的博客也是霞鹜文楷",[18,223,224],{},"有两种方案：",[50,226,227,242],{},[53,228,229,230,235,236,241],{},"本地提供woff2，构建时把字体打进产物，预渲染出的 HTML 里只引用 CSS，但这样会导致资源的体积变大（尽管去采用专门提供给Web的集合，如",[33,231,234],{"href":232,"rel":233},"https://github.com/CMBill/lxgw-wenkai-web",[37],"霞鹜文楷 网络字体仓库","，",[33,237,240],{"href":238,"rel":239},"https://www.npmjs.com/package/@callmebill/lxgw-wenkai-web?activeTab=code",[37],"体积","仍然不小）",[53,243,244],{},"引用CDN，这仍会导致需要加载的资源体积变大，并且要考虑公共CDN的稳定性，且会丧失Vercel的优势",[18,246,247],{},"目前没有较好的思路，或许可以采用性能指标来衡量哪种效果更好，又或许是我想得不对，等待后续验证",[73,249,251],{"id":250},"mdc中使用原子类不生效问题","MDC中使用原子类不生效问题",[18,253,254],{},"比如",[256,257,262],"pre",{"className":258,"code":259,"language":260,"meta":261,"style":261},"language-md shiki shiki-themes github-light github-dark","::blur-reveal{class=\"pt-8\" :duration=\"0.75\"}\n一些填充内容\n::\n","md","",[22,263,264,273,279],{"__ignoreMap":261},[265,266,269],"span",{"class":267,"line":268},"line",1,[265,270,272],{"class":271},"sVt8B","::blur-reveal{class=\"pt-8\" :duration=\"0.75\"}\n",[265,274,276],{"class":267,"line":275},2,[265,277,278],{"class":271},"一些填充内容\n",[265,280,282],{"class":267,"line":281},3,[265,283,284],{"class":271},"::\n",[18,286,287],{},"因为UnoCSS不会扫描未被import到构建流程的文件，所以md文章中样式不会被扫描",[18,289,290,291],{},"在UnoCSS的配置里添加即可，目的是告诉UnoCSS去扫描md文件中的原子类，",[33,292,295],{"href":293,"rel":294},"https://github.com/L0st1/blog/blob/main/uno.config.ts",[37],"源码",[256,297,302],{"className":298,"code":300,"language":301},[299],"language-text","  content: {\n    filesystem: ['content/**/*.md'],\n  },\n","text",[22,303,300],{"__ignoreMap":261},[305,306,307],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .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);}",{"title":261,"searchDepth":309,"depth":309,"links":310},4,[311,312,317],{"id":16,"depth":275,"text":16},{"id":45,"depth":275,"text":45,"children":313},[314,315,316],{"id":75,"depth":281,"text":75},{"id":81,"depth":281,"text":81},{"id":97,"depth":281,"text":98},{"id":104,"depth":275,"text":104,"children":318},[319,320,326,327],{"id":107,"depth":281,"text":107},{"id":126,"depth":281,"text":127,"children":321},[322,324,325],{"id":131,"depth":323,"text":132},5,{"id":162,"depth":323,"text":163},{"id":197,"depth":323,"text":198},{"id":218,"depth":281,"text":218},{"id":250,"depth":281,"text":251},"2026-04-17","记录我从零开始开发博客项目，逐渐认识Nuxt，以及遇到的问题",{},true,"/life/blog-trade-off",{"title":6,"description":329},"life/一个从零实现的个人博客",[336],"Others","b-5-W1c5KMQLHQ7yVxrSCHuaMgx0EXz1Lxo7TVs6CMc",{"id":339,"title":340,"body":341,"date":328,"description":5885,"extension":260,"meta":5886,"navigation":331,"path":5887,"seo":5888,"stem":5889,"tags":5890,"__hash__":5892},"content/thinking/组件封装的思考-下.md","组件封装的思考-下",{"type":8,"value":342,"toc":5883},[343,346,349,352,355,404,407,410,3301,3304,3314,3317,3320,3451,3458,5050,5053,5880],[11,344,345],{"id":345},"一个弹窗组件",[18,347,348],{},"上篇提到，封装不光是重用，更多考虑降低单文件的复杂度",[18,350,351],{},"下面的这个业务组件将穿梭框、筛选、请求、确认的功能全部封装在一个文件中",[18,353,354],{},"调用非常简单，父组件无需关注子组件内部，实现了整个局部业务的拆离",[256,356,360],{"className":357,"code":358,"language":359,"meta":261,"style":261},"language-ts shiki shiki-themes github-light github-dark","dialog.open({\n  defaultSelected,\n  context,\n  onConfirm(selected) {}\n})\n","ts",[22,361,362,374,379,384,399],{"__ignoreMap":261},[265,363,364,367,371],{"class":267,"line":268},[265,365,366],{"class":271},"dialog.",[265,368,370],{"class":369},"sScJk","open",[265,372,373],{"class":271},"({\n",[265,375,376],{"class":267,"line":275},[265,377,378],{"class":271},"  defaultSelected,\n",[265,380,381],{"class":267,"line":281},[265,382,383],{"class":271},"  context,\n",[265,385,386,389,392,396],{"class":267,"line":309},[265,387,388],{"class":369},"  onConfirm",[265,390,391],{"class":271},"(",[265,393,395],{"class":394},"s4XuR","selected",[265,397,398],{"class":271},") {}\n",[265,400,401],{"class":267,"line":323},[265,402,403],{"class":271},"})\n",[18,405,406],{},"这里嵌入了交互演示",[408,409],"grading-teacher-dialog-article-demo",{},[256,411,415],{"className":412,"code":413,"language":414,"meta":261,"style":261},"language-vue shiki shiki-themes github-light github-dark","\u003Cscript setup lang=\"ts\">\nimport { getSubjectBySchoolIdList, getTeacherBySchoolIdList } from '@/api/grading'\nimport { useUserStore } from '@/store'\n\nexport type TeacherItem = {\n  tenantUserId: string\n  userName?: string\n  userPhone?: string\n  schoolName?: string\n}\n\ntype SubjectOption = {\n  id: string\n  name: string\n}\n\nconst userStore = useUserStore()\n\n// 弹窗显示状态\nconst visible = ref(false)\n\n// 当前操作的上下文数据（由调用方传入）\nconst context = ref\u003Cany>(null)\n\n// 确认回调\nlet confirmCallback: ((selected: TeacherItem[], ctx: any) => void) | null = null\n\n// 筛选条件\nconst subjectFilter = ref('')\nconst searchKeyword = ref('')\n\n// 科目选项\nconst subjectOptions = ref\u003CSubjectOption[]>([])\n\nasync function fetchSubjectList() {\n  const { data } = await getSubjectBySchoolIdList({\n    schoolId: userStore.schoolInfo.id,\n  })\n  subjectOptions.value = data\n}\n\n// 左侧所有教师数据\nconst allTeachers = ref\u003CTeacherItem[]>([])\n\n// 右侧已选教师\nconst selectedTeachers = ref\u003CTeacherItem[]>([])\n\n// 左侧当前选中的行\nconst leftSelection = ref\u003CTeacherItem[]>([])\n\n// 右侧当前选中的行\nconst rightSelection = ref\u003CTeacherItem[]>([])\n\n// 左侧表格ref\nconst leftTableRef = ref()\n\n// 已选教师的id集合，用于快速判断\nconst selectedIds = computed(() => new Set(selectedTeachers.value.map(t => t.tenantUserId)))\n\n// 检查行是否可选\nfunction checkSelectable(row: TeacherItem) {\n  return !selectedIds.value.has(row.tenantUserId)\n}\n\n// 左侧选择变化\nfunction handleLeftSelectionChange(selection: TeacherItem[]) {\n  leftSelection.value = selection\n  // 将选中的添加到右侧\n  selection.forEach((teacher) => {\n    if (!selectedIds.value.has(teacher.tenantUserId)) {\n      selectedTeachers.value.push({ ...teacher })\n    }\n  })\n  // 清空左侧选择状态\n  nextTick(() => {\n    leftTableRef.value?.clearSelection()\n  })\n}\n\n// 右侧选择变化\nfunction handleRightSelectionChange(selection: TeacherItem[]) {\n  rightSelection.value = selection\n}\n\n// 删除单个\nfunction handleRemove(row: TeacherItem) {\n  const index = selectedTeachers.value.findIndex(t => t.tenantUserId === row.tenantUserId)\n  if (index > -1) {\n    selectedTeachers.value.splice(index, 1)\n  }\n}\n\n// 批量删除右侧选中的\nfunction handleBatchRemove() {\n  if (rightSelection.value.length === 0) {\n    ElMessage.warning('请先选择要删除的教师')\n    return\n  }\n  const removeIds = new Set(rightSelection.value.map(t => t.tenantUserId))\n  selectedTeachers.value = selectedTeachers.value.filter(t => !removeIds.has(t.tenantUserId))\n  rightSelection.value = []\n}\n\n// 取消\nfunction handleCancel() {\n  visible.value = false\n}\n\n// 确定\nfunction handleConfirm() {\n  if (confirmCallback) {\n    confirmCallback([...selectedTeachers.value], context.value)\n  }\n  visible.value = false\n}\n\n// 打开弹窗的方法\ninterface OpenOptions {\n  defaultSelected?: TeacherItem[]\n  context?: any\n  onConfirm?: (selected: TeacherItem[], ctx: any) => void\n}\n\nasync function open(options: OpenOptions = {}) {\n  const { defaultSelected = [], context: ctx = null, onConfirm } = options\n\n  context.value = ctx\n  confirmCallback = onConfirm || null\n  selectedTeachers.value = [...defaultSelected]\n\n  visible.value = true\n  await fetchAllTeachers()\n  await fetchSubjectList()\n}\n\n// 获取所有教师列表\nasync function fetchAllTeachers() {\n  const { data } = await getTeacherBySchoolIdList({\n    schoolId: userStore.schoolInfo.id,\n    classType: 'admin',\n    userNameOrPhone: searchKeyword.value || undefined,\n    subjectId: subjectFilter.value,\n  })\n  allTeachers.value = data as TeacherItem[]\n}\n\nfunction onDialogClosed() {\n  searchKeyword.value = ''\n  subjectFilter.value = ''\n  rightSelection.value = []\n  leftSelection.value = []\n  selectedTeachers.value = []\n  allTeachers.value = []\n  context.value = null\n  confirmCallback = null\n}\n\n// 暴露 open 方法供外部调用\ndefineExpose({\n  open,\n})\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cel-dialog\n    v-model=\"visible\"\n    title=\"设置阅卷教师\"\n    width=\"1000\"\n    :close-on-click-modal=\"false\"\n    :close-on-press-escape=\"false\"\n    @closed=\"onDialogClosed\"\n  >\n    \u003Cdiv class=\"grid grid-cols-[1fr_1fr] gap-[20px] h-[550px]\">\n      \u003C!-- 左侧：全部教师 -->\n      \u003Cdiv class=\"\">\n        \u003Cdiv class=\"flex items-center mb-[10px] gap-[10px]\">\n          \u003Cel-select v-model=\"subjectFilter\" placeholder=\"科目选择\" clearable class=\"w-[200px]!\" @change=\"fetchAllTeachers\">\n            \u003Cel-option\n              v-for=\"item in subjectOptions\"\n              :key=\"item.id\"\n              :label=\"item.name\"\n              :value=\"item.id\"\n            />\n          \u003C/el-select>\n          \u003Cel-input\n            v-model=\"searchKeyword\"\n            placeholder=\"请输入姓名或账号进行搜索\"\n            clearable\n            @change=\"fetchAllTeachers\"\n          />\n        \u003C/div>\n        \u003Cel-table\n          ref=\"leftTableRef\"\n          :data=\"allTeachers\"\n          border\n          max-height=\"500\"\n          @selection-change=\"handleLeftSelectionChange\"\n        >\n          \u003Cel-table-column\n            type=\"selection\"\n            width=\"55\"\n            :selectable=\"checkSelectable\"\n          />\n          \u003Cel-table-column prop=\"userName\" label=\"姓名\" />\n          \u003Cel-table-column prop=\"userPhone\" label=\"联系方式\" />\n          \u003Cel-table-column prop=\"schoolName\" label=\"学校\" />\n        \u003C/el-table>\n      \u003C/div>\n\n      \u003C!-- 右侧：已选教师 -->\n      \u003Cdiv class=\"\">\n        \u003Cdiv class=\"mb-[10px] font-bold text-[#027AFF] flex h-[32px] leading-[32px]\">\n          已选教师\n          \u003Cel-button type=\"primary\" link class=\"ml-auto\" @click=\"handleBatchRemove\">\n            删除选中教师\n          \u003C/el-button>\n        \u003C/div>\n        \u003Cel-table\n          :data=\"selectedTeachers\"\n          border\n          max-height=\"500\"\n          @selection-change=\"handleRightSelectionChange\"\n        >\n          \u003Cel-table-column type=\"selection\" width=\"55\" />\n          \u003Cel-table-column prop=\"userName\" label=\"姓名\" />\n          \u003Cel-table-column prop=\"userPhone\" label=\"联系方式\" />\n          \u003Cel-table-column prop=\"schoolName\" label=\"学校\" />\n          \u003Cel-table-column label=\"操作\" width=\"60\" align=\"center\">\n            \u003Ctemplate #default=\"{ row }\">\n              \u003Cel-button type=\"danger\" link @click=\"handleRemove(row)\">\n                删除\n              \u003C/el-button>\n            \u003C/template>\n          \u003C/el-table-column>\n        \u003C/el-table>\n      \u003C/div>\n    \u003C/div>\n\n    \u003Ctemplate #footer>\n      \u003Cdiv class=\"flex gap-4 justify-end\">\n        \u003Cel-button @click=\"handleCancel\">\n          取消\n        \u003C/el-button>\n        \u003Cel-button type=\"primary\" @click=\"handleConfirm\">\n          确定\n        \u003C/el-button>\n      \u003C/div>\n    \u003C/template>\n  \u003C/el-dialog>\n\u003C/template>\n\n\u003Cstyle scoped lang=\"scss\">\n:deep(.el-table .el-table__row) {\n  .el-checkbox.is-disabled {\n    .el-checkbox__inner {\n      background-color: #f5f7fa;\n      border-color: #e4e7ed;\n    }\n  }\n}\n\u003C/style>\n","vue",[22,416,417,442,457,469,474,491,504,515,525,535,541,546,559,569,579,584,589,606,611,618,639,644,650,675,680,686,739,744,750,769,787,792,798,818,823,838,863,869,875,886,891,896,902,921,926,932,950,955,961,979,984,990,1008,1013,1019,1033,1038,1044,1085,1090,1096,1117,1135,1140,1145,1151,1171,1182,1188,1209,1228,1246,1252,1257,1263,1275,1286,1291,1296,1301,1307,1325,1335,1340,1345,1351,1369,1400,1420,1436,1442,1447,1452,1458,1468,1487,1503,1509,1514,1542,1571,1581,1586,1591,1597,1607,1618,1623,1628,1634,1644,1652,1666,1671,1680,1685,1690,1696,1707,1720,1731,1761,1766,1771,1795,1835,1840,1851,1867,1882,1887,1897,1908,1917,1922,1927,1933,1944,1964,1969,1981,1994,2000,2005,2023,2028,2033,2043,2054,2064,2073,2082,2091,2100,2109,2118,2123,2128,2134,2142,2148,2153,2163,2168,2178,2187,2198,2209,2220,2231,2241,2252,2258,2277,2283,2300,2317,2362,2371,2382,2393,2404,2414,2420,2430,2438,2449,2460,2466,2477,2483,2493,2501,2512,2523,2530,2541,2552,2558,2566,2577,2588,2599,2604,2631,2654,2677,2687,2697,2702,2708,2723,2739,2745,2780,2786,2795,2804,2811,2821,2826,2835,2845,2850,2874,2895,2916,2937,2968,2993,3019,3025,3035,3045,3054,3063,3072,3082,3087,3101,3117,3133,3139,3148,3170,3176,3185,3194,3203,3214,3223,3228,3247,3253,3259,3265,3271,3277,3282,3287,3292],{"__ignoreMap":261},[265,418,419,422,426,429,432,435,439],{"class":267,"line":268},[265,420,421],{"class":271},"\u003C",[265,423,425],{"class":424},"s9eBZ","script",[265,427,428],{"class":369}," setup",[265,430,431],{"class":369}," lang",[265,433,434],{"class":271},"=",[265,436,438],{"class":437},"sZZnC","\"ts\"",[265,440,441],{"class":271},">\n",[265,443,444,448,451,454],{"class":267,"line":275},[265,445,447],{"class":446},"szBVR","import",[265,449,450],{"class":271}," { getSubjectBySchoolIdList, getTeacherBySchoolIdList } ",[265,452,453],{"class":446},"from",[265,455,456],{"class":437}," '@/api/grading'\n",[265,458,459,461,464,466],{"class":267,"line":281},[265,460,447],{"class":446},[265,462,463],{"class":271}," { useUserStore } ",[265,465,453],{"class":446},[265,467,468],{"class":437}," '@/store'\n",[265,470,471],{"class":267,"line":309},[265,472,473],{"emptyLinePlaceholder":331},"\n",[265,475,476,479,482,485,488],{"class":267,"line":323},[265,477,478],{"class":446},"export",[265,480,481],{"class":446}," type",[265,483,484],{"class":369}," TeacherItem",[265,486,487],{"class":446}," =",[265,489,490],{"class":271}," {\n",[265,492,494,497,500],{"class":267,"line":493},6,[265,495,496],{"class":394},"  tenantUserId",[265,498,499],{"class":446},":",[265,501,503],{"class":502},"sj4cs"," string\n",[265,505,507,510,513],{"class":267,"line":506},7,[265,508,509],{"class":394},"  userName",[265,511,512],{"class":446},"?:",[265,514,503],{"class":502},[265,516,518,521,523],{"class":267,"line":517},8,[265,519,520],{"class":394},"  userPhone",[265,522,512],{"class":446},[265,524,503],{"class":502},[265,526,528,531,533],{"class":267,"line":527},9,[265,529,530],{"class":394},"  schoolName",[265,532,512],{"class":446},[265,534,503],{"class":502},[265,536,538],{"class":267,"line":537},10,[265,539,540],{"class":271},"}\n",[265,542,544],{"class":267,"line":543},11,[265,545,473],{"emptyLinePlaceholder":331},[265,547,549,552,555,557],{"class":267,"line":548},12,[265,550,551],{"class":446},"type",[265,553,554],{"class":369}," SubjectOption",[265,556,487],{"class":446},[265,558,490],{"class":271},[265,560,562,565,567],{"class":267,"line":561},13,[265,563,564],{"class":394},"  id",[265,566,499],{"class":446},[265,568,503],{"class":502},[265,570,572,575,577],{"class":267,"line":571},14,[265,573,574],{"class":394},"  name",[265,576,499],{"class":446},[265,578,503],{"class":502},[265,580,582],{"class":267,"line":581},15,[265,583,540],{"class":271},[265,585,587],{"class":267,"line":586},16,[265,588,473],{"emptyLinePlaceholder":331},[265,590,592,595,598,600,603],{"class":267,"line":591},17,[265,593,594],{"class":446},"const",[265,596,597],{"class":502}," userStore",[265,599,487],{"class":446},[265,601,602],{"class":369}," useUserStore",[265,604,605],{"class":271},"()\n",[265,607,609],{"class":267,"line":608},18,[265,610,473],{"emptyLinePlaceholder":331},[265,612,614],{"class":267,"line":613},19,[265,615,617],{"class":616},"sJ8bj","// 弹窗显示状态\n",[265,619,621,623,626,628,631,633,636],{"class":267,"line":620},20,[265,622,594],{"class":446},[265,624,625],{"class":502}," visible",[265,627,487],{"class":446},[265,629,630],{"class":369}," ref",[265,632,391],{"class":271},[265,634,635],{"class":502},"false",[265,637,638],{"class":271},")\n",[265,640,642],{"class":267,"line":641},21,[265,643,473],{"emptyLinePlaceholder":331},[265,645,647],{"class":267,"line":646},22,[265,648,649],{"class":616},"// 当前操作的上下文数据（由调用方传入）\n",[265,651,653,655,658,660,662,664,667,670,673],{"class":267,"line":652},23,[265,654,594],{"class":446},[265,656,657],{"class":502}," context",[265,659,487],{"class":446},[265,661,630],{"class":369},[265,663,421],{"class":271},[265,665,666],{"class":502},"any",[265,668,669],{"class":271},">(",[265,671,672],{"class":502},"null",[265,674,638],{"class":271},[265,676,678],{"class":267,"line":677},24,[265,679,473],{"emptyLinePlaceholder":331},[265,681,683],{"class":267,"line":682},25,[265,684,685],{"class":616},"// 确认回调\n",[265,687,689,692,695,697,700,702,704,706,709,712,714,717,720,723,726,728,731,734,736],{"class":267,"line":688},26,[265,690,691],{"class":446},"let",[265,693,694],{"class":271}," confirmCallback",[265,696,499],{"class":446},[265,698,699],{"class":271}," ((",[265,701,395],{"class":394},[265,703,499],{"class":446},[265,705,484],{"class":369},[265,707,708],{"class":271},"[], ",[265,710,711],{"class":394},"ctx",[265,713,499],{"class":446},[265,715,716],{"class":502}," any",[265,718,719],{"class":271},") ",[265,721,722],{"class":446},"=>",[265,724,725],{"class":502}," void",[265,727,719],{"class":271},[265,729,730],{"class":446},"|",[265,732,733],{"class":502}," null",[265,735,487],{"class":446},[265,737,738],{"class":502}," null\n",[265,740,742],{"class":267,"line":741},27,[265,743,473],{"emptyLinePlaceholder":331},[265,745,747],{"class":267,"line":746},28,[265,748,749],{"class":616},"// 筛选条件\n",[265,751,753,755,758,760,762,764,767],{"class":267,"line":752},29,[265,754,594],{"class":446},[265,756,757],{"class":502}," subjectFilter",[265,759,487],{"class":446},[265,761,630],{"class":369},[265,763,391],{"class":271},[265,765,766],{"class":437},"''",[265,768,638],{"class":271},[265,770,772,774,777,779,781,783,785],{"class":267,"line":771},30,[265,773,594],{"class":446},[265,775,776],{"class":502}," searchKeyword",[265,778,487],{"class":446},[265,780,630],{"class":369},[265,782,391],{"class":271},[265,784,766],{"class":437},[265,786,638],{"class":271},[265,788,790],{"class":267,"line":789},31,[265,791,473],{"emptyLinePlaceholder":331},[265,793,795],{"class":267,"line":794},32,[265,796,797],{"class":616},"// 科目选项\n",[265,799,801,803,806,808,810,812,815],{"class":267,"line":800},33,[265,802,594],{"class":446},[265,804,805],{"class":502}," subjectOptions",[265,807,487],{"class":446},[265,809,630],{"class":369},[265,811,421],{"class":271},[265,813,814],{"class":369},"SubjectOption",[265,816,817],{"class":271},"[]>([])\n",[265,819,821],{"class":267,"line":820},34,[265,822,473],{"emptyLinePlaceholder":331},[265,824,826,829,832,835],{"class":267,"line":825},35,[265,827,828],{"class":446},"async",[265,830,831],{"class":446}," function",[265,833,834],{"class":369}," fetchSubjectList",[265,836,837],{"class":271},"() {\n",[265,839,841,844,847,850,853,855,858,861],{"class":267,"line":840},36,[265,842,843],{"class":446},"  const",[265,845,846],{"class":271}," { ",[265,848,849],{"class":502},"data",[265,851,852],{"class":271}," } ",[265,854,434],{"class":446},[265,856,857],{"class":446}," await",[265,859,860],{"class":369}," getSubjectBySchoolIdList",[265,862,373],{"class":271},[265,864,866],{"class":267,"line":865},37,[265,867,868],{"class":271},"    schoolId: userStore.schoolInfo.id,\n",[265,870,872],{"class":267,"line":871},38,[265,873,874],{"class":271},"  })\n",[265,876,878,881,883],{"class":267,"line":877},39,[265,879,880],{"class":271},"  subjectOptions.value ",[265,882,434],{"class":446},[265,884,885],{"class":271}," data\n",[265,887,889],{"class":267,"line":888},40,[265,890,540],{"class":271},[265,892,894],{"class":267,"line":893},41,[265,895,473],{"emptyLinePlaceholder":331},[265,897,899],{"class":267,"line":898},42,[265,900,901],{"class":616},"// 左侧所有教师数据\n",[265,903,905,907,910,912,914,916,919],{"class":267,"line":904},43,[265,906,594],{"class":446},[265,908,909],{"class":502}," allTeachers",[265,911,487],{"class":446},[265,913,630],{"class":369},[265,915,421],{"class":271},[265,917,918],{"class":369},"TeacherItem",[265,920,817],{"class":271},[265,922,924],{"class":267,"line":923},44,[265,925,473],{"emptyLinePlaceholder":331},[265,927,929],{"class":267,"line":928},45,[265,930,931],{"class":616},"// 右侧已选教师\n",[265,933,935,937,940,942,944,946,948],{"class":267,"line":934},46,[265,936,594],{"class":446},[265,938,939],{"class":502}," selectedTeachers",[265,941,487],{"class":446},[265,943,630],{"class":369},[265,945,421],{"class":271},[265,947,918],{"class":369},[265,949,817],{"class":271},[265,951,953],{"class":267,"line":952},47,[265,954,473],{"emptyLinePlaceholder":331},[265,956,958],{"class":267,"line":957},48,[265,959,960],{"class":616},"// 左侧当前选中的行\n",[265,962,964,966,969,971,973,975,977],{"class":267,"line":963},49,[265,965,594],{"class":446},[265,967,968],{"class":502}," leftSelection",[265,970,487],{"class":446},[265,972,630],{"class":369},[265,974,421],{"class":271},[265,976,918],{"class":369},[265,978,817],{"class":271},[265,980,982],{"class":267,"line":981},50,[265,983,473],{"emptyLinePlaceholder":331},[265,985,987],{"class":267,"line":986},51,[265,988,989],{"class":616},"// 右侧当前选中的行\n",[265,991,993,995,998,1000,1002,1004,1006],{"class":267,"line":992},52,[265,994,594],{"class":446},[265,996,997],{"class":502}," rightSelection",[265,999,487],{"class":446},[265,1001,630],{"class":369},[265,1003,421],{"class":271},[265,1005,918],{"class":369},[265,1007,817],{"class":271},[265,1009,1011],{"class":267,"line":1010},53,[265,1012,473],{"emptyLinePlaceholder":331},[265,1014,1016],{"class":267,"line":1015},54,[265,1017,1018],{"class":616},"// 左侧表格ref\n",[265,1020,1022,1024,1027,1029,1031],{"class":267,"line":1021},55,[265,1023,594],{"class":446},[265,1025,1026],{"class":502}," leftTableRef",[265,1028,487],{"class":446},[265,1030,630],{"class":369},[265,1032,605],{"class":271},[265,1034,1036],{"class":267,"line":1035},56,[265,1037,473],{"emptyLinePlaceholder":331},[265,1039,1041],{"class":267,"line":1040},57,[265,1042,1043],{"class":616},"// 已选教师的id集合，用于快速判断\n",[265,1045,1047,1049,1052,1054,1057,1060,1062,1065,1068,1071,1074,1076,1079,1082],{"class":267,"line":1046},58,[265,1048,594],{"class":446},[265,1050,1051],{"class":502}," selectedIds",[265,1053,487],{"class":446},[265,1055,1056],{"class":369}," computed",[265,1058,1059],{"class":271},"(() ",[265,1061,722],{"class":446},[265,1063,1064],{"class":446}," new",[265,1066,1067],{"class":369}," Set",[265,1069,1070],{"class":271},"(selectedTeachers.value.",[265,1072,1073],{"class":369},"map",[265,1075,391],{"class":271},[265,1077,1078],{"class":394},"t",[265,1080,1081],{"class":446}," =>",[265,1083,1084],{"class":271}," t.tenantUserId)))\n",[265,1086,1088],{"class":267,"line":1087},59,[265,1089,473],{"emptyLinePlaceholder":331},[265,1091,1093],{"class":267,"line":1092},60,[265,1094,1095],{"class":616},"// 检查行是否可选\n",[265,1097,1099,1102,1105,1107,1110,1112,1114],{"class":267,"line":1098},61,[265,1100,1101],{"class":446},"function",[265,1103,1104],{"class":369}," checkSelectable",[265,1106,391],{"class":271},[265,1108,1109],{"class":394},"row",[265,1111,499],{"class":446},[265,1113,484],{"class":369},[265,1115,1116],{"class":271},") {\n",[265,1118,1120,1123,1126,1129,1132],{"class":267,"line":1119},62,[265,1121,1122],{"class":446},"  return",[265,1124,1125],{"class":446}," !",[265,1127,1128],{"class":271},"selectedIds.value.",[265,1130,1131],{"class":369},"has",[265,1133,1134],{"class":271},"(row.tenantUserId)\n",[265,1136,1138],{"class":267,"line":1137},63,[265,1139,540],{"class":271},[265,1141,1143],{"class":267,"line":1142},64,[265,1144,473],{"emptyLinePlaceholder":331},[265,1146,1148],{"class":267,"line":1147},65,[265,1149,1150],{"class":616},"// 左侧选择变化\n",[265,1152,1154,1156,1159,1161,1164,1166,1168],{"class":267,"line":1153},66,[265,1155,1101],{"class":446},[265,1157,1158],{"class":369}," handleLeftSelectionChange",[265,1160,391],{"class":271},[265,1162,1163],{"class":394},"selection",[265,1165,499],{"class":446},[265,1167,484],{"class":369},[265,1169,1170],{"class":271},"[]) {\n",[265,1172,1174,1177,1179],{"class":267,"line":1173},67,[265,1175,1176],{"class":271},"  leftSelection.value ",[265,1178,434],{"class":446},[265,1180,1181],{"class":271}," selection\n",[265,1183,1185],{"class":267,"line":1184},68,[265,1186,1187],{"class":616},"  // 将选中的添加到右侧\n",[265,1189,1191,1194,1197,1200,1203,1205,1207],{"class":267,"line":1190},69,[265,1192,1193],{"class":271},"  selection.",[265,1195,1196],{"class":369},"forEach",[265,1198,1199],{"class":271},"((",[265,1201,1202],{"class":394},"teacher",[265,1204,719],{"class":271},[265,1206,722],{"class":446},[265,1208,490],{"class":271},[265,1210,1212,1215,1218,1221,1223,1225],{"class":267,"line":1211},70,[265,1213,1214],{"class":446},"    if",[265,1216,1217],{"class":271}," (",[265,1219,1220],{"class":446},"!",[265,1222,1128],{"class":271},[265,1224,1131],{"class":369},[265,1226,1227],{"class":271},"(teacher.tenantUserId)) {\n",[265,1229,1231,1234,1237,1240,1243],{"class":267,"line":1230},71,[265,1232,1233],{"class":271},"      selectedTeachers.value.",[265,1235,1236],{"class":369},"push",[265,1238,1239],{"class":271},"({ ",[265,1241,1242],{"class":446},"...",[265,1244,1245],{"class":271},"teacher })\n",[265,1247,1249],{"class":267,"line":1248},72,[265,1250,1251],{"class":271},"    }\n",[265,1253,1255],{"class":267,"line":1254},73,[265,1256,874],{"class":271},[265,1258,1260],{"class":267,"line":1259},74,[265,1261,1262],{"class":616},"  // 清空左侧选择状态\n",[265,1264,1266,1269,1271,1273],{"class":267,"line":1265},75,[265,1267,1268],{"class":369},"  nextTick",[265,1270,1059],{"class":271},[265,1272,722],{"class":446},[265,1274,490],{"class":271},[265,1276,1278,1281,1284],{"class":267,"line":1277},76,[265,1279,1280],{"class":271},"    leftTableRef.value?.",[265,1282,1283],{"class":369},"clearSelection",[265,1285,605],{"class":271},[265,1287,1289],{"class":267,"line":1288},77,[265,1290,874],{"class":271},[265,1292,1294],{"class":267,"line":1293},78,[265,1295,540],{"class":271},[265,1297,1299],{"class":267,"line":1298},79,[265,1300,473],{"emptyLinePlaceholder":331},[265,1302,1304],{"class":267,"line":1303},80,[265,1305,1306],{"class":616},"// 右侧选择变化\n",[265,1308,1310,1312,1315,1317,1319,1321,1323],{"class":267,"line":1309},81,[265,1311,1101],{"class":446},[265,1313,1314],{"class":369}," handleRightSelectionChange",[265,1316,391],{"class":271},[265,1318,1163],{"class":394},[265,1320,499],{"class":446},[265,1322,484],{"class":369},[265,1324,1170],{"class":271},[265,1326,1328,1331,1333],{"class":267,"line":1327},82,[265,1329,1330],{"class":271},"  rightSelection.value ",[265,1332,434],{"class":446},[265,1334,1181],{"class":271},[265,1336,1338],{"class":267,"line":1337},83,[265,1339,540],{"class":271},[265,1341,1343],{"class":267,"line":1342},84,[265,1344,473],{"emptyLinePlaceholder":331},[265,1346,1348],{"class":267,"line":1347},85,[265,1349,1350],{"class":616},"// 删除单个\n",[265,1352,1354,1356,1359,1361,1363,1365,1367],{"class":267,"line":1353},86,[265,1355,1101],{"class":446},[265,1357,1358],{"class":369}," handleRemove",[265,1360,391],{"class":271},[265,1362,1109],{"class":394},[265,1364,499],{"class":446},[265,1366,484],{"class":369},[265,1368,1116],{"class":271},[265,1370,1372,1374,1377,1379,1382,1385,1387,1389,1391,1394,1397],{"class":267,"line":1371},87,[265,1373,843],{"class":446},[265,1375,1376],{"class":502}," index",[265,1378,487],{"class":446},[265,1380,1381],{"class":271}," selectedTeachers.value.",[265,1383,1384],{"class":369},"findIndex",[265,1386,391],{"class":271},[265,1388,1078],{"class":394},[265,1390,1081],{"class":446},[265,1392,1393],{"class":271}," t.tenantUserId ",[265,1395,1396],{"class":446},"===",[265,1398,1399],{"class":271}," row.tenantUserId)\n",[265,1401,1403,1406,1409,1412,1415,1418],{"class":267,"line":1402},88,[265,1404,1405],{"class":446},"  if",[265,1407,1408],{"class":271}," (index ",[265,1410,1411],{"class":446},">",[265,1413,1414],{"class":446}," -",[265,1416,1417],{"class":502},"1",[265,1419,1116],{"class":271},[265,1421,1423,1426,1429,1432,1434],{"class":267,"line":1422},89,[265,1424,1425],{"class":271},"    selectedTeachers.value.",[265,1427,1428],{"class":369},"splice",[265,1430,1431],{"class":271},"(index, ",[265,1433,1417],{"class":502},[265,1435,638],{"class":271},[265,1437,1439],{"class":267,"line":1438},90,[265,1440,1441],{"class":271},"  }\n",[265,1443,1445],{"class":267,"line":1444},91,[265,1446,540],{"class":271},[265,1448,1450],{"class":267,"line":1449},92,[265,1451,473],{"emptyLinePlaceholder":331},[265,1453,1455],{"class":267,"line":1454},93,[265,1456,1457],{"class":616},"// 批量删除右侧选中的\n",[265,1459,1461,1463,1466],{"class":267,"line":1460},94,[265,1462,1101],{"class":446},[265,1464,1465],{"class":369}," handleBatchRemove",[265,1467,837],{"class":271},[265,1469,1471,1473,1476,1479,1482,1485],{"class":267,"line":1470},95,[265,1472,1405],{"class":446},[265,1474,1475],{"class":271}," (rightSelection.value.",[265,1477,1478],{"class":502},"length",[265,1480,1481],{"class":446}," ===",[265,1483,1484],{"class":502}," 0",[265,1486,1116],{"class":271},[265,1488,1490,1493,1496,1498,1501],{"class":267,"line":1489},96,[265,1491,1492],{"class":271},"    ElMessage.",[265,1494,1495],{"class":369},"warning",[265,1497,391],{"class":271},[265,1499,1500],{"class":437},"'请先选择要删除的教师'",[265,1502,638],{"class":271},[265,1504,1506],{"class":267,"line":1505},97,[265,1507,1508],{"class":446},"    return\n",[265,1510,1512],{"class":267,"line":1511},98,[265,1513,1441],{"class":271},[265,1515,1517,1519,1522,1524,1526,1528,1531,1533,1535,1537,1539],{"class":267,"line":1516},99,[265,1518,843],{"class":446},[265,1520,1521],{"class":502}," removeIds",[265,1523,487],{"class":446},[265,1525,1064],{"class":446},[265,1527,1067],{"class":369},[265,1529,1530],{"class":271},"(rightSelection.value.",[265,1532,1073],{"class":369},[265,1534,391],{"class":271},[265,1536,1078],{"class":394},[265,1538,1081],{"class":446},[265,1540,1541],{"class":271}," t.tenantUserId))\n",[265,1543,1545,1548,1550,1552,1555,1557,1559,1561,1563,1566,1568],{"class":267,"line":1544},100,[265,1546,1547],{"class":271},"  selectedTeachers.value ",[265,1549,434],{"class":446},[265,1551,1381],{"class":271},[265,1553,1554],{"class":369},"filter",[265,1556,391],{"class":271},[265,1558,1078],{"class":394},[265,1560,1081],{"class":446},[265,1562,1125],{"class":446},[265,1564,1565],{"class":271},"removeIds.",[265,1567,1131],{"class":369},[265,1569,1570],{"class":271},"(t.tenantUserId))\n",[265,1572,1574,1576,1578],{"class":267,"line":1573},101,[265,1575,1330],{"class":271},[265,1577,434],{"class":446},[265,1579,1580],{"class":271}," []\n",[265,1582,1584],{"class":267,"line":1583},102,[265,1585,540],{"class":271},[265,1587,1589],{"class":267,"line":1588},103,[265,1590,473],{"emptyLinePlaceholder":331},[265,1592,1594],{"class":267,"line":1593},104,[265,1595,1596],{"class":616},"// 取消\n",[265,1598,1600,1602,1605],{"class":267,"line":1599},105,[265,1601,1101],{"class":446},[265,1603,1604],{"class":369}," handleCancel",[265,1606,837],{"class":271},[265,1608,1610,1613,1615],{"class":267,"line":1609},106,[265,1611,1612],{"class":271},"  visible.value ",[265,1614,434],{"class":446},[265,1616,1617],{"class":502}," false\n",[265,1619,1621],{"class":267,"line":1620},107,[265,1622,540],{"class":271},[265,1624,1626],{"class":267,"line":1625},108,[265,1627,473],{"emptyLinePlaceholder":331},[265,1629,1631],{"class":267,"line":1630},109,[265,1632,1633],{"class":616},"// 确定\n",[265,1635,1637,1639,1642],{"class":267,"line":1636},110,[265,1638,1101],{"class":446},[265,1640,1641],{"class":369}," handleConfirm",[265,1643,837],{"class":271},[265,1645,1647,1649],{"class":267,"line":1646},111,[265,1648,1405],{"class":446},[265,1650,1651],{"class":271}," (confirmCallback) {\n",[265,1653,1655,1658,1661,1663],{"class":267,"line":1654},112,[265,1656,1657],{"class":369},"    confirmCallback",[265,1659,1660],{"class":271},"([",[265,1662,1242],{"class":446},[265,1664,1665],{"class":271},"selectedTeachers.value], context.value)\n",[265,1667,1669],{"class":267,"line":1668},113,[265,1670,1441],{"class":271},[265,1672,1674,1676,1678],{"class":267,"line":1673},114,[265,1675,1612],{"class":271},[265,1677,434],{"class":446},[265,1679,1617],{"class":502},[265,1681,1683],{"class":267,"line":1682},115,[265,1684,540],{"class":271},[265,1686,1688],{"class":267,"line":1687},116,[265,1689,473],{"emptyLinePlaceholder":331},[265,1691,1693],{"class":267,"line":1692},117,[265,1694,1695],{"class":616},"// 打开弹窗的方法\n",[265,1697,1699,1702,1705],{"class":267,"line":1698},118,[265,1700,1701],{"class":446},"interface",[265,1703,1704],{"class":369}," OpenOptions",[265,1706,490],{"class":271},[265,1708,1710,1713,1715,1717],{"class":267,"line":1709},119,[265,1711,1712],{"class":394},"  defaultSelected",[265,1714,512],{"class":446},[265,1716,484],{"class":369},[265,1718,1719],{"class":271},"[]\n",[265,1721,1723,1726,1728],{"class":267,"line":1722},120,[265,1724,1725],{"class":394},"  context",[265,1727,512],{"class":446},[265,1729,1730],{"class":502}," any\n",[265,1732,1734,1736,1738,1740,1742,1744,1746,1748,1750,1752,1754,1756,1758],{"class":267,"line":1733},121,[265,1735,388],{"class":369},[265,1737,512],{"class":446},[265,1739,1217],{"class":271},[265,1741,395],{"class":394},[265,1743,499],{"class":446},[265,1745,484],{"class":369},[265,1747,708],{"class":271},[265,1749,711],{"class":394},[265,1751,499],{"class":446},[265,1753,716],{"class":502},[265,1755,719],{"class":271},[265,1757,722],{"class":446},[265,1759,1760],{"class":502}," void\n",[265,1762,1764],{"class":267,"line":1763},122,[265,1765,540],{"class":271},[265,1767,1769],{"class":267,"line":1768},123,[265,1770,473],{"emptyLinePlaceholder":331},[265,1772,1774,1776,1778,1781,1783,1786,1788,1790,1792],{"class":267,"line":1773},124,[265,1775,828],{"class":446},[265,1777,831],{"class":446},[265,1779,1780],{"class":369}," open",[265,1782,391],{"class":271},[265,1784,1785],{"class":394},"options",[265,1787,499],{"class":446},[265,1789,1704],{"class":369},[265,1791,487],{"class":446},[265,1793,1794],{"class":271}," {}) {\n",[265,1796,1798,1800,1802,1805,1807,1810,1813,1816,1818,1820,1822,1825,1828,1830,1832],{"class":267,"line":1797},125,[265,1799,843],{"class":446},[265,1801,846],{"class":271},[265,1803,1804],{"class":502},"defaultSelected",[265,1806,487],{"class":446},[265,1808,1809],{"class":271}," [], ",[265,1811,1812],{"class":394},"context",[265,1814,1815],{"class":271},": ",[265,1817,711],{"class":502},[265,1819,487],{"class":446},[265,1821,733],{"class":502},[265,1823,1824],{"class":271},", ",[265,1826,1827],{"class":502},"onConfirm",[265,1829,852],{"class":271},[265,1831,434],{"class":446},[265,1833,1834],{"class":271}," options\n",[265,1836,1838],{"class":267,"line":1837},126,[265,1839,473],{"emptyLinePlaceholder":331},[265,1841,1843,1846,1848],{"class":267,"line":1842},127,[265,1844,1845],{"class":271},"  context.value ",[265,1847,434],{"class":446},[265,1849,1850],{"class":271}," ctx\n",[265,1852,1854,1857,1859,1862,1865],{"class":267,"line":1853},128,[265,1855,1856],{"class":271},"  confirmCallback ",[265,1858,434],{"class":446},[265,1860,1861],{"class":271}," onConfirm ",[265,1863,1864],{"class":446},"||",[265,1866,738],{"class":502},[265,1868,1870,1872,1874,1877,1879],{"class":267,"line":1869},129,[265,1871,1547],{"class":271},[265,1873,434],{"class":446},[265,1875,1876],{"class":271}," [",[265,1878,1242],{"class":446},[265,1880,1881],{"class":271},"defaultSelected]\n",[265,1883,1885],{"class":267,"line":1884},130,[265,1886,473],{"emptyLinePlaceholder":331},[265,1888,1890,1892,1894],{"class":267,"line":1889},131,[265,1891,1612],{"class":271},[265,1893,434],{"class":446},[265,1895,1896],{"class":502}," true\n",[265,1898,1900,1903,1906],{"class":267,"line":1899},132,[265,1901,1902],{"class":446},"  await",[265,1904,1905],{"class":369}," fetchAllTeachers",[265,1907,605],{"class":271},[265,1909,1911,1913,1915],{"class":267,"line":1910},133,[265,1912,1902],{"class":446},[265,1914,834],{"class":369},[265,1916,605],{"class":271},[265,1918,1920],{"class":267,"line":1919},134,[265,1921,540],{"class":271},[265,1923,1925],{"class":267,"line":1924},135,[265,1926,473],{"emptyLinePlaceholder":331},[265,1928,1930],{"class":267,"line":1929},136,[265,1931,1932],{"class":616},"// 获取所有教师列表\n",[265,1934,1936,1938,1940,1942],{"class":267,"line":1935},137,[265,1937,828],{"class":446},[265,1939,831],{"class":446},[265,1941,1905],{"class":369},[265,1943,837],{"class":271},[265,1945,1947,1949,1951,1953,1955,1957,1959,1962],{"class":267,"line":1946},138,[265,1948,843],{"class":446},[265,1950,846],{"class":271},[265,1952,849],{"class":502},[265,1954,852],{"class":271},[265,1956,434],{"class":446},[265,1958,857],{"class":446},[265,1960,1961],{"class":369}," getTeacherBySchoolIdList",[265,1963,373],{"class":271},[265,1965,1967],{"class":267,"line":1966},139,[265,1968,868],{"class":271},[265,1970,1972,1975,1978],{"class":267,"line":1971},140,[265,1973,1974],{"class":271},"    classType: ",[265,1976,1977],{"class":437},"'admin'",[265,1979,1980],{"class":271},",\n",[265,1982,1984,1987,1989,1992],{"class":267,"line":1983},141,[265,1985,1986],{"class":271},"    userNameOrPhone: searchKeyword.value ",[265,1988,1864],{"class":446},[265,1990,1991],{"class":502}," undefined",[265,1993,1980],{"class":271},[265,1995,1997],{"class":267,"line":1996},142,[265,1998,1999],{"class":271},"    subjectId: subjectFilter.value,\n",[265,2001,2003],{"class":267,"line":2002},143,[265,2004,874],{"class":271},[265,2006,2008,2011,2013,2016,2019,2021],{"class":267,"line":2007},144,[265,2009,2010],{"class":271},"  allTeachers.value ",[265,2012,434],{"class":446},[265,2014,2015],{"class":271}," data ",[265,2017,2018],{"class":446},"as",[265,2020,484],{"class":369},[265,2022,1719],{"class":271},[265,2024,2026],{"class":267,"line":2025},145,[265,2027,540],{"class":271},[265,2029,2031],{"class":267,"line":2030},146,[265,2032,473],{"emptyLinePlaceholder":331},[265,2034,2036,2038,2041],{"class":267,"line":2035},147,[265,2037,1101],{"class":446},[265,2039,2040],{"class":369}," onDialogClosed",[265,2042,837],{"class":271},[265,2044,2046,2049,2051],{"class":267,"line":2045},148,[265,2047,2048],{"class":271},"  searchKeyword.value ",[265,2050,434],{"class":446},[265,2052,2053],{"class":437}," ''\n",[265,2055,2057,2060,2062],{"class":267,"line":2056},149,[265,2058,2059],{"class":271},"  subjectFilter.value ",[265,2061,434],{"class":446},[265,2063,2053],{"class":437},[265,2065,2067,2069,2071],{"class":267,"line":2066},150,[265,2068,1330],{"class":271},[265,2070,434],{"class":446},[265,2072,1580],{"class":271},[265,2074,2076,2078,2080],{"class":267,"line":2075},151,[265,2077,1176],{"class":271},[265,2079,434],{"class":446},[265,2081,1580],{"class":271},[265,2083,2085,2087,2089],{"class":267,"line":2084},152,[265,2086,1547],{"class":271},[265,2088,434],{"class":446},[265,2090,1580],{"class":271},[265,2092,2094,2096,2098],{"class":267,"line":2093},153,[265,2095,2010],{"class":271},[265,2097,434],{"class":446},[265,2099,1580],{"class":271},[265,2101,2103,2105,2107],{"class":267,"line":2102},154,[265,2104,1845],{"class":271},[265,2106,434],{"class":446},[265,2108,738],{"class":502},[265,2110,2112,2114,2116],{"class":267,"line":2111},155,[265,2113,1856],{"class":271},[265,2115,434],{"class":446},[265,2117,738],{"class":502},[265,2119,2121],{"class":267,"line":2120},156,[265,2122,540],{"class":271},[265,2124,2126],{"class":267,"line":2125},157,[265,2127,473],{"emptyLinePlaceholder":331},[265,2129,2131],{"class":267,"line":2130},158,[265,2132,2133],{"class":616},"// 暴露 open 方法供外部调用\n",[265,2135,2137,2140],{"class":267,"line":2136},159,[265,2138,2139],{"class":369},"defineExpose",[265,2141,373],{"class":271},[265,2143,2145],{"class":267,"line":2144},160,[265,2146,2147],{"class":271},"  open,\n",[265,2149,2151],{"class":267,"line":2150},161,[265,2152,403],{"class":271},[265,2154,2156,2159,2161],{"class":267,"line":2155},162,[265,2157,2158],{"class":271},"\u003C/",[265,2160,425],{"class":424},[265,2162,441],{"class":271},[265,2164,2166],{"class":267,"line":2165},163,[265,2167,473],{"emptyLinePlaceholder":331},[265,2169,2171,2173,2176],{"class":267,"line":2170},164,[265,2172,421],{"class":271},[265,2174,2175],{"class":424},"template",[265,2177,441],{"class":271},[265,2179,2181,2184],{"class":267,"line":2180},165,[265,2182,2183],{"class":271},"  \u003C",[265,2185,2186],{"class":424},"el-dialog\n",[265,2188,2190,2193,2195],{"class":267,"line":2189},166,[265,2191,2192],{"class":369},"    v-model",[265,2194,434],{"class":271},[265,2196,2197],{"class":437},"\"visible\"\n",[265,2199,2201,2204,2206],{"class":267,"line":2200},167,[265,2202,2203],{"class":369},"    title",[265,2205,434],{"class":271},[265,2207,2208],{"class":437},"\"设置阅卷教师\"\n",[265,2210,2212,2215,2217],{"class":267,"line":2211},168,[265,2213,2214],{"class":369},"    width",[265,2216,434],{"class":271},[265,2218,2219],{"class":437},"\"1000\"\n",[265,2221,2223,2226,2228],{"class":267,"line":2222},169,[265,2224,2225],{"class":369},"    :close-on-click-modal",[265,2227,434],{"class":271},[265,2229,2230],{"class":437},"\"false\"\n",[265,2232,2234,2237,2239],{"class":267,"line":2233},170,[265,2235,2236],{"class":369},"    :close-on-press-escape",[265,2238,434],{"class":271},[265,2240,2230],{"class":437},[265,2242,2244,2247,2249],{"class":267,"line":2243},171,[265,2245,2246],{"class":369},"    @closed",[265,2248,434],{"class":271},[265,2250,2251],{"class":437},"\"onDialogClosed\"\n",[265,2253,2255],{"class":267,"line":2254},172,[265,2256,2257],{"class":271},"  >\n",[265,2259,2261,2264,2267,2270,2272,2275],{"class":267,"line":2260},173,[265,2262,2263],{"class":271},"    \u003C",[265,2265,2266],{"class":424},"div",[265,2268,2269],{"class":369}," class",[265,2271,434],{"class":271},[265,2273,2274],{"class":437},"\"grid grid-cols-[1fr_1fr] gap-[20px] h-[550px]\"",[265,2276,441],{"class":271},[265,2278,2280],{"class":267,"line":2279},174,[265,2281,2282],{"class":616},"      \u003C!-- 左侧：全部教师 -->\n",[265,2284,2286,2289,2291,2293,2295,2298],{"class":267,"line":2285},175,[265,2287,2288],{"class":271},"      \u003C",[265,2290,2266],{"class":424},[265,2292,2269],{"class":369},[265,2294,434],{"class":271},[265,2296,2297],{"class":437},"\"\"",[265,2299,441],{"class":271},[265,2301,2303,2306,2308,2310,2312,2315],{"class":267,"line":2302},176,[265,2304,2305],{"class":271},"        \u003C",[265,2307,2266],{"class":424},[265,2309,2269],{"class":369},[265,2311,434],{"class":271},[265,2313,2314],{"class":437},"\"flex items-center mb-[10px] gap-[10px]\"",[265,2316,441],{"class":271},[265,2318,2320,2323,2326,2329,2331,2334,2337,2339,2342,2345,2347,2349,2352,2355,2357,2360],{"class":267,"line":2319},177,[265,2321,2322],{"class":271},"          \u003C",[265,2324,2325],{"class":424},"el-select",[265,2327,2328],{"class":369}," v-model",[265,2330,434],{"class":271},[265,2332,2333],{"class":437},"\"subjectFilter\"",[265,2335,2336],{"class":369}," placeholder",[265,2338,434],{"class":271},[265,2340,2341],{"class":437},"\"科目选择\"",[265,2343,2344],{"class":369}," clearable",[265,2346,2269],{"class":369},[265,2348,434],{"class":271},[265,2350,2351],{"class":437},"\"w-[200px]!\"",[265,2353,2354],{"class":369}," @change",[265,2356,434],{"class":271},[265,2358,2359],{"class":437},"\"fetchAllTeachers\"",[265,2361,441],{"class":271},[265,2363,2365,2368],{"class":267,"line":2364},178,[265,2366,2367],{"class":271},"            \u003C",[265,2369,2370],{"class":424},"el-option\n",[265,2372,2374,2377,2379],{"class":267,"line":2373},179,[265,2375,2376],{"class":369},"              v-for",[265,2378,434],{"class":271},[265,2380,2381],{"class":437},"\"item in subjectOptions\"\n",[265,2383,2385,2388,2390],{"class":267,"line":2384},180,[265,2386,2387],{"class":369},"              :key",[265,2389,434],{"class":271},[265,2391,2392],{"class":437},"\"item.id\"\n",[265,2394,2396,2399,2401],{"class":267,"line":2395},181,[265,2397,2398],{"class":369},"              :label",[265,2400,434],{"class":271},[265,2402,2403],{"class":437},"\"item.name\"\n",[265,2405,2407,2410,2412],{"class":267,"line":2406},182,[265,2408,2409],{"class":369},"              :value",[265,2411,434],{"class":271},[265,2413,2392],{"class":437},[265,2415,2417],{"class":267,"line":2416},183,[265,2418,2419],{"class":271},"            />\n",[265,2421,2423,2426,2428],{"class":267,"line":2422},184,[265,2424,2425],{"class":271},"          \u003C/",[265,2427,2325],{"class":424},[265,2429,441],{"class":271},[265,2431,2433,2435],{"class":267,"line":2432},185,[265,2434,2322],{"class":271},[265,2436,2437],{"class":424},"el-input\n",[265,2439,2441,2444,2446],{"class":267,"line":2440},186,[265,2442,2443],{"class":369},"            v-model",[265,2445,434],{"class":271},[265,2447,2448],{"class":437},"\"searchKeyword\"\n",[265,2450,2452,2455,2457],{"class":267,"line":2451},187,[265,2453,2454],{"class":369},"            placeholder",[265,2456,434],{"class":271},[265,2458,2459],{"class":437},"\"请输入姓名或账号进行搜索\"\n",[265,2461,2463],{"class":267,"line":2462},188,[265,2464,2465],{"class":369},"            clearable\n",[265,2467,2469,2472,2474],{"class":267,"line":2468},189,[265,2470,2471],{"class":369},"            @change",[265,2473,434],{"class":271},[265,2475,2476],{"class":437},"\"fetchAllTeachers\"\n",[265,2478,2480],{"class":267,"line":2479},190,[265,2481,2482],{"class":271},"          />\n",[265,2484,2486,2489,2491],{"class":267,"line":2485},191,[265,2487,2488],{"class":271},"        \u003C/",[265,2490,2266],{"class":424},[265,2492,441],{"class":271},[265,2494,2496,2498],{"class":267,"line":2495},192,[265,2497,2305],{"class":271},[265,2499,2500],{"class":424},"el-table\n",[265,2502,2504,2507,2509],{"class":267,"line":2503},193,[265,2505,2506],{"class":369},"          ref",[265,2508,434],{"class":271},[265,2510,2511],{"class":437},"\"leftTableRef\"\n",[265,2513,2515,2518,2520],{"class":267,"line":2514},194,[265,2516,2517],{"class":369},"          :data",[265,2519,434],{"class":271},[265,2521,2522],{"class":437},"\"allTeachers\"\n",[265,2524,2526],{"class":267,"line":2525},195,[265,2527,2529],{"class":2528},"s7hpK","          border\n",[265,2531,2533,2536,2538],{"class":267,"line":2532},196,[265,2534,2535],{"class":369},"          max-height",[265,2537,434],{"class":271},[265,2539,2540],{"class":437},"\"500\"\n",[265,2542,2544,2547,2549],{"class":267,"line":2543},197,[265,2545,2546],{"class":369},"          @selection-change",[265,2548,434],{"class":271},[265,2550,2551],{"class":437},"\"handleLeftSelectionChange\"\n",[265,2553,2555],{"class":267,"line":2554},198,[265,2556,2557],{"class":271},"        >\n",[265,2559,2561,2563],{"class":267,"line":2560},199,[265,2562,2322],{"class":271},[265,2564,2565],{"class":424},"el-table-column\n",[265,2567,2569,2572,2574],{"class":267,"line":2568},200,[265,2570,2571],{"class":369},"            type",[265,2573,434],{"class":271},[265,2575,2576],{"class":437},"\"selection\"\n",[265,2578,2580,2583,2585],{"class":267,"line":2579},201,[265,2581,2582],{"class":369},"            width",[265,2584,434],{"class":271},[265,2586,2587],{"class":437},"\"55\"\n",[265,2589,2591,2594,2596],{"class":267,"line":2590},202,[265,2592,2593],{"class":369},"            :selectable",[265,2595,434],{"class":271},[265,2597,2598],{"class":437},"\"checkSelectable\"\n",[265,2600,2602],{"class":267,"line":2601},203,[265,2603,2482],{"class":271},[265,2605,2607,2609,2612,2615,2617,2620,2623,2625,2628],{"class":267,"line":2606},204,[265,2608,2322],{"class":271},[265,2610,2611],{"class":424},"el-table-column",[265,2613,2614],{"class":369}," prop",[265,2616,434],{"class":271},[265,2618,2619],{"class":437},"\"userName\"",[265,2621,2622],{"class":369}," label",[265,2624,434],{"class":271},[265,2626,2627],{"class":437},"\"姓名\"",[265,2629,2630],{"class":271}," />\n",[265,2632,2634,2636,2638,2640,2642,2645,2647,2649,2652],{"class":267,"line":2633},205,[265,2635,2322],{"class":271},[265,2637,2611],{"class":424},[265,2639,2614],{"class":369},[265,2641,434],{"class":271},[265,2643,2644],{"class":437},"\"userPhone\"",[265,2646,2622],{"class":369},[265,2648,434],{"class":271},[265,2650,2651],{"class":437},"\"联系方式\"",[265,2653,2630],{"class":271},[265,2655,2657,2659,2661,2663,2665,2668,2670,2672,2675],{"class":267,"line":2656},206,[265,2658,2322],{"class":271},[265,2660,2611],{"class":424},[265,2662,2614],{"class":369},[265,2664,434],{"class":271},[265,2666,2667],{"class":437},"\"schoolName\"",[265,2669,2622],{"class":369},[265,2671,434],{"class":271},[265,2673,2674],{"class":437},"\"学校\"",[265,2676,2630],{"class":271},[265,2678,2680,2682,2685],{"class":267,"line":2679},207,[265,2681,2488],{"class":271},[265,2683,2684],{"class":424},"el-table",[265,2686,441],{"class":271},[265,2688,2690,2693,2695],{"class":267,"line":2689},208,[265,2691,2692],{"class":271},"      \u003C/",[265,2694,2266],{"class":424},[265,2696,441],{"class":271},[265,2698,2700],{"class":267,"line":2699},209,[265,2701,473],{"emptyLinePlaceholder":331},[265,2703,2705],{"class":267,"line":2704},210,[265,2706,2707],{"class":616},"      \u003C!-- 右侧：已选教师 -->\n",[265,2709,2711,2713,2715,2717,2719,2721],{"class":267,"line":2710},211,[265,2712,2288],{"class":271},[265,2714,2266],{"class":424},[265,2716,2269],{"class":369},[265,2718,434],{"class":271},[265,2720,2297],{"class":437},[265,2722,441],{"class":271},[265,2724,2726,2728,2730,2732,2734,2737],{"class":267,"line":2725},212,[265,2727,2305],{"class":271},[265,2729,2266],{"class":424},[265,2731,2269],{"class":369},[265,2733,434],{"class":271},[265,2735,2736],{"class":437},"\"mb-[10px] font-bold text-[#027AFF] flex h-[32px] leading-[32px]\"",[265,2738,441],{"class":271},[265,2740,2742],{"class":267,"line":2741},213,[265,2743,2744],{"class":271},"          已选教师\n",[265,2746,2748,2750,2753,2755,2757,2760,2763,2765,2767,2770,2773,2775,2778],{"class":267,"line":2747},214,[265,2749,2322],{"class":271},[265,2751,2752],{"class":424},"el-button",[265,2754,481],{"class":369},[265,2756,434],{"class":271},[265,2758,2759],{"class":437},"\"primary\"",[265,2761,2762],{"class":369}," link",[265,2764,2269],{"class":369},[265,2766,434],{"class":271},[265,2768,2769],{"class":437},"\"ml-auto\"",[265,2771,2772],{"class":369}," @click",[265,2774,434],{"class":271},[265,2776,2777],{"class":437},"\"handleBatchRemove\"",[265,2779,441],{"class":271},[265,2781,2783],{"class":267,"line":2782},215,[265,2784,2785],{"class":271},"            删除选中教师\n",[265,2787,2789,2791,2793],{"class":267,"line":2788},216,[265,2790,2425],{"class":271},[265,2792,2752],{"class":424},[265,2794,441],{"class":271},[265,2796,2798,2800,2802],{"class":267,"line":2797},217,[265,2799,2488],{"class":271},[265,2801,2266],{"class":424},[265,2803,441],{"class":271},[265,2805,2807,2809],{"class":267,"line":2806},218,[265,2808,2305],{"class":271},[265,2810,2500],{"class":424},[265,2812,2814,2816,2818],{"class":267,"line":2813},219,[265,2815,2517],{"class":369},[265,2817,434],{"class":271},[265,2819,2820],{"class":437},"\"selectedTeachers\"\n",[265,2822,2824],{"class":267,"line":2823},220,[265,2825,2529],{"class":2528},[265,2827,2829,2831,2833],{"class":267,"line":2828},221,[265,2830,2535],{"class":369},[265,2832,434],{"class":271},[265,2834,2540],{"class":437},[265,2836,2838,2840,2842],{"class":267,"line":2837},222,[265,2839,2546],{"class":369},[265,2841,434],{"class":271},[265,2843,2844],{"class":437},"\"handleRightSelectionChange\"\n",[265,2846,2848],{"class":267,"line":2847},223,[265,2849,2557],{"class":271},[265,2851,2853,2855,2857,2859,2861,2864,2867,2869,2872],{"class":267,"line":2852},224,[265,2854,2322],{"class":271},[265,2856,2611],{"class":424},[265,2858,481],{"class":369},[265,2860,434],{"class":271},[265,2862,2863],{"class":437},"\"selection\"",[265,2865,2866],{"class":369}," width",[265,2868,434],{"class":271},[265,2870,2871],{"class":437},"\"55\"",[265,2873,2630],{"class":271},[265,2875,2877,2879,2881,2883,2885,2887,2889,2891,2893],{"class":267,"line":2876},225,[265,2878,2322],{"class":271},[265,2880,2611],{"class":424},[265,2882,2614],{"class":369},[265,2884,434],{"class":271},[265,2886,2619],{"class":437},[265,2888,2622],{"class":369},[265,2890,434],{"class":271},[265,2892,2627],{"class":437},[265,2894,2630],{"class":271},[265,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914],{"class":267,"line":2897},226,[265,2899,2322],{"class":271},[265,2901,2611],{"class":424},[265,2903,2614],{"class":369},[265,2905,434],{"class":271},[265,2907,2644],{"class":437},[265,2909,2622],{"class":369},[265,2911,434],{"class":271},[265,2913,2651],{"class":437},[265,2915,2630],{"class":271},[265,2917,2919,2921,2923,2925,2927,2929,2931,2933,2935],{"class":267,"line":2918},227,[265,2920,2322],{"class":271},[265,2922,2611],{"class":424},[265,2924,2614],{"class":369},[265,2926,434],{"class":271},[265,2928,2667],{"class":437},[265,2930,2622],{"class":369},[265,2932,434],{"class":271},[265,2934,2674],{"class":437},[265,2936,2630],{"class":271},[265,2938,2940,2942,2944,2946,2948,2951,2953,2955,2958,2961,2963,2966],{"class":267,"line":2939},228,[265,2941,2322],{"class":271},[265,2943,2611],{"class":424},[265,2945,2622],{"class":369},[265,2947,434],{"class":271},[265,2949,2950],{"class":437},"\"操作\"",[265,2952,2866],{"class":369},[265,2954,434],{"class":271},[265,2956,2957],{"class":437},"\"60\"",[265,2959,2960],{"class":2528}," align",[265,2962,434],{"class":271},[265,2964,2965],{"class":437},"\"center\"",[265,2967,441],{"class":271},[265,2969,2971,2973,2975,2978,2981,2983,2986,2989,2991],{"class":267,"line":2970},229,[265,2972,2367],{"class":271},[265,2974,2175],{"class":424},[265,2976,2977],{"class":271}," #",[265,2979,2980],{"class":369},"default",[265,2982,434],{"class":271},[265,2984,2985],{"class":437},"\"",[265,2987,2988],{"class":271},"{ row }",[265,2990,2985],{"class":437},[265,2992,441],{"class":271},[265,2994,2996,2999,3001,3003,3005,3008,3010,3012,3014,3017],{"class":267,"line":2995},230,[265,2997,2998],{"class":271},"              \u003C",[265,3000,2752],{"class":424},[265,3002,481],{"class":369},[265,3004,434],{"class":271},[265,3006,3007],{"class":437},"\"danger\"",[265,3009,2762],{"class":369},[265,3011,2772],{"class":369},[265,3013,434],{"class":271},[265,3015,3016],{"class":437},"\"handleRemove(row)\"",[265,3018,441],{"class":271},[265,3020,3022],{"class":267,"line":3021},231,[265,3023,3024],{"class":271},"                删除\n",[265,3026,3028,3031,3033],{"class":267,"line":3027},232,[265,3029,3030],{"class":271},"              \u003C/",[265,3032,2752],{"class":424},[265,3034,441],{"class":271},[265,3036,3038,3041,3043],{"class":267,"line":3037},233,[265,3039,3040],{"class":271},"            \u003C/",[265,3042,2175],{"class":424},[265,3044,441],{"class":271},[265,3046,3048,3050,3052],{"class":267,"line":3047},234,[265,3049,2425],{"class":271},[265,3051,2611],{"class":424},[265,3053,441],{"class":271},[265,3055,3057,3059,3061],{"class":267,"line":3056},235,[265,3058,2488],{"class":271},[265,3060,2684],{"class":424},[265,3062,441],{"class":271},[265,3064,3066,3068,3070],{"class":267,"line":3065},236,[265,3067,2692],{"class":271},[265,3069,2266],{"class":424},[265,3071,441],{"class":271},[265,3073,3075,3078,3080],{"class":267,"line":3074},237,[265,3076,3077],{"class":271},"    \u003C/",[265,3079,2266],{"class":424},[265,3081,441],{"class":271},[265,3083,3085],{"class":267,"line":3084},238,[265,3086,473],{"emptyLinePlaceholder":331},[265,3088,3090,3092,3094,3096,3099],{"class":267,"line":3089},239,[265,3091,2263],{"class":271},[265,3093,2175],{"class":424},[265,3095,2977],{"class":271},[265,3097,3098],{"class":369},"footer",[265,3100,441],{"class":271},[265,3102,3104,3106,3108,3110,3112,3115],{"class":267,"line":3103},240,[265,3105,2288],{"class":271},[265,3107,2266],{"class":424},[265,3109,2269],{"class":369},[265,3111,434],{"class":271},[265,3113,3114],{"class":437},"\"flex gap-4 justify-end\"",[265,3116,441],{"class":271},[265,3118,3120,3122,3124,3126,3128,3131],{"class":267,"line":3119},241,[265,3121,2305],{"class":271},[265,3123,2752],{"class":424},[265,3125,2772],{"class":369},[265,3127,434],{"class":271},[265,3129,3130],{"class":437},"\"handleCancel\"",[265,3132,441],{"class":271},[265,3134,3136],{"class":267,"line":3135},242,[265,3137,3138],{"class":271},"          取消\n",[265,3140,3142,3144,3146],{"class":267,"line":3141},243,[265,3143,2488],{"class":271},[265,3145,2752],{"class":424},[265,3147,441],{"class":271},[265,3149,3151,3153,3155,3157,3159,3161,3163,3165,3168],{"class":267,"line":3150},244,[265,3152,2305],{"class":271},[265,3154,2752],{"class":424},[265,3156,481],{"class":369},[265,3158,434],{"class":271},[265,3160,2759],{"class":437},[265,3162,2772],{"class":369},[265,3164,434],{"class":271},[265,3166,3167],{"class":437},"\"handleConfirm\"",[265,3169,441],{"class":271},[265,3171,3173],{"class":267,"line":3172},245,[265,3174,3175],{"class":271},"          确定\n",[265,3177,3179,3181,3183],{"class":267,"line":3178},246,[265,3180,2488],{"class":271},[265,3182,2752],{"class":424},[265,3184,441],{"class":271},[265,3186,3188,3190,3192],{"class":267,"line":3187},247,[265,3189,2692],{"class":271},[265,3191,2266],{"class":424},[265,3193,441],{"class":271},[265,3195,3197,3199,3201],{"class":267,"line":3196},248,[265,3198,3077],{"class":271},[265,3200,2175],{"class":424},[265,3202,441],{"class":271},[265,3204,3206,3209,3212],{"class":267,"line":3205},249,[265,3207,3208],{"class":271},"  \u003C/",[265,3210,3211],{"class":424},"el-dialog",[265,3213,441],{"class":271},[265,3215,3217,3219,3221],{"class":267,"line":3216},250,[265,3218,2158],{"class":271},[265,3220,2175],{"class":424},[265,3222,441],{"class":271},[265,3224,3226],{"class":267,"line":3225},251,[265,3227,473],{"emptyLinePlaceholder":331},[265,3229,3231,3233,3235,3238,3240,3242,3245],{"class":267,"line":3230},252,[265,3232,421],{"class":271},[265,3234,305],{"class":424},[265,3236,3237],{"class":369}," scoped",[265,3239,431],{"class":369},[265,3241,434],{"class":271},[265,3243,3244],{"class":437},"\"scss\"",[265,3246,441],{"class":271},[265,3248,3250],{"class":267,"line":3249},253,[265,3251,3252],{"class":271},":deep(.el-table .el-table__row) {\n",[265,3254,3256],{"class":267,"line":3255},254,[265,3257,3258],{"class":271},"  .el-checkbox.is-disabled {\n",[265,3260,3262],{"class":267,"line":3261},255,[265,3263,3264],{"class":271},"    .el-checkbox__inner {\n",[265,3266,3268],{"class":267,"line":3267},256,[265,3269,3270],{"class":271},"      background-color: #f5f7fa;\n",[265,3272,3274],{"class":267,"line":3273},257,[265,3275,3276],{"class":271},"      border-color: #e4e7ed;\n",[265,3278,3280],{"class":267,"line":3279},258,[265,3281,1251],{"class":271},[265,3283,3285],{"class":267,"line":3284},259,[265,3286,1441],{"class":271},[265,3288,3290],{"class":267,"line":3289},260,[265,3291,540],{"class":271},[265,3293,3295,3297,3299],{"class":267,"line":3294},261,[265,3296,2158],{"class":271},[265,3298,305],{"class":424},[265,3300,441],{"class":271},[18,3302,3303],{},"但我想这正是组件封装容易走向的误区，不是封装不够，而是封装过度：当组件开始隐藏数据来源、主动处理副作用时，复杂度就开始变得不可控",[18,3305,3306,3307,3310,3311],{},"首先组件的输入不够明确，除了",[22,3308,3309],{},"defaultSelected, context,","还依赖",[22,3312,3313],{},"userStore",[18,3315,3316],{},"当然最重要的，组件承担了UI、数据请求、结果处理。这些组件内部的内容，让组件的可理解性变差，致使整个业务的复杂度并没有降低（我认为降低复杂度，旨在将大块业务拆离为可理解的部分，局部可理解后，才方便理解整体业务，整体复杂度随之降低）",[18,3318,3319],{},"所以，我进行了修改：让组件只负责UI，数据请求和确认逻辑还给外部",[256,3321,3323],{"className":412,"code":3322,"language":414,"meta":261,"style":261},"  \u003CTeacherSelector\n    :teachers=\"allTeachers\"\n    :subjects=\"subjectOptions\"\n    :selected=\"selectedTeachers\"\n    @search=\"handleSearch\"\n    @change=\"handleChange\"\n    @confirm=\"handleConfirm\"\n    @cancel=\"handleCancel\"\n  />\n",[22,3324,3325,3332,3350,3366,3381,3398,3414,3430,3446],{"__ignoreMap":261},[265,3326,3327,3329],{"class":267,"line":268},[265,3328,2183],{"class":271},[265,3330,3331],{"class":424},"TeacherSelector\n",[265,3333,3334,3337,3340,3342,3344,3347],{"class":267,"line":275},[265,3335,3336],{"class":271},"    :",[265,3338,3339],{"class":369},"teachers",[265,3341,434],{"class":271},[265,3343,2985],{"class":437},[265,3345,3346],{"class":271},"allTeachers",[265,3348,3349],{"class":437},"\"\n",[265,3351,3352,3354,3357,3359,3361,3364],{"class":267,"line":281},[265,3353,3336],{"class":271},[265,3355,3356],{"class":369},"subjects",[265,3358,434],{"class":271},[265,3360,2985],{"class":437},[265,3362,3363],{"class":271},"subjectOptions",[265,3365,3349],{"class":437},[265,3367,3368,3370,3372,3374,3376,3379],{"class":267,"line":309},[265,3369,3336],{"class":271},[265,3371,395],{"class":369},[265,3373,434],{"class":271},[265,3375,2985],{"class":437},[265,3377,3378],{"class":271},"selectedTeachers",[265,3380,3349],{"class":437},[265,3382,3383,3386,3389,3391,3393,3396],{"class":267,"line":323},[265,3384,3385],{"class":271},"    @",[265,3387,3388],{"class":369},"search",[265,3390,434],{"class":271},[265,3392,2985],{"class":437},[265,3394,3395],{"class":271},"handleSearch",[265,3397,3349],{"class":437},[265,3399,3400,3402,3405,3407,3409,3412],{"class":267,"line":493},[265,3401,3385],{"class":271},[265,3403,3404],{"class":369},"change",[265,3406,434],{"class":271},[265,3408,2985],{"class":437},[265,3410,3411],{"class":271},"handleChange",[265,3413,3349],{"class":437},[265,3415,3416,3418,3421,3423,3425,3428],{"class":267,"line":506},[265,3417,3385],{"class":271},[265,3419,3420],{"class":369},"confirm",[265,3422,434],{"class":271},[265,3424,2985],{"class":437},[265,3426,3427],{"class":271},"handleConfirm",[265,3429,3349],{"class":437},[265,3431,3432,3434,3437,3439,3441,3444],{"class":267,"line":517},[265,3433,3385],{"class":271},[265,3435,3436],{"class":369},"cancel",[265,3438,434],{"class":271},[265,3440,2985],{"class":437},[265,3442,3443],{"class":271},"handleCancel",[265,3445,3349],{"class":437},[265,3447,3448],{"class":267,"line":527},[265,3449,3450],{"class":271},"  />\n",[18,3452,3453,3454,3457],{},"子组件 ",[22,3455,3456],{},"TeacherSelector.vue","（只负责展示与交互）",[256,3459,3461],{"className":412,"code":3460,"language":414,"meta":261,"style":261},"\u003Cscript setup lang=\"ts\">\nimport { ElMessage } from 'element-plus'\nimport { computed, nextTick, ref } from 'vue'\n\nexport type TeacherItem = {\n  tenantUserId: string\n  userName?: string\n  userPhone?: string\n  schoolName?: string\n}\n\nexport type SubjectOption = { id: string, name: string }\n\nconst props = defineProps\u003C{\n  teachers: TeacherItem[]\n  subjects: SubjectOption[]\n  selected: TeacherItem[]\n}>()\n\nconst emit = defineEmits\u003C{\n  search: [payload: { subjectId: string, keyword: string }]\n  change: [selected: TeacherItem[]]\n  confirm: []\n  cancel: []\n}>()\n\nconst subjectId = ref('')\nconst keyword = ref('')\n\nconst leftTableRef = ref()\nconst rightSelection = ref\u003CTeacherItem[]>([])\n\nconst selectedIds = computed(() => new Set(props.selected.map(t => t.tenantUserId)))\n\nfunction checkSelectable(row: TeacherItem) {\n  return !selectedIds.value.has(row.tenantUserId)\n}\n\nfunction emitSearch() {\n  emit('search', { subjectId: subjectId.value, keyword: keyword.value })\n}\n\nfunction handleLeftSelectionChange(selection: TeacherItem[]) {\n  const next = [...props.selected]\n  for (const teacher of selection) {\n    if (!selectedIds.value.has(teacher.tenantUserId)) {\n      next.push({ ...teacher })\n    }\n  }\n  emit('change', next)\n  nextTick(() => leftTableRef.value?.clearSelection())\n}\n\nfunction handleRightSelectionChange(selection: TeacherItem[]) {\n  rightSelection.value = selection\n}\n\nfunction handleRemove(row: TeacherItem) {\n  emit(\n    'change',\n    props.selected.filter(t => t.tenantUserId !== row.tenantUserId),\n  )\n  rightSelection.value = rightSelection.value.filter(t => t.tenantUserId !== row.tenantUserId)\n}\n\nfunction handleBatchRemove() {\n  if (rightSelection.value.length === 0) {\n    ElMessage.warning('请先选择要删除的教师')\n    return\n  }\n  const removeIds = new Set(rightSelection.value.map(t => t.tenantUserId))\n  emit('change', props.selected.filter(t => !removeIds.has(t.tenantUserId)))\n  rightSelection.value = []\n}\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"grid grid-cols-[1fr_1fr] gap-[20px] h-[550px]\">\n    \u003Cdiv>\n      \u003Cdiv class=\"flex items-center mb-[10px] gap-[10px]\">\n        \u003Cel-select\n          v-model=\"subjectId\"\n          placeholder=\"科目选择\"\n          clearable\n          class=\"w-[200px]!\"\n          @change=\"emitSearch\"\n        >\n          \u003Cel-option\n            v-for=\"item in subjects\"\n            :key=\"item.id\"\n            :label=\"item.name\"\n            :value=\"item.id\"\n          />\n        \u003C/el-select>\n        \u003Cel-input\n          v-model=\"keyword\"\n          placeholder=\"请输入姓名或账号进行搜索\"\n          clearable\n          @change=\"emitSearch\"\n        />\n      \u003C/div>\n      \u003Cel-table\n        ref=\"leftTableRef\"\n        :data=\"teachers\"\n        border\n        max-height=\"500\"\n        @selection-change=\"handleLeftSelectionChange\"\n      >\n        \u003Cel-table-column type=\"selection\" width=\"55\" :selectable=\"checkSelectable\" />\n        \u003Cel-table-column prop=\"userName\" label=\"姓名\" />\n        \u003Cel-table-column prop=\"userPhone\" label=\"联系方式\" />\n        \u003Cel-table-column prop=\"schoolName\" label=\"学校\" />\n      \u003C/el-table>\n    \u003C/div>\n\n    \u003Cdiv>\n      \u003Cdiv class=\"mb-[10px] font-bold text-[#027AFF] flex h-[32px] leading-[32px]\">\n        已选教师\n        \u003Cel-button type=\"primary\" link class=\"ml-auto\" @click=\"handleBatchRemove\">\n          删除选中教师\n        \u003C/el-button>\n      \u003C/div>\n      \u003Cel-table\n        :data=\"selected\"\n        border\n        max-height=\"500\"\n        @selection-change=\"handleRightSelectionChange\"\n      >\n        \u003Cel-table-column type=\"selection\" width=\"55\" />\n        \u003Cel-table-column prop=\"userName\" label=\"姓名\" />\n        \u003Cel-table-column prop=\"userPhone\" label=\"联系方式\" />\n        \u003Cel-table-column prop=\"schoolName\" label=\"学校\" />\n        \u003Cel-table-column label=\"操作\" width=\"60\" align=\"center\">\n          \u003Ctemplate #default=\"{ row }\">\n            \u003Cel-button type=\"danger\" link @click=\"handleRemove(row)\">\n              删除\n            \u003C/el-button>\n          \u003C/template>\n        \u003C/el-table-column>\n      \u003C/el-table>\n    \u003C/div>\n  \u003C/div>\n\n  \u003Cdiv class=\"flex gap-4 justify-end mt-4\">\n    \u003Cel-button @click=\"emit('cancel')\">\n      取消\n    \u003C/el-button>\n    \u003Cel-button type=\"primary\" @click=\"emit('confirm')\">\n      确定\n    \u003C/el-button>\n  \u003C/div>\n\u003C/template>\n",[22,3462,3463,3479,3491,3503,3507,3519,3527,3535,3543,3551,3555,3559,3591,3595,3610,3621,3632,3643,3648,3652,3666,3700,3718,3727,3736,3740,3744,3761,3778,3782,3794,3810,3814,3845,3849,3865,3877,3881,3885,3894,3907,3911,3915,3931,3947,3965,3979,3992,3996,4000,4012,4028,4032,4036,4052,4060,4064,4068,4084,4091,4098,4119,4124,4147,4151,4155,4163,4177,4189,4193,4197,4221,4249,4257,4261,4269,4273,4281,4295,4303,4317,4324,4334,4344,4349,4359,4369,4373,4379,4389,4398,4407,4416,4420,4428,4434,4443,4451,4455,4463,4468,4476,4482,4491,4501,4506,4515,4524,4529,4557,4577,4597,4617,4625,4633,4637,4645,4659,4664,4692,4697,4705,4713,4719,4728,4732,4740,4748,4752,4772,4792,4812,4832,4858,4878,4900,4905,4913,4921,4929,4937,4945,4953,4957,4972,4987,4992,5000,5021,5026,5034,5042],{"__ignoreMap":261},[265,3464,3465,3467,3469,3471,3473,3475,3477],{"class":267,"line":268},[265,3466,421],{"class":271},[265,3468,425],{"class":424},[265,3470,428],{"class":369},[265,3472,431],{"class":369},[265,3474,434],{"class":271},[265,3476,438],{"class":437},[265,3478,441],{"class":271},[265,3480,3481,3483,3486,3488],{"class":267,"line":275},[265,3482,447],{"class":446},[265,3484,3485],{"class":271}," { ElMessage } ",[265,3487,453],{"class":446},[265,3489,3490],{"class":437}," 'element-plus'\n",[265,3492,3493,3495,3498,3500],{"class":267,"line":281},[265,3494,447],{"class":446},[265,3496,3497],{"class":271}," { computed, nextTick, ref } ",[265,3499,453],{"class":446},[265,3501,3502],{"class":437}," 'vue'\n",[265,3504,3505],{"class":267,"line":309},[265,3506,473],{"emptyLinePlaceholder":331},[265,3508,3509,3511,3513,3515,3517],{"class":267,"line":323},[265,3510,478],{"class":446},[265,3512,481],{"class":446},[265,3514,484],{"class":369},[265,3516,487],{"class":446},[265,3518,490],{"class":271},[265,3520,3521,3523,3525],{"class":267,"line":493},[265,3522,496],{"class":394},[265,3524,499],{"class":446},[265,3526,503],{"class":502},[265,3528,3529,3531,3533],{"class":267,"line":506},[265,3530,509],{"class":394},[265,3532,512],{"class":446},[265,3534,503],{"class":502},[265,3536,3537,3539,3541],{"class":267,"line":517},[265,3538,520],{"class":394},[265,3540,512],{"class":446},[265,3542,503],{"class":502},[265,3544,3545,3547,3549],{"class":267,"line":527},[265,3546,530],{"class":394},[265,3548,512],{"class":446},[265,3550,503],{"class":502},[265,3552,3553],{"class":267,"line":537},[265,3554,540],{"class":271},[265,3556,3557],{"class":267,"line":543},[265,3558,473],{"emptyLinePlaceholder":331},[265,3560,3561,3563,3565,3567,3569,3571,3574,3576,3579,3581,3584,3586,3588],{"class":267,"line":548},[265,3562,478],{"class":446},[265,3564,481],{"class":446},[265,3566,554],{"class":369},[265,3568,487],{"class":446},[265,3570,846],{"class":271},[265,3572,3573],{"class":394},"id",[265,3575,499],{"class":446},[265,3577,3578],{"class":502}," string",[265,3580,1824],{"class":271},[265,3582,3583],{"class":394},"name",[265,3585,499],{"class":446},[265,3587,3578],{"class":502},[265,3589,3590],{"class":271}," }\n",[265,3592,3593],{"class":267,"line":561},[265,3594,473],{"emptyLinePlaceholder":331},[265,3596,3597,3599,3602,3604,3607],{"class":267,"line":571},[265,3598,594],{"class":446},[265,3600,3601],{"class":502}," props",[265,3603,487],{"class":446},[265,3605,3606],{"class":369}," defineProps",[265,3608,3609],{"class":271},"\u003C{\n",[265,3611,3612,3615,3617,3619],{"class":267,"line":581},[265,3613,3614],{"class":394},"  teachers",[265,3616,499],{"class":446},[265,3618,484],{"class":369},[265,3620,1719],{"class":271},[265,3622,3623,3626,3628,3630],{"class":267,"line":586},[265,3624,3625],{"class":394},"  subjects",[265,3627,499],{"class":446},[265,3629,554],{"class":369},[265,3631,1719],{"class":271},[265,3633,3634,3637,3639,3641],{"class":267,"line":591},[265,3635,3636],{"class":394},"  selected",[265,3638,499],{"class":446},[265,3640,484],{"class":369},[265,3642,1719],{"class":271},[265,3644,3645],{"class":267,"line":608},[265,3646,3647],{"class":271},"}>()\n",[265,3649,3650],{"class":267,"line":613},[265,3651,473],{"emptyLinePlaceholder":331},[265,3653,3654,3656,3659,3661,3664],{"class":267,"line":620},[265,3655,594],{"class":446},[265,3657,3658],{"class":502}," emit",[265,3660,487],{"class":446},[265,3662,3663],{"class":369}," defineEmits",[265,3665,3609],{"class":271},[265,3667,3668,3671,3673,3675,3678,3681,3684,3686,3688,3690,3693,3695,3697],{"class":267,"line":641},[265,3669,3670],{"class":394},"  search",[265,3672,499],{"class":446},[265,3674,1876],{"class":271},[265,3676,3677],{"class":369},"payload",[265,3679,3680],{"class":271},": { ",[265,3682,3683],{"class":394},"subjectId",[265,3685,499],{"class":446},[265,3687,3578],{"class":502},[265,3689,1824],{"class":271},[265,3691,3692],{"class":394},"keyword",[265,3694,499],{"class":446},[265,3696,3578],{"class":502},[265,3698,3699],{"class":271}," }]\n",[265,3701,3702,3705,3707,3709,3711,3713,3715],{"class":267,"line":646},[265,3703,3704],{"class":394},"  change",[265,3706,499],{"class":446},[265,3708,1876],{"class":271},[265,3710,395],{"class":369},[265,3712,1815],{"class":271},[265,3714,918],{"class":369},[265,3716,3717],{"class":271},"[]]\n",[265,3719,3720,3723,3725],{"class":267,"line":652},[265,3721,3722],{"class":394},"  confirm",[265,3724,499],{"class":446},[265,3726,1580],{"class":271},[265,3728,3729,3732,3734],{"class":267,"line":677},[265,3730,3731],{"class":394},"  cancel",[265,3733,499],{"class":446},[265,3735,1580],{"class":271},[265,3737,3738],{"class":267,"line":682},[265,3739,3647],{"class":271},[265,3741,3742],{"class":267,"line":688},[265,3743,473],{"emptyLinePlaceholder":331},[265,3745,3746,3748,3751,3753,3755,3757,3759],{"class":267,"line":741},[265,3747,594],{"class":446},[265,3749,3750],{"class":502}," subjectId",[265,3752,487],{"class":446},[265,3754,630],{"class":369},[265,3756,391],{"class":271},[265,3758,766],{"class":437},[265,3760,638],{"class":271},[265,3762,3763,3765,3768,3770,3772,3774,3776],{"class":267,"line":746},[265,3764,594],{"class":446},[265,3766,3767],{"class":502}," keyword",[265,3769,487],{"class":446},[265,3771,630],{"class":369},[265,3773,391],{"class":271},[265,3775,766],{"class":437},[265,3777,638],{"class":271},[265,3779,3780],{"class":267,"line":752},[265,3781,473],{"emptyLinePlaceholder":331},[265,3783,3784,3786,3788,3790,3792],{"class":267,"line":771},[265,3785,594],{"class":446},[265,3787,1026],{"class":502},[265,3789,487],{"class":446},[265,3791,630],{"class":369},[265,3793,605],{"class":271},[265,3795,3796,3798,3800,3802,3804,3806,3808],{"class":267,"line":789},[265,3797,594],{"class":446},[265,3799,997],{"class":502},[265,3801,487],{"class":446},[265,3803,630],{"class":369},[265,3805,421],{"class":271},[265,3807,918],{"class":369},[265,3809,817],{"class":271},[265,3811,3812],{"class":267,"line":794},[265,3813,473],{"emptyLinePlaceholder":331},[265,3815,3816,3818,3820,3822,3824,3826,3828,3830,3832,3835,3837,3839,3841,3843],{"class":267,"line":800},[265,3817,594],{"class":446},[265,3819,1051],{"class":502},[265,3821,487],{"class":446},[265,3823,1056],{"class":369},[265,3825,1059],{"class":271},[265,3827,722],{"class":446},[265,3829,1064],{"class":446},[265,3831,1067],{"class":369},[265,3833,3834],{"class":271},"(props.selected.",[265,3836,1073],{"class":369},[265,3838,391],{"class":271},[265,3840,1078],{"class":394},[265,3842,1081],{"class":446},[265,3844,1084],{"class":271},[265,3846,3847],{"class":267,"line":820},[265,3848,473],{"emptyLinePlaceholder":331},[265,3850,3851,3853,3855,3857,3859,3861,3863],{"class":267,"line":825},[265,3852,1101],{"class":446},[265,3854,1104],{"class":369},[265,3856,391],{"class":271},[265,3858,1109],{"class":394},[265,3860,499],{"class":446},[265,3862,484],{"class":369},[265,3864,1116],{"class":271},[265,3866,3867,3869,3871,3873,3875],{"class":267,"line":840},[265,3868,1122],{"class":446},[265,3870,1125],{"class":446},[265,3872,1128],{"class":271},[265,3874,1131],{"class":369},[265,3876,1134],{"class":271},[265,3878,3879],{"class":267,"line":865},[265,3880,540],{"class":271},[265,3882,3883],{"class":267,"line":871},[265,3884,473],{"emptyLinePlaceholder":331},[265,3886,3887,3889,3892],{"class":267,"line":877},[265,3888,1101],{"class":446},[265,3890,3891],{"class":369}," emitSearch",[265,3893,837],{"class":271},[265,3895,3896,3899,3901,3904],{"class":267,"line":888},[265,3897,3898],{"class":369},"  emit",[265,3900,391],{"class":271},[265,3902,3903],{"class":437},"'search'",[265,3905,3906],{"class":271},", { subjectId: subjectId.value, keyword: keyword.value })\n",[265,3908,3909],{"class":267,"line":893},[265,3910,540],{"class":271},[265,3912,3913],{"class":267,"line":898},[265,3914,473],{"emptyLinePlaceholder":331},[265,3916,3917,3919,3921,3923,3925,3927,3929],{"class":267,"line":904},[265,3918,1101],{"class":446},[265,3920,1158],{"class":369},[265,3922,391],{"class":271},[265,3924,1163],{"class":394},[265,3926,499],{"class":446},[265,3928,484],{"class":369},[265,3930,1170],{"class":271},[265,3932,3933,3935,3938,3940,3942,3944],{"class":267,"line":923},[265,3934,843],{"class":446},[265,3936,3937],{"class":502}," next",[265,3939,487],{"class":446},[265,3941,1876],{"class":271},[265,3943,1242],{"class":446},[265,3945,3946],{"class":271},"props.selected]\n",[265,3948,3949,3952,3954,3956,3959,3962],{"class":267,"line":928},[265,3950,3951],{"class":446},"  for",[265,3953,1217],{"class":271},[265,3955,594],{"class":446},[265,3957,3958],{"class":502}," teacher",[265,3960,3961],{"class":446}," of",[265,3963,3964],{"class":271}," selection) {\n",[265,3966,3967,3969,3971,3973,3975,3977],{"class":267,"line":934},[265,3968,1214],{"class":446},[265,3970,1217],{"class":271},[265,3972,1220],{"class":446},[265,3974,1128],{"class":271},[265,3976,1131],{"class":369},[265,3978,1227],{"class":271},[265,3980,3981,3984,3986,3988,3990],{"class":267,"line":952},[265,3982,3983],{"class":271},"      next.",[265,3985,1236],{"class":369},[265,3987,1239],{"class":271},[265,3989,1242],{"class":446},[265,3991,1245],{"class":271},[265,3993,3994],{"class":267,"line":957},[265,3995,1251],{"class":271},[265,3997,3998],{"class":267,"line":963},[265,3999,1441],{"class":271},[265,4001,4002,4004,4006,4009],{"class":267,"line":981},[265,4003,3898],{"class":369},[265,4005,391],{"class":271},[265,4007,4008],{"class":437},"'change'",[265,4010,4011],{"class":271},", next)\n",[265,4013,4014,4016,4018,4020,4023,4025],{"class":267,"line":986},[265,4015,1268],{"class":369},[265,4017,1059],{"class":271},[265,4019,722],{"class":446},[265,4021,4022],{"class":271}," leftTableRef.value?.",[265,4024,1283],{"class":369},[265,4026,4027],{"class":271},"())\n",[265,4029,4030],{"class":267,"line":992},[265,4031,540],{"class":271},[265,4033,4034],{"class":267,"line":1010},[265,4035,473],{"emptyLinePlaceholder":331},[265,4037,4038,4040,4042,4044,4046,4048,4050],{"class":267,"line":1015},[265,4039,1101],{"class":446},[265,4041,1314],{"class":369},[265,4043,391],{"class":271},[265,4045,1163],{"class":394},[265,4047,499],{"class":446},[265,4049,484],{"class":369},[265,4051,1170],{"class":271},[265,4053,4054,4056,4058],{"class":267,"line":1021},[265,4055,1330],{"class":271},[265,4057,434],{"class":446},[265,4059,1181],{"class":271},[265,4061,4062],{"class":267,"line":1035},[265,4063,540],{"class":271},[265,4065,4066],{"class":267,"line":1040},[265,4067,473],{"emptyLinePlaceholder":331},[265,4069,4070,4072,4074,4076,4078,4080,4082],{"class":267,"line":1046},[265,4071,1101],{"class":446},[265,4073,1358],{"class":369},[265,4075,391],{"class":271},[265,4077,1109],{"class":394},[265,4079,499],{"class":446},[265,4081,484],{"class":369},[265,4083,1116],{"class":271},[265,4085,4086,4088],{"class":267,"line":1087},[265,4087,3898],{"class":369},[265,4089,4090],{"class":271},"(\n",[265,4092,4093,4096],{"class":267,"line":1092},[265,4094,4095],{"class":437},"    'change'",[265,4097,1980],{"class":271},[265,4099,4100,4103,4105,4107,4109,4111,4113,4116],{"class":267,"line":1098},[265,4101,4102],{"class":271},"    props.selected.",[265,4104,1554],{"class":369},[265,4106,391],{"class":271},[265,4108,1078],{"class":394},[265,4110,1081],{"class":446},[265,4112,1393],{"class":271},[265,4114,4115],{"class":446},"!==",[265,4117,4118],{"class":271}," row.tenantUserId),\n",[265,4120,4121],{"class":267,"line":1119},[265,4122,4123],{"class":271},"  )\n",[265,4125,4126,4128,4130,4133,4135,4137,4139,4141,4143,4145],{"class":267,"line":1137},[265,4127,1330],{"class":271},[265,4129,434],{"class":446},[265,4131,4132],{"class":271}," rightSelection.value.",[265,4134,1554],{"class":369},[265,4136,391],{"class":271},[265,4138,1078],{"class":394},[265,4140,1081],{"class":446},[265,4142,1393],{"class":271},[265,4144,4115],{"class":446},[265,4146,1399],{"class":271},[265,4148,4149],{"class":267,"line":1142},[265,4150,540],{"class":271},[265,4152,4153],{"class":267,"line":1147},[265,4154,473],{"emptyLinePlaceholder":331},[265,4156,4157,4159,4161],{"class":267,"line":1153},[265,4158,1101],{"class":446},[265,4160,1465],{"class":369},[265,4162,837],{"class":271},[265,4164,4165,4167,4169,4171,4173,4175],{"class":267,"line":1173},[265,4166,1405],{"class":446},[265,4168,1475],{"class":271},[265,4170,1478],{"class":502},[265,4172,1481],{"class":446},[265,4174,1484],{"class":502},[265,4176,1116],{"class":271},[265,4178,4179,4181,4183,4185,4187],{"class":267,"line":1184},[265,4180,1492],{"class":271},[265,4182,1495],{"class":369},[265,4184,391],{"class":271},[265,4186,1500],{"class":437},[265,4188,638],{"class":271},[265,4190,4191],{"class":267,"line":1190},[265,4192,1508],{"class":446},[265,4194,4195],{"class":267,"line":1211},[265,4196,1441],{"class":271},[265,4198,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219],{"class":267,"line":1230},[265,4200,843],{"class":446},[265,4202,1521],{"class":502},[265,4204,487],{"class":446},[265,4206,1064],{"class":446},[265,4208,1067],{"class":369},[265,4210,1530],{"class":271},[265,4212,1073],{"class":369},[265,4214,391],{"class":271},[265,4216,1078],{"class":394},[265,4218,1081],{"class":446},[265,4220,1541],{"class":271},[265,4222,4223,4225,4227,4229,4232,4234,4236,4238,4240,4242,4244,4246],{"class":267,"line":1248},[265,4224,3898],{"class":369},[265,4226,391],{"class":271},[265,4228,4008],{"class":437},[265,4230,4231],{"class":271},", props.selected.",[265,4233,1554],{"class":369},[265,4235,391],{"class":271},[265,4237,1078],{"class":394},[265,4239,1081],{"class":446},[265,4241,1125],{"class":446},[265,4243,1565],{"class":271},[265,4245,1131],{"class":369},[265,4247,4248],{"class":271},"(t.tenantUserId)))\n",[265,4250,4251,4253,4255],{"class":267,"line":1254},[265,4252,1330],{"class":271},[265,4254,434],{"class":446},[265,4256,1580],{"class":271},[265,4258,4259],{"class":267,"line":1259},[265,4260,540],{"class":271},[265,4262,4263,4265,4267],{"class":267,"line":1265},[265,4264,2158],{"class":271},[265,4266,425],{"class":424},[265,4268,441],{"class":271},[265,4270,4271],{"class":267,"line":1277},[265,4272,473],{"emptyLinePlaceholder":331},[265,4274,4275,4277,4279],{"class":267,"line":1288},[265,4276,421],{"class":271},[265,4278,2175],{"class":424},[265,4280,441],{"class":271},[265,4282,4283,4285,4287,4289,4291,4293],{"class":267,"line":1293},[265,4284,2183],{"class":271},[265,4286,2266],{"class":424},[265,4288,2269],{"class":369},[265,4290,434],{"class":271},[265,4292,2274],{"class":437},[265,4294,441],{"class":271},[265,4296,4297,4299,4301],{"class":267,"line":1298},[265,4298,2263],{"class":271},[265,4300,2266],{"class":424},[265,4302,441],{"class":271},[265,4304,4305,4307,4309,4311,4313,4315],{"class":267,"line":1303},[265,4306,2288],{"class":271},[265,4308,2266],{"class":424},[265,4310,2269],{"class":369},[265,4312,434],{"class":271},[265,4314,2314],{"class":437},[265,4316,441],{"class":271},[265,4318,4319,4321],{"class":267,"line":1309},[265,4320,2305],{"class":271},[265,4322,4323],{"class":424},"el-select\n",[265,4325,4326,4329,4331],{"class":267,"line":1327},[265,4327,4328],{"class":369},"          v-model",[265,4330,434],{"class":271},[265,4332,4333],{"class":437},"\"subjectId\"\n",[265,4335,4336,4339,4341],{"class":267,"line":1337},[265,4337,4338],{"class":369},"          placeholder",[265,4340,434],{"class":271},[265,4342,4343],{"class":437},"\"科目选择\"\n",[265,4345,4346],{"class":267,"line":1342},[265,4347,4348],{"class":369},"          clearable\n",[265,4350,4351,4354,4356],{"class":267,"line":1347},[265,4352,4353],{"class":369},"          class",[265,4355,434],{"class":271},[265,4357,4358],{"class":437},"\"w-[200px]!\"\n",[265,4360,4361,4364,4366],{"class":267,"line":1353},[265,4362,4363],{"class":369},"          @change",[265,4365,434],{"class":271},[265,4367,4368],{"class":437},"\"emitSearch\"\n",[265,4370,4371],{"class":267,"line":1371},[265,4372,2557],{"class":271},[265,4374,4375,4377],{"class":267,"line":1402},[265,4376,2322],{"class":271},[265,4378,2370],{"class":424},[265,4380,4381,4384,4386],{"class":267,"line":1422},[265,4382,4383],{"class":369},"            v-for",[265,4385,434],{"class":271},[265,4387,4388],{"class":437},"\"item in subjects\"\n",[265,4390,4391,4394,4396],{"class":267,"line":1438},[265,4392,4393],{"class":369},"            :key",[265,4395,434],{"class":271},[265,4397,2392],{"class":437},[265,4399,4400,4403,4405],{"class":267,"line":1444},[265,4401,4402],{"class":369},"            :label",[265,4404,434],{"class":271},[265,4406,2403],{"class":437},[265,4408,4409,4412,4414],{"class":267,"line":1449},[265,4410,4411],{"class":369},"            :value",[265,4413,434],{"class":271},[265,4415,2392],{"class":437},[265,4417,4418],{"class":267,"line":1454},[265,4419,2482],{"class":271},[265,4421,4422,4424,4426],{"class":267,"line":1460},[265,4423,2488],{"class":271},[265,4425,2325],{"class":424},[265,4427,441],{"class":271},[265,4429,4430,4432],{"class":267,"line":1470},[265,4431,2305],{"class":271},[265,4433,2437],{"class":424},[265,4435,4436,4438,4440],{"class":267,"line":1489},[265,4437,4328],{"class":369},[265,4439,434],{"class":271},[265,4441,4442],{"class":437},"\"keyword\"\n",[265,4444,4445,4447,4449],{"class":267,"line":1505},[265,4446,4338],{"class":369},[265,4448,434],{"class":271},[265,4450,2459],{"class":437},[265,4452,4453],{"class":267,"line":1511},[265,4454,4348],{"class":369},[265,4456,4457,4459,4461],{"class":267,"line":1516},[265,4458,4363],{"class":369},[265,4460,434],{"class":271},[265,4462,4368],{"class":437},[265,4464,4465],{"class":267,"line":1544},[265,4466,4467],{"class":271},"        />\n",[265,4469,4470,4472,4474],{"class":267,"line":1573},[265,4471,2692],{"class":271},[265,4473,2266],{"class":424},[265,4475,441],{"class":271},[265,4477,4478,4480],{"class":267,"line":1583},[265,4479,2288],{"class":271},[265,4481,2500],{"class":424},[265,4483,4484,4487,4489],{"class":267,"line":1588},[265,4485,4486],{"class":369},"        ref",[265,4488,434],{"class":271},[265,4490,2511],{"class":437},[265,4492,4493,4496,4498],{"class":267,"line":1593},[265,4494,4495],{"class":369},"        :data",[265,4497,434],{"class":271},[265,4499,4500],{"class":437},"\"teachers\"\n",[265,4502,4503],{"class":267,"line":1599},[265,4504,4505],{"class":2528},"        border\n",[265,4507,4508,4511,4513],{"class":267,"line":1609},[265,4509,4510],{"class":369},"        max-height",[265,4512,434],{"class":271},[265,4514,2540],{"class":437},[265,4516,4517,4520,4522],{"class":267,"line":1620},[265,4518,4519],{"class":369},"        @selection-change",[265,4521,434],{"class":271},[265,4523,2551],{"class":437},[265,4525,4526],{"class":267,"line":1625},[265,4527,4528],{"class":271},"      >\n",[265,4530,4531,4533,4535,4537,4539,4541,4543,4545,4547,4550,4552,4555],{"class":267,"line":1630},[265,4532,2305],{"class":271},[265,4534,2611],{"class":424},[265,4536,481],{"class":369},[265,4538,434],{"class":271},[265,4540,2863],{"class":437},[265,4542,2866],{"class":369},[265,4544,434],{"class":271},[265,4546,2871],{"class":437},[265,4548,4549],{"class":369}," :selectable",[265,4551,434],{"class":271},[265,4553,4554],{"class":437},"\"checkSelectable\"",[265,4556,2630],{"class":271},[265,4558,4559,4561,4563,4565,4567,4569,4571,4573,4575],{"class":267,"line":1636},[265,4560,2305],{"class":271},[265,4562,2611],{"class":424},[265,4564,2614],{"class":369},[265,4566,434],{"class":271},[265,4568,2619],{"class":437},[265,4570,2622],{"class":369},[265,4572,434],{"class":271},[265,4574,2627],{"class":437},[265,4576,2630],{"class":271},[265,4578,4579,4581,4583,4585,4587,4589,4591,4593,4595],{"class":267,"line":1646},[265,4580,2305],{"class":271},[265,4582,2611],{"class":424},[265,4584,2614],{"class":369},[265,4586,434],{"class":271},[265,4588,2644],{"class":437},[265,4590,2622],{"class":369},[265,4592,434],{"class":271},[265,4594,2651],{"class":437},[265,4596,2630],{"class":271},[265,4598,4599,4601,4603,4605,4607,4609,4611,4613,4615],{"class":267,"line":1654},[265,4600,2305],{"class":271},[265,4602,2611],{"class":424},[265,4604,2614],{"class":369},[265,4606,434],{"class":271},[265,4608,2667],{"class":437},[265,4610,2622],{"class":369},[265,4612,434],{"class":271},[265,4614,2674],{"class":437},[265,4616,2630],{"class":271},[265,4618,4619,4621,4623],{"class":267,"line":1668},[265,4620,2692],{"class":271},[265,4622,2684],{"class":424},[265,4624,441],{"class":271},[265,4626,4627,4629,4631],{"class":267,"line":1673},[265,4628,3077],{"class":271},[265,4630,2266],{"class":424},[265,4632,441],{"class":271},[265,4634,4635],{"class":267,"line":1682},[265,4636,473],{"emptyLinePlaceholder":331},[265,4638,4639,4641,4643],{"class":267,"line":1687},[265,4640,2263],{"class":271},[265,4642,2266],{"class":424},[265,4644,441],{"class":271},[265,4646,4647,4649,4651,4653,4655,4657],{"class":267,"line":1692},[265,4648,2288],{"class":271},[265,4650,2266],{"class":424},[265,4652,2269],{"class":369},[265,4654,434],{"class":271},[265,4656,2736],{"class":437},[265,4658,441],{"class":271},[265,4660,4661],{"class":267,"line":1698},[265,4662,4663],{"class":271},"        已选教师\n",[265,4665,4666,4668,4670,4672,4674,4676,4678,4680,4682,4684,4686,4688,4690],{"class":267,"line":1709},[265,4667,2305],{"class":271},[265,4669,2752],{"class":424},[265,4671,481],{"class":369},[265,4673,434],{"class":271},[265,4675,2759],{"class":437},[265,4677,2762],{"class":369},[265,4679,2269],{"class":369},[265,4681,434],{"class":271},[265,4683,2769],{"class":437},[265,4685,2772],{"class":369},[265,4687,434],{"class":271},[265,4689,2777],{"class":437},[265,4691,441],{"class":271},[265,4693,4694],{"class":267,"line":1722},[265,4695,4696],{"class":271},"          删除选中教师\n",[265,4698,4699,4701,4703],{"class":267,"line":1733},[265,4700,2488],{"class":271},[265,4702,2752],{"class":424},[265,4704,441],{"class":271},[265,4706,4707,4709,4711],{"class":267,"line":1763},[265,4708,2692],{"class":271},[265,4710,2266],{"class":424},[265,4712,441],{"class":271},[265,4714,4715,4717],{"class":267,"line":1768},[265,4716,2288],{"class":271},[265,4718,2500],{"class":424},[265,4720,4721,4723,4725],{"class":267,"line":1773},[265,4722,4495],{"class":369},[265,4724,434],{"class":271},[265,4726,4727],{"class":437},"\"selected\"\n",[265,4729,4730],{"class":267,"line":1797},[265,4731,4505],{"class":2528},[265,4733,4734,4736,4738],{"class":267,"line":1837},[265,4735,4510],{"class":369},[265,4737,434],{"class":271},[265,4739,2540],{"class":437},[265,4741,4742,4744,4746],{"class":267,"line":1842},[265,4743,4519],{"class":369},[265,4745,434],{"class":271},[265,4747,2844],{"class":437},[265,4749,4750],{"class":267,"line":1853},[265,4751,4528],{"class":271},[265,4753,4754,4756,4758,4760,4762,4764,4766,4768,4770],{"class":267,"line":1869},[265,4755,2305],{"class":271},[265,4757,2611],{"class":424},[265,4759,481],{"class":369},[265,4761,434],{"class":271},[265,4763,2863],{"class":437},[265,4765,2866],{"class":369},[265,4767,434],{"class":271},[265,4769,2871],{"class":437},[265,4771,2630],{"class":271},[265,4773,4774,4776,4778,4780,4782,4784,4786,4788,4790],{"class":267,"line":1884},[265,4775,2305],{"class":271},[265,4777,2611],{"class":424},[265,4779,2614],{"class":369},[265,4781,434],{"class":271},[265,4783,2619],{"class":437},[265,4785,2622],{"class":369},[265,4787,434],{"class":271},[265,4789,2627],{"class":437},[265,4791,2630],{"class":271},[265,4793,4794,4796,4798,4800,4802,4804,4806,4808,4810],{"class":267,"line":1889},[265,4795,2305],{"class":271},[265,4797,2611],{"class":424},[265,4799,2614],{"class":369},[265,4801,434],{"class":271},[265,4803,2644],{"class":437},[265,4805,2622],{"class":369},[265,4807,434],{"class":271},[265,4809,2651],{"class":437},[265,4811,2630],{"class":271},[265,4813,4814,4816,4818,4820,4822,4824,4826,4828,4830],{"class":267,"line":1899},[265,4815,2305],{"class":271},[265,4817,2611],{"class":424},[265,4819,2614],{"class":369},[265,4821,434],{"class":271},[265,4823,2667],{"class":437},[265,4825,2622],{"class":369},[265,4827,434],{"class":271},[265,4829,2674],{"class":437},[265,4831,2630],{"class":271},[265,4833,4834,4836,4838,4840,4842,4844,4846,4848,4850,4852,4854,4856],{"class":267,"line":1910},[265,4835,2305],{"class":271},[265,4837,2611],{"class":424},[265,4839,2622],{"class":369},[265,4841,434],{"class":271},[265,4843,2950],{"class":437},[265,4845,2866],{"class":369},[265,4847,434],{"class":271},[265,4849,2957],{"class":437},[265,4851,2960],{"class":2528},[265,4853,434],{"class":271},[265,4855,2965],{"class":437},[265,4857,441],{"class":271},[265,4859,4860,4862,4864,4866,4868,4870,4872,4874,4876],{"class":267,"line":1919},[265,4861,2322],{"class":271},[265,4863,2175],{"class":424},[265,4865,2977],{"class":271},[265,4867,2980],{"class":369},[265,4869,434],{"class":271},[265,4871,2985],{"class":437},[265,4873,2988],{"class":271},[265,4875,2985],{"class":437},[265,4877,441],{"class":271},[265,4879,4880,4882,4884,4886,4888,4890,4892,4894,4896,4898],{"class":267,"line":1924},[265,4881,2367],{"class":271},[265,4883,2752],{"class":424},[265,4885,481],{"class":369},[265,4887,434],{"class":271},[265,4889,3007],{"class":437},[265,4891,2762],{"class":369},[265,4893,2772],{"class":369},[265,4895,434],{"class":271},[265,4897,3016],{"class":437},[265,4899,441],{"class":271},[265,4901,4902],{"class":267,"line":1929},[265,4903,4904],{"class":271},"              删除\n",[265,4906,4907,4909,4911],{"class":267,"line":1935},[265,4908,3040],{"class":271},[265,4910,2752],{"class":424},[265,4912,441],{"class":271},[265,4914,4915,4917,4919],{"class":267,"line":1946},[265,4916,2425],{"class":271},[265,4918,2175],{"class":424},[265,4920,441],{"class":271},[265,4922,4923,4925,4927],{"class":267,"line":1966},[265,4924,2488],{"class":271},[265,4926,2611],{"class":424},[265,4928,441],{"class":271},[265,4930,4931,4933,4935],{"class":267,"line":1971},[265,4932,2692],{"class":271},[265,4934,2684],{"class":424},[265,4936,441],{"class":271},[265,4938,4939,4941,4943],{"class":267,"line":1983},[265,4940,3077],{"class":271},[265,4942,2266],{"class":424},[265,4944,441],{"class":271},[265,4946,4947,4949,4951],{"class":267,"line":1996},[265,4948,3208],{"class":271},[265,4950,2266],{"class":424},[265,4952,441],{"class":271},[265,4954,4955],{"class":267,"line":2002},[265,4956,473],{"emptyLinePlaceholder":331},[265,4958,4959,4961,4963,4965,4967,4970],{"class":267,"line":2007},[265,4960,2183],{"class":271},[265,4962,2266],{"class":424},[265,4964,2269],{"class":369},[265,4966,434],{"class":271},[265,4968,4969],{"class":437},"\"flex gap-4 justify-end mt-4\"",[265,4971,441],{"class":271},[265,4973,4974,4976,4978,4980,4982,4985],{"class":267,"line":2025},[265,4975,2263],{"class":271},[265,4977,2752],{"class":424},[265,4979,2772],{"class":369},[265,4981,434],{"class":271},[265,4983,4984],{"class":437},"\"emit('cancel')\"",[265,4986,441],{"class":271},[265,4988,4989],{"class":267,"line":2030},[265,4990,4991],{"class":271},"      取消\n",[265,4993,4994,4996,4998],{"class":267,"line":2035},[265,4995,3077],{"class":271},[265,4997,2752],{"class":424},[265,4999,441],{"class":271},[265,5001,5002,5004,5006,5008,5010,5012,5014,5016,5019],{"class":267,"line":2045},[265,5003,2263],{"class":271},[265,5005,2752],{"class":424},[265,5007,481],{"class":369},[265,5009,434],{"class":271},[265,5011,2759],{"class":437},[265,5013,2772],{"class":369},[265,5015,434],{"class":271},[265,5017,5018],{"class":437},"\"emit('confirm')\"",[265,5020,441],{"class":271},[265,5022,5023],{"class":267,"line":2056},[265,5024,5025],{"class":271},"      确定\n",[265,5027,5028,5030,5032],{"class":267,"line":2066},[265,5029,3077],{"class":271},[265,5031,2752],{"class":424},[265,5033,441],{"class":271},[265,5035,5036,5038,5040],{"class":267,"line":2075},[265,5037,3208],{"class":271},[265,5039,2266],{"class":424},[265,5041,441],{"class":271},[265,5043,5044,5046,5048],{"class":267,"line":2084},[265,5045,2158],{"class":271},[265,5047,2175],{"class":424},[265,5049,441],{"class":271},[18,5051,5052],{},"父组件（请求、弹窗、确认逻辑）",[256,5054,5056],{"className":412,"code":5055,"language":414,"meta":261,"style":261},"\u003Cscript setup lang=\"ts\">\nimport type { TeacherItem } from './TeacherSelector.vue'\nimport { getSubjectBySchoolIdList, getTeacherBySchoolIdList } from '@/api/grading'\nimport { useUserStore } from '@/store'\nimport TeacherSelector from './TeacherSelector.vue'\n\nconst userStore = useUserStore()\n\nconst visible = ref(false)\nconst subjectOptions = ref\u003C{ id: string, name: string }[]>([])\nconst allTeachers = ref\u003CTeacherItem[]>([])\nconst selectedTeachers = ref\u003CTeacherItem[]>([])\n\nconst currentPaperId = ref\u003Cstring | null>(null)\n\nconst searchParams = ref({ subjectId: '', keyword: '' })\n\nasync function loadSubjects() {\n  const { data } = await getSubjectBySchoolIdList({\n    schoolId: userStore.schoolInfo.id,\n  })\n  subjectOptions.value = data\n}\n\nasync function loadTeachers() {\n  const { data } = await getTeacherBySchoolIdList({\n    schoolId: userStore.schoolInfo.id,\n    classType: 'admin',\n    userNameOrPhone: searchParams.value.keyword || undefined,\n    subjectId: searchParams.value.subjectId,\n  })\n  allTeachers.value = data as TeacherItem[]\n}\n\nfunction handleSearch(payload: { subjectId: string, keyword: string }) {\n  searchParams.value = payload\n  loadTeachers()\n}\n\nfunction handleChange(next: TeacherItem[]) {\n  selectedTeachers.value = next\n}\n\nasync function openForPaper(paperId: string, defaultSelected: TeacherItem[]) {\n  currentPaperId.value = paperId\n  selectedTeachers.value = [...defaultSelected]\n  visible.value = true\n  await loadSubjects()\n  await loadTeachers()\n}\n\nfunction handleCancel() {\n  visible.value = false\n}\n\nasync function handleConfirm() {\n  if (!currentPaperId.value) {\n    return\n  }\n  await saveGradersApi(currentPaperId.value, selectedTeachers.value)\n  visible.value = false\n}\n\nasync function saveGradersApi(_paperId: string, _teachers: TeacherItem[]) {\n  // await api.save(...)\n}\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cel-dialog\n    v-model=\"visible\"\n    title=\"设置阅卷教师\"\n    width=\"1000\"\n    :close-on-click-modal=\"false\"\n    :close-on-press-escape=\"false\"\n    @closed=\"selectedTeachers = []; currentPaperId = null\"\n  >\n    \u003CTeacherSelector\n      :teachers=\"allTeachers\"\n      :subjects=\"subjectOptions\"\n      :selected=\"selectedTeachers\"\n      @search=\"handleSearch\"\n      @change=\"handleChange\"\n      @confirm=\"handleConfirm\"\n      @cancel=\"handleCancel\"\n    />\n  \u003C/el-dialog>\n\u003C/template>\n",[22,5057,5058,5074,5088,5098,5108,5119,5123,5135,5139,5155,5185,5201,5217,5221,5248,5252,5276,5280,5291,5309,5313,5317,5325,5329,5333,5344,5362,5366,5374,5385,5390,5394,5408,5412,5416,5448,5458,5465,5469,5473,5491,5500,5504,5508,5536,5546,5558,5566,5574,5582,5586,5590,5598,5606,5610,5614,5624,5635,5639,5643,5653,5661,5665,5669,5697,5702,5706,5714,5718,5726,5732,5740,5748,5756,5764,5772,5781,5785,5791,5800,5810,5819,5829,5839,5849,5859,5864,5872],{"__ignoreMap":261},[265,5059,5060,5062,5064,5066,5068,5070,5072],{"class":267,"line":268},[265,5061,421],{"class":271},[265,5063,425],{"class":424},[265,5065,428],{"class":369},[265,5067,431],{"class":369},[265,5069,434],{"class":271},[265,5071,438],{"class":437},[265,5073,441],{"class":271},[265,5075,5076,5078,5080,5083,5085],{"class":267,"line":275},[265,5077,447],{"class":446},[265,5079,481],{"class":446},[265,5081,5082],{"class":271}," { TeacherItem } ",[265,5084,453],{"class":446},[265,5086,5087],{"class":437}," './TeacherSelector.vue'\n",[265,5089,5090,5092,5094,5096],{"class":267,"line":281},[265,5091,447],{"class":446},[265,5093,450],{"class":271},[265,5095,453],{"class":446},[265,5097,456],{"class":437},[265,5099,5100,5102,5104,5106],{"class":267,"line":309},[265,5101,447],{"class":446},[265,5103,463],{"class":271},[265,5105,453],{"class":446},[265,5107,468],{"class":437},[265,5109,5110,5112,5115,5117],{"class":267,"line":323},[265,5111,447],{"class":446},[265,5113,5114],{"class":271}," TeacherSelector ",[265,5116,453],{"class":446},[265,5118,5087],{"class":437},[265,5120,5121],{"class":267,"line":493},[265,5122,473],{"emptyLinePlaceholder":331},[265,5124,5125,5127,5129,5131,5133],{"class":267,"line":506},[265,5126,594],{"class":446},[265,5128,597],{"class":502},[265,5130,487],{"class":446},[265,5132,602],{"class":369},[265,5134,605],{"class":271},[265,5136,5137],{"class":267,"line":517},[265,5138,473],{"emptyLinePlaceholder":331},[265,5140,5141,5143,5145,5147,5149,5151,5153],{"class":267,"line":527},[265,5142,594],{"class":446},[265,5144,625],{"class":502},[265,5146,487],{"class":446},[265,5148,630],{"class":369},[265,5150,391],{"class":271},[265,5152,635],{"class":502},[265,5154,638],{"class":271},[265,5156,5157,5159,5161,5163,5165,5168,5170,5172,5174,5176,5178,5180,5182],{"class":267,"line":537},[265,5158,594],{"class":446},[265,5160,805],{"class":502},[265,5162,487],{"class":446},[265,5164,630],{"class":369},[265,5166,5167],{"class":271},"\u003C{ ",[265,5169,3573],{"class":394},[265,5171,499],{"class":446},[265,5173,3578],{"class":502},[265,5175,1824],{"class":271},[265,5177,3583],{"class":394},[265,5179,499],{"class":446},[265,5181,3578],{"class":502},[265,5183,5184],{"class":271}," }[]>([])\n",[265,5186,5187,5189,5191,5193,5195,5197,5199],{"class":267,"line":543},[265,5188,594],{"class":446},[265,5190,909],{"class":502},[265,5192,487],{"class":446},[265,5194,630],{"class":369},[265,5196,421],{"class":271},[265,5198,918],{"class":369},[265,5200,817],{"class":271},[265,5202,5203,5205,5207,5209,5211,5213,5215],{"class":267,"line":548},[265,5204,594],{"class":446},[265,5206,939],{"class":502},[265,5208,487],{"class":446},[265,5210,630],{"class":369},[265,5212,421],{"class":271},[265,5214,918],{"class":369},[265,5216,817],{"class":271},[265,5218,5219],{"class":267,"line":561},[265,5220,473],{"emptyLinePlaceholder":331},[265,5222,5223,5225,5228,5230,5232,5234,5237,5240,5242,5244,5246],{"class":267,"line":571},[265,5224,594],{"class":446},[265,5226,5227],{"class":502}," currentPaperId",[265,5229,487],{"class":446},[265,5231,630],{"class":369},[265,5233,421],{"class":271},[265,5235,5236],{"class":502},"string",[265,5238,5239],{"class":446}," |",[265,5241,733],{"class":502},[265,5243,669],{"class":271},[265,5245,672],{"class":502},[265,5247,638],{"class":271},[265,5249,5250],{"class":267,"line":581},[265,5251,473],{"emptyLinePlaceholder":331},[265,5253,5254,5256,5259,5261,5263,5266,5268,5271,5273],{"class":267,"line":586},[265,5255,594],{"class":446},[265,5257,5258],{"class":502}," searchParams",[265,5260,487],{"class":446},[265,5262,630],{"class":369},[265,5264,5265],{"class":271},"({ subjectId: ",[265,5267,766],{"class":437},[265,5269,5270],{"class":271},", keyword: ",[265,5272,766],{"class":437},[265,5274,5275],{"class":271}," })\n",[265,5277,5278],{"class":267,"line":591},[265,5279,473],{"emptyLinePlaceholder":331},[265,5281,5282,5284,5286,5289],{"class":267,"line":608},[265,5283,828],{"class":446},[265,5285,831],{"class":446},[265,5287,5288],{"class":369}," loadSubjects",[265,5290,837],{"class":271},[265,5292,5293,5295,5297,5299,5301,5303,5305,5307],{"class":267,"line":613},[265,5294,843],{"class":446},[265,5296,846],{"class":271},[265,5298,849],{"class":502},[265,5300,852],{"class":271},[265,5302,434],{"class":446},[265,5304,857],{"class":446},[265,5306,860],{"class":369},[265,5308,373],{"class":271},[265,5310,5311],{"class":267,"line":620},[265,5312,868],{"class":271},[265,5314,5315],{"class":267,"line":641},[265,5316,874],{"class":271},[265,5318,5319,5321,5323],{"class":267,"line":646},[265,5320,880],{"class":271},[265,5322,434],{"class":446},[265,5324,885],{"class":271},[265,5326,5327],{"class":267,"line":652},[265,5328,540],{"class":271},[265,5330,5331],{"class":267,"line":677},[265,5332,473],{"emptyLinePlaceholder":331},[265,5334,5335,5337,5339,5342],{"class":267,"line":682},[265,5336,828],{"class":446},[265,5338,831],{"class":446},[265,5340,5341],{"class":369}," loadTeachers",[265,5343,837],{"class":271},[265,5345,5346,5348,5350,5352,5354,5356,5358,5360],{"class":267,"line":688},[265,5347,843],{"class":446},[265,5349,846],{"class":271},[265,5351,849],{"class":502},[265,5353,852],{"class":271},[265,5355,434],{"class":446},[265,5357,857],{"class":446},[265,5359,1961],{"class":369},[265,5361,373],{"class":271},[265,5363,5364],{"class":267,"line":741},[265,5365,868],{"class":271},[265,5367,5368,5370,5372],{"class":267,"line":746},[265,5369,1974],{"class":271},[265,5371,1977],{"class":437},[265,5373,1980],{"class":271},[265,5375,5376,5379,5381,5383],{"class":267,"line":752},[265,5377,5378],{"class":271},"    userNameOrPhone: searchParams.value.keyword ",[265,5380,1864],{"class":446},[265,5382,1991],{"class":502},[265,5384,1980],{"class":271},[265,5386,5387],{"class":267,"line":771},[265,5388,5389],{"class":271},"    subjectId: searchParams.value.subjectId,\n",[265,5391,5392],{"class":267,"line":789},[265,5393,874],{"class":271},[265,5395,5396,5398,5400,5402,5404,5406],{"class":267,"line":794},[265,5397,2010],{"class":271},[265,5399,434],{"class":446},[265,5401,2015],{"class":271},[265,5403,2018],{"class":446},[265,5405,484],{"class":369},[265,5407,1719],{"class":271},[265,5409,5410],{"class":267,"line":800},[265,5411,540],{"class":271},[265,5413,5414],{"class":267,"line":820},[265,5415,473],{"emptyLinePlaceholder":331},[265,5417,5418,5420,5423,5425,5427,5429,5431,5433,5435,5437,5439,5441,5443,5445],{"class":267,"line":825},[265,5419,1101],{"class":446},[265,5421,5422],{"class":369}," handleSearch",[265,5424,391],{"class":271},[265,5426,3677],{"class":394},[265,5428,499],{"class":446},[265,5430,846],{"class":271},[265,5432,3683],{"class":394},[265,5434,499],{"class":446},[265,5436,3578],{"class":502},[265,5438,1824],{"class":271},[265,5440,3692],{"class":394},[265,5442,499],{"class":446},[265,5444,3578],{"class":502},[265,5446,5447],{"class":271}," }) {\n",[265,5449,5450,5453,5455],{"class":267,"line":840},[265,5451,5452],{"class":271},"  searchParams.value ",[265,5454,434],{"class":446},[265,5456,5457],{"class":271}," payload\n",[265,5459,5460,5463],{"class":267,"line":865},[265,5461,5462],{"class":369},"  loadTeachers",[265,5464,605],{"class":271},[265,5466,5467],{"class":267,"line":871},[265,5468,540],{"class":271},[265,5470,5471],{"class":267,"line":877},[265,5472,473],{"emptyLinePlaceholder":331},[265,5474,5475,5477,5480,5482,5485,5487,5489],{"class":267,"line":888},[265,5476,1101],{"class":446},[265,5478,5479],{"class":369}," handleChange",[265,5481,391],{"class":271},[265,5483,5484],{"class":394},"next",[265,5486,499],{"class":446},[265,5488,484],{"class":369},[265,5490,1170],{"class":271},[265,5492,5493,5495,5497],{"class":267,"line":893},[265,5494,1547],{"class":271},[265,5496,434],{"class":446},[265,5498,5499],{"class":271}," next\n",[265,5501,5502],{"class":267,"line":898},[265,5503,540],{"class":271},[265,5505,5506],{"class":267,"line":904},[265,5507,473],{"emptyLinePlaceholder":331},[265,5509,5510,5512,5514,5517,5519,5522,5524,5526,5528,5530,5532,5534],{"class":267,"line":923},[265,5511,828],{"class":446},[265,5513,831],{"class":446},[265,5515,5516],{"class":369}," openForPaper",[265,5518,391],{"class":271},[265,5520,5521],{"class":394},"paperId",[265,5523,499],{"class":446},[265,5525,3578],{"class":502},[265,5527,1824],{"class":271},[265,5529,1804],{"class":394},[265,5531,499],{"class":446},[265,5533,484],{"class":369},[265,5535,1170],{"class":271},[265,5537,5538,5541,5543],{"class":267,"line":928},[265,5539,5540],{"class":271},"  currentPaperId.value ",[265,5542,434],{"class":446},[265,5544,5545],{"class":271}," paperId\n",[265,5547,5548,5550,5552,5554,5556],{"class":267,"line":934},[265,5549,1547],{"class":271},[265,5551,434],{"class":446},[265,5553,1876],{"class":271},[265,5555,1242],{"class":446},[265,5557,1881],{"class":271},[265,5559,5560,5562,5564],{"class":267,"line":952},[265,5561,1612],{"class":271},[265,5563,434],{"class":446},[265,5565,1896],{"class":502},[265,5567,5568,5570,5572],{"class":267,"line":957},[265,5569,1902],{"class":446},[265,5571,5288],{"class":369},[265,5573,605],{"class":271},[265,5575,5576,5578,5580],{"class":267,"line":963},[265,5577,1902],{"class":446},[265,5579,5341],{"class":369},[265,5581,605],{"class":271},[265,5583,5584],{"class":267,"line":981},[265,5585,540],{"class":271},[265,5587,5588],{"class":267,"line":986},[265,5589,473],{"emptyLinePlaceholder":331},[265,5591,5592,5594,5596],{"class":267,"line":992},[265,5593,1101],{"class":446},[265,5595,1604],{"class":369},[265,5597,837],{"class":271},[265,5599,5600,5602,5604],{"class":267,"line":1010},[265,5601,1612],{"class":271},[265,5603,434],{"class":446},[265,5605,1617],{"class":502},[265,5607,5608],{"class":267,"line":1015},[265,5609,540],{"class":271},[265,5611,5612],{"class":267,"line":1021},[265,5613,473],{"emptyLinePlaceholder":331},[265,5615,5616,5618,5620,5622],{"class":267,"line":1035},[265,5617,828],{"class":446},[265,5619,831],{"class":446},[265,5621,1641],{"class":369},[265,5623,837],{"class":271},[265,5625,5626,5628,5630,5632],{"class":267,"line":1040},[265,5627,1405],{"class":446},[265,5629,1217],{"class":271},[265,5631,1220],{"class":446},[265,5633,5634],{"class":271},"currentPaperId.value) {\n",[265,5636,5637],{"class":267,"line":1046},[265,5638,1508],{"class":446},[265,5640,5641],{"class":267,"line":1087},[265,5642,1441],{"class":271},[265,5644,5645,5647,5650],{"class":267,"line":1092},[265,5646,1902],{"class":446},[265,5648,5649],{"class":369}," saveGradersApi",[265,5651,5652],{"class":271},"(currentPaperId.value, selectedTeachers.value)\n",[265,5654,5655,5657,5659],{"class":267,"line":1098},[265,5656,1612],{"class":271},[265,5658,434],{"class":446},[265,5660,1617],{"class":502},[265,5662,5663],{"class":267,"line":1119},[265,5664,540],{"class":271},[265,5666,5667],{"class":267,"line":1137},[265,5668,473],{"emptyLinePlaceholder":331},[265,5670,5671,5673,5675,5677,5679,5682,5684,5686,5688,5691,5693,5695],{"class":267,"line":1142},[265,5672,828],{"class":446},[265,5674,831],{"class":446},[265,5676,5649],{"class":369},[265,5678,391],{"class":271},[265,5680,5681],{"class":394},"_paperId",[265,5683,499],{"class":446},[265,5685,3578],{"class":502},[265,5687,1824],{"class":271},[265,5689,5690],{"class":394},"_teachers",[265,5692,499],{"class":446},[265,5694,484],{"class":369},[265,5696,1170],{"class":271},[265,5698,5699],{"class":267,"line":1147},[265,5700,5701],{"class":616},"  // await api.save(...)\n",[265,5703,5704],{"class":267,"line":1153},[265,5705,540],{"class":271},[265,5707,5708,5710,5712],{"class":267,"line":1173},[265,5709,2158],{"class":271},[265,5711,425],{"class":424},[265,5713,441],{"class":271},[265,5715,5716],{"class":267,"line":1184},[265,5717,473],{"emptyLinePlaceholder":331},[265,5719,5720,5722,5724],{"class":267,"line":1190},[265,5721,421],{"class":271},[265,5723,2175],{"class":424},[265,5725,441],{"class":271},[265,5727,5728,5730],{"class":267,"line":1211},[265,5729,2183],{"class":271},[265,5731,2186],{"class":424},[265,5733,5734,5736,5738],{"class":267,"line":1230},[265,5735,2192],{"class":369},[265,5737,434],{"class":271},[265,5739,2197],{"class":437},[265,5741,5742,5744,5746],{"class":267,"line":1248},[265,5743,2203],{"class":369},[265,5745,434],{"class":271},[265,5747,2208],{"class":437},[265,5749,5750,5752,5754],{"class":267,"line":1254},[265,5751,2214],{"class":369},[265,5753,434],{"class":271},[265,5755,2219],{"class":437},[265,5757,5758,5760,5762],{"class":267,"line":1259},[265,5759,2225],{"class":369},[265,5761,434],{"class":271},[265,5763,2230],{"class":437},[265,5765,5766,5768,5770],{"class":267,"line":1265},[265,5767,2236],{"class":369},[265,5769,434],{"class":271},[265,5771,2230],{"class":437},[265,5773,5774,5776,5778],{"class":267,"line":1277},[265,5775,2246],{"class":369},[265,5777,434],{"class":271},[265,5779,5780],{"class":437},"\"selectedTeachers = []; currentPaperId = null\"\n",[265,5782,5783],{"class":267,"line":1288},[265,5784,2257],{"class":271},[265,5786,5787,5789],{"class":267,"line":1293},[265,5788,2263],{"class":271},[265,5790,3331],{"class":424},[265,5792,5793,5796,5798],{"class":267,"line":1298},[265,5794,5795],{"class":369},"      :teachers",[265,5797,434],{"class":271},[265,5799,2522],{"class":437},[265,5801,5802,5805,5807],{"class":267,"line":1303},[265,5803,5804],{"class":369},"      :subjects",[265,5806,434],{"class":271},[265,5808,5809],{"class":437},"\"subjectOptions\"\n",[265,5811,5812,5815,5817],{"class":267,"line":1309},[265,5813,5814],{"class":369},"      :selected",[265,5816,434],{"class":271},[265,5818,2820],{"class":437},[265,5820,5821,5824,5826],{"class":267,"line":1327},[265,5822,5823],{"class":369},"      @search",[265,5825,434],{"class":271},[265,5827,5828],{"class":437},"\"handleSearch\"\n",[265,5830,5831,5834,5836],{"class":267,"line":1337},[265,5832,5833],{"class":369},"      @change",[265,5835,434],{"class":271},[265,5837,5838],{"class":437},"\"handleChange\"\n",[265,5840,5841,5844,5846],{"class":267,"line":1342},[265,5842,5843],{"class":369},"      @confirm",[265,5845,434],{"class":271},[265,5847,5848],{"class":437},"\"handleConfirm\"\n",[265,5850,5851,5854,5856],{"class":267,"line":1347},[265,5852,5853],{"class":369},"      @cancel",[265,5855,434],{"class":271},[265,5857,5858],{"class":437},"\"handleCancel\"\n",[265,5860,5861],{"class":267,"line":1353},[265,5862,5863],{"class":271},"    />\n",[265,5865,5866,5868,5870],{"class":267,"line":1371},[265,5867,3208],{"class":271},[265,5869,3211],{"class":424},[265,5871,441],{"class":271},[265,5873,5874,5876,5878],{"class":267,"line":1402},[265,5875,2158],{"class":271},[265,5877,2175],{"class":424},[265,5879,441],{"class":271},[305,5881,5882],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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 .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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":261,"searchDepth":309,"depth":309,"links":5884},[],"我认为降低复杂度，旨在将大块业务拆离为可理解的部分，局部可理解后，才方便理解整体业务，整体复杂度随之降低",{},"/thinking/component-encapsulation-2",{"title":340,"description":5885},"thinking/组件封装的思考-下",[5891],"Encapsulation","f1rcP9WcO4klI-U2YiDq7Wy_x0i9upGz3sbY94Agkco",{"id":5894,"title":5895,"body":5896,"date":6212,"description":6213,"extension":260,"meta":6214,"navigation":331,"path":6215,"seo":6216,"stem":6217,"tags":6218,"__hash__":6220},"content/thinking/unknown与never.md","unknown与never的区别",{"type":8,"value":5897,"toc":6206},[5898,5909,5919,5930,5984,5987,6026,6037,6040,6056,6063,6065,6076,6083,6117,6120,6139,6154,6166,6175,6177,6185,6203],[11,5899,5901,5902,5905,5906],{"id":5900},"ts-中的-unknown-与-never","TS 中的 ",[22,5903,5904],{},"unknown"," 与 ",[22,5907,5908],{},"never",[73,5910,5912,5913,5916,5917],{"id":5911},"从-isnever-认识-never","从 ",[22,5914,5915],{},"IsNever"," 认识 ",[22,5918,5908],{},[18,5920,5921,5923,5924,5926,5927,5929],{},[22,5922,5915],{}," 用于判断一个类型是否为 ",[22,5925,5908],{},"，不妨思索一下如何判断一个类型是 ",[22,5928,5908],{},"，下方是正确写法",[5931,5932,5935],"spoiler",{":reveal-after-ms":5933,"hint":5934},"1000","悬停 1 秒以查看",[256,5936,5938],{"className":357,"code":5937,"language":359,"meta":261,"style":261},"type IsNever\u003CT> = [T] extends [never] ? true : false\n",[22,5939,5940],{"__ignoreMap":261},[265,5941,5942,5944,5947,5949,5952,5955,5957,5959,5961,5964,5967,5969,5971,5973,5976,5979,5982],{"class":267,"line":268},[265,5943,551],{"class":446},[265,5945,5946],{"class":369}," IsNever",[265,5948,421],{"class":271},[265,5950,5951],{"class":369},"T",[265,5953,5954],{"class":271},"> ",[265,5956,434],{"class":446},[265,5958,1876],{"class":271},[265,5960,5951],{"class":369},[265,5962,5963],{"class":271},"] ",[265,5965,5966],{"class":446},"extends",[265,5968,1876],{"class":271},[265,5970,5908],{"class":502},[265,5972,5963],{"class":271},[265,5974,5975],{"class":446},"?",[265,5977,5978],{"class":502}," true",[265,5980,5981],{"class":446}," :",[265,5983,1617],{"class":502},[18,5985,5986],{},"为什么不是这个呢",[5931,5988,5989],{":reveal-after-ms":5933,"hint":5934},[256,5990,5992],{"className":357,"code":5991,"language":359,"meta":261,"style":261},"type IsNever\u003CT> = T extends never ? true : false\n",[22,5993,5994],{"__ignoreMap":261},[265,5995,5996,5998,6000,6002,6004,6006,6008,6011,6014,6017,6020,6022,6024],{"class":267,"line":268},[265,5997,551],{"class":446},[265,5999,5946],{"class":369},[265,6001,421],{"class":271},[265,6003,5951],{"class":369},[265,6005,5954],{"class":271},[265,6007,434],{"class":446},[265,6009,6010],{"class":369}," T",[265,6012,6013],{"class":446}," extends",[265,6015,6016],{"class":502}," never",[265,6018,6019],{"class":446}," ?",[265,6021,5978],{"class":502},[265,6023,5981],{"class":446},[265,6025,1617],{"class":502},[18,6027,6028,6029,6031,6032,6034,6035],{},"因为 ",[22,6030,5908],{}," 在 ",[22,6033,5966],{}," 时被当作空的联合类型分发，所以三元运算符一定输出 ",[22,6036,635],{},[18,6038,6039],{},"正确的写法中，包裹一层以后作为一个整体看待，不会被分发",[18,6041,6042,6043,6045,6046,6048,6049,6052,6053,6055],{},"所以可以将 ",[22,6044,5908],{}," 看作一个恒为空的联合类型（但实际上 ",[22,6047,5908],{}," 是类似于 ",[22,6050,6051],{},"number","、",[22,6054,5236],{}," 一样的一个类型）",[18,6057,6058,6059],{},"或者这样表述更为合理——",[33,6060,5908],{"href":6061,"rel":6062},"https://github.com/microsoft/TypeScript/issues/23182#issuecomment-379094672",[37],[73,6064,5904],{"id":5904},[18,6066,6067,6069,6070,6072,6073,6075],{},[22,6068,5904],{}," 是晚于 ",[22,6071,5908],{}," 诞生的，它和 ",[22,6074,5908],{}," 很像，但有本质区别",[18,6077,6078,6079,6082],{},"在 ",[22,6080,6081],{},"TS"," 的类型系统中，除去复杂类型，有以下基础类型",[50,6084,6085,6089,6093,6098,6103,6108,6112],{},[53,6086,6087],{},[22,6088,5236],{},[53,6090,6091],{},[22,6092,6051],{},[53,6094,6095],{},[22,6096,6097],{},"boolean",[53,6099,6100],{},[22,6101,6102],{},"symbol",[53,6104,6105],{},[22,6106,6107],{},"bigint",[53,6109,6110],{},[22,6111,672],{},[53,6113,6114],{},[22,6115,6116],{},"undefined",[18,6118,6119],{},"并有以下特殊类型",[50,6121,6122,6126,6130,6134],{},[53,6123,6124],{},[22,6125,5908],{},[53,6127,6128],{},[22,6129,5904],{},[53,6131,6132],{},[22,6133,666],{},[53,6135,6136],{},[22,6137,6138],{},"void",[18,6140,6141,6142,6145,6146,235,6149,6145,6152],{},"其中，存在 ",[22,6143,6144],{},"never extends T"," 恒为 ",[22,6147,6148],{},"true",[22,6150,6151],{},"T extends unknown",[22,6153,6148],{},[18,6155,6156,6157,6161,6162],{},"这很难让人不联想到范畴论中的",[90,6158,6160],{"text":6159,"tone":93},"从它出发到任何对象都有唯一箭头","初始对象","与",[90,6163,6165],{"text":6164,"tone":93},"从任何对象到它都有唯一箭头","终端对象",[18,6167,6168,6169,6171,6172,6174],{},"所以 ",[22,6170,5908],{}," 象征着底层，而 ",[22,6173,5904],{}," 象征着顶层",[73,6176,666],{"id":666},[18,6178,6179,6180,6182,6183],{},"说到了 ",[22,6181,5904],{},"，不得不提及 ",[22,6184,666],{},[18,6186,6187,6188,6190,6191,6193,6194,6196,6197,6199,6200,6202],{},"如果把 ",[22,6189,6081],{}," 的类型系统看作一个范畴，",[22,6192,666],{}," 既不是终端对象，也不是初始对象，更像是打破范畴的特殊单元。",[22,6195,666],{}," 可以主动绕过 ",[22,6198,6081],{}," 的校验，让原有的类型系统变得不可预测；但为了保持灵活、降低上手难度，",[22,6201,666],{}," 又不得不存在",[305,6204,6205],{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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);}",{"title":261,"searchDepth":309,"depth":309,"links":6207},[6208,6210,6211],{"id":5911,"depth":281,"text":6209},"从 IsNever 认识 never",{"id":5904,"depth":281,"text":5904},{"id":666,"depth":281,"text":666},"2026-04-16","既生never，何生unknown",{},"/thinking/typescript-unknown-and-never",{"title":5895,"description":6213},"thinking/unknown与never",[6219],"TypeScript","3BB09SitXyqVUEqkQd5DgsT9tGmc7I2L6HNxscKbtWA",{"id":6222,"title":6223,"body":6224,"date":6212,"description":7110,"extension":260,"meta":7111,"navigation":331,"path":7112,"seo":7113,"stem":7114,"tags":7115,"__hash__":7116},"content/thinking/组件封装的思考-上.md","组件封装的思考-上",{"type":8,"value":6225,"toc":7103},[6226,6229,6232,6235,6238,6241,6245,6248,6553,6556,6567,6570,6575,6578,6581,6584,6839,7097,7100],[14,6227,6228],{"id":6228},"组件封装",[73,6230,6231],{"id":6231},"为什么需要封装组件",[18,6233,6234],{},"显而易见，封装组件可以用于重用；统一的组件也方便管理与维护",[18,6236,6237],{},"那么一个页面如果有五个弹窗，功能各异、且与当前页面业务高度耦合，封装成组件后很难被其他页面重用。这时还要不要为了“重用”而把这些弹窗抽离出来？",[18,6239,6240],{},"对一个业务复杂的页面，把这些块拆成组件几乎是必然的。可见这时封装的目的并不主要是重用，而是为了降低单文件、单页面的复杂度——把一大团逻辑拆解，每块有名字、有边界，读起来和维护起来都更轻松",[73,6242,6244],{"id":6243},"理想化的反面一个看起来完整的组件","“理想化”的反面：一个看起来完整的组件",[18,6246,6247],{},"这里有一个组件，功能完整、逻辑清晰：展示用户，展示关注按钮，点击则进行关注",[256,6249,6251],{"className":412,"code":6250,"language":414,"meta":261,"style":261},"\u003Cscript setup lang=\"ts\">\nimport { useUserStore } from '@/store/user'\n\nconst props = defineProps\u003C{\n  user: {\n    id: string\n    name: string\n    avatar: string\n  }\n  showFollow?: boolean\n}>()\n\nconst userStore = useUserStore()\n\nconst isFollowing = computed(() =>\n  userStore.followingIds.includes(props.user.id)\n)\n\nasync function handleFollow() {\n  await userStore.follow(props.user.id)\n}\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"user-card\">\n    \u003Cimg :src=\"user.avatar\">\n    \u003Cdiv>{{ user.name }}\u003C/div>\n\n    \u003Cbutton v-if=\"showFollow\" @click=\"handleFollow\">\n      {{ isFollowing ? '已关注' : '关注' }}\n    \u003C/button>\n  \u003C/div>\n\u003C/template>\n",[22,6252,6253,6269,6280,6284,6296,6305,6314,6323,6332,6336,6346,6350,6354,6366,6370,6386,6397,6401,6405,6416,6428,6432,6440,6444,6452,6467,6483,6496,6500,6524,6529,6537,6545],{"__ignoreMap":261},[265,6254,6255,6257,6259,6261,6263,6265,6267],{"class":267,"line":268},[265,6256,421],{"class":271},[265,6258,425],{"class":424},[265,6260,428],{"class":369},[265,6262,431],{"class":369},[265,6264,434],{"class":271},[265,6266,438],{"class":437},[265,6268,441],{"class":271},[265,6270,6271,6273,6275,6277],{"class":267,"line":275},[265,6272,447],{"class":446},[265,6274,463],{"class":271},[265,6276,453],{"class":446},[265,6278,6279],{"class":437}," '@/store/user'\n",[265,6281,6282],{"class":267,"line":281},[265,6283,473],{"emptyLinePlaceholder":331},[265,6285,6286,6288,6290,6292,6294],{"class":267,"line":309},[265,6287,594],{"class":446},[265,6289,3601],{"class":502},[265,6291,487],{"class":446},[265,6293,3606],{"class":369},[265,6295,3609],{"class":271},[265,6297,6298,6301,6303],{"class":267,"line":323},[265,6299,6300],{"class":394},"  user",[265,6302,499],{"class":446},[265,6304,490],{"class":271},[265,6306,6307,6310,6312],{"class":267,"line":493},[265,6308,6309],{"class":394},"    id",[265,6311,499],{"class":446},[265,6313,503],{"class":502},[265,6315,6316,6319,6321],{"class":267,"line":506},[265,6317,6318],{"class":394},"    name",[265,6320,499],{"class":446},[265,6322,503],{"class":502},[265,6324,6325,6328,6330],{"class":267,"line":517},[265,6326,6327],{"class":394},"    avatar",[265,6329,499],{"class":446},[265,6331,503],{"class":502},[265,6333,6334],{"class":267,"line":527},[265,6335,1441],{"class":271},[265,6337,6338,6341,6343],{"class":267,"line":537},[265,6339,6340],{"class":394},"  showFollow",[265,6342,512],{"class":446},[265,6344,6345],{"class":502}," boolean\n",[265,6347,6348],{"class":267,"line":543},[265,6349,3647],{"class":271},[265,6351,6352],{"class":267,"line":548},[265,6353,473],{"emptyLinePlaceholder":331},[265,6355,6356,6358,6360,6362,6364],{"class":267,"line":561},[265,6357,594],{"class":446},[265,6359,597],{"class":502},[265,6361,487],{"class":446},[265,6363,602],{"class":369},[265,6365,605],{"class":271},[265,6367,6368],{"class":267,"line":571},[265,6369,473],{"emptyLinePlaceholder":331},[265,6371,6372,6374,6377,6379,6381,6383],{"class":267,"line":581},[265,6373,594],{"class":446},[265,6375,6376],{"class":502}," isFollowing",[265,6378,487],{"class":446},[265,6380,1056],{"class":369},[265,6382,1059],{"class":271},[265,6384,6385],{"class":446},"=>\n",[265,6387,6388,6391,6394],{"class":267,"line":586},[265,6389,6390],{"class":271},"  userStore.followingIds.",[265,6392,6393],{"class":369},"includes",[265,6395,6396],{"class":271},"(props.user.id)\n",[265,6398,6399],{"class":267,"line":591},[265,6400,638],{"class":271},[265,6402,6403],{"class":267,"line":608},[265,6404,473],{"emptyLinePlaceholder":331},[265,6406,6407,6409,6411,6414],{"class":267,"line":613},[265,6408,828],{"class":446},[265,6410,831],{"class":446},[265,6412,6413],{"class":369}," handleFollow",[265,6415,837],{"class":271},[265,6417,6418,6420,6423,6426],{"class":267,"line":620},[265,6419,1902],{"class":446},[265,6421,6422],{"class":271}," userStore.",[265,6424,6425],{"class":369},"follow",[265,6427,6396],{"class":271},[265,6429,6430],{"class":267,"line":641},[265,6431,540],{"class":271},[265,6433,6434,6436,6438],{"class":267,"line":646},[265,6435,2158],{"class":271},[265,6437,425],{"class":424},[265,6439,441],{"class":271},[265,6441,6442],{"class":267,"line":652},[265,6443,473],{"emptyLinePlaceholder":331},[265,6445,6446,6448,6450],{"class":267,"line":677},[265,6447,421],{"class":271},[265,6449,2175],{"class":424},[265,6451,441],{"class":271},[265,6453,6454,6456,6458,6460,6462,6465],{"class":267,"line":682},[265,6455,2183],{"class":271},[265,6457,2266],{"class":424},[265,6459,2269],{"class":369},[265,6461,434],{"class":271},[265,6463,6464],{"class":437},"\"user-card\"",[265,6466,441],{"class":271},[265,6468,6469,6471,6473,6476,6478,6481],{"class":267,"line":688},[265,6470,2263],{"class":271},[265,6472,141],{"class":424},[265,6474,6475],{"class":369}," :src",[265,6477,434],{"class":271},[265,6479,6480],{"class":437},"\"user.avatar\"",[265,6482,441],{"class":271},[265,6484,6485,6487,6489,6492,6494],{"class":267,"line":741},[265,6486,2263],{"class":271},[265,6488,2266],{"class":424},[265,6490,6491],{"class":271},">{{ user.name }}\u003C/",[265,6493,2266],{"class":424},[265,6495,441],{"class":271},[265,6497,6498],{"class":267,"line":746},[265,6499,473],{"emptyLinePlaceholder":331},[265,6501,6502,6504,6507,6510,6512,6515,6517,6519,6522],{"class":267,"line":752},[265,6503,2263],{"class":271},[265,6505,6506],{"class":424},"button",[265,6508,6509],{"class":369}," v-if",[265,6511,434],{"class":271},[265,6513,6514],{"class":437},"\"showFollow\"",[265,6516,2772],{"class":369},[265,6518,434],{"class":271},[265,6520,6521],{"class":437},"\"handleFollow\"",[265,6523,441],{"class":271},[265,6525,6526],{"class":267,"line":771},[265,6527,6528],{"class":271},"      {{ isFollowing ? '已关注' : '关注' }}\n",[265,6530,6531,6533,6535],{"class":267,"line":789},[265,6532,3077],{"class":271},[265,6534,6506],{"class":424},[265,6536,441],{"class":271},[265,6538,6539,6541,6543],{"class":267,"line":794},[265,6540,3208],{"class":271},[265,6542,2266],{"class":424},[265,6544,441],{"class":271},[265,6546,6547,6549,6551],{"class":267,"line":800},[265,6548,2158],{"class":271},[265,6550,2175],{"class":424},[265,6552,441],{"class":271},[18,6554,6555],{},"但它并不够好——问题不在组件是否简单易懂，而在边界：父组件从 props 的输入，并不是这个组件的全部“输入”；子组件产生的，也不只是 UI 和事件",[50,6557,6558,6561,6564],{},[53,6559,6560],{},"输入不够明确。除了父组件传入的 props，它还依赖 useUserStore() 里的 followingIds。若只看 defineProps，无法得知完整输入",[53,6562,6563],{},"输出不清晰。点击后的结果写进了全局 Store，而不是通过返回值或事件让父组件显式处理。父组件无法通过props推断结果（为什么要推断结果，就好比debugger时，无法仅凭父组件传入的props判断子组件的结果）",[53,6565,6566],{},"职责不够单一。从 props 看，它只展示 user 与是否显示关注按钮；实际上“是否已关注”和“点击后的关注行为”都依赖 userStore 。如果修改关注的数据来源，子组件内部也需要改动；同时单元测试时也很难脱离 Store",[18,6568,6569],{},"理想情况下：组件对外主要是“给定 props，产出 UI；需要外界协作时，通过事件交出去”。若一个组件不涉及状态管理，就可以表示为",[18,6571,6572],{},[22,6573,6574],{},"{ UI, events } ≈ f(props)",[18,6576,6577],{},"在组件里使用状态管理，f 就不再只是 props 的函数。封装组件与控制边界，就是方便通过组件的输入输出看出依赖关系。组件就不应该使用状态管理吗，在于我们如何权衡状态管理带来的隐式依赖关系与状态管道能够减轻的复杂度，比如登录状态仍需状态管理",[73,6579,6580],{"id":6580},"理想化的组件",[18,6582,6583],{},"通过props输入、通过事件输出",[256,6585,6587],{"className":412,"code":6586,"language":414,"meta":261,"style":261},"\u003Cscript setup lang=\"ts\">\nconst props = defineProps\u003C{\n  user: {\n    id: string\n    name: string\n    avatar: string\n  }\n  showFollow?: boolean\n  isFollowing: boolean\n}>()\n\nconst emit = defineEmits\u003C{\n  (e: 'follow'): void\n}>()\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"user-card\">\n    \u003Cimg :src=\"props.user.avatar\" :alt=\"props.user.name\">\n    \u003Cdiv>{{ props.user.name }}\u003C/div>\n\n    \u003Cbutton v-if=\"props.showFollow\" @click=\"emit('follow')\">\n      {{ props.isFollowing ? '已关注' : '关注' }}\n    \u003C/button>\n  \u003C/div>\n\u003C/template>\n",[22,6588,6589,6605,6617,6625,6633,6641,6649,6653,6661,6670,6674,6678,6690,6710,6714,6722,6726,6734,6748,6771,6784,6788,6810,6815,6823,6831],{"__ignoreMap":261},[265,6590,6591,6593,6595,6597,6599,6601,6603],{"class":267,"line":268},[265,6592,421],{"class":271},[265,6594,425],{"class":424},[265,6596,428],{"class":369},[265,6598,431],{"class":369},[265,6600,434],{"class":271},[265,6602,438],{"class":437},[265,6604,441],{"class":271},[265,6606,6607,6609,6611,6613,6615],{"class":267,"line":275},[265,6608,594],{"class":446},[265,6610,3601],{"class":502},[265,6612,487],{"class":446},[265,6614,3606],{"class":369},[265,6616,3609],{"class":271},[265,6618,6619,6621,6623],{"class":267,"line":281},[265,6620,6300],{"class":394},[265,6622,499],{"class":446},[265,6624,490],{"class":271},[265,6626,6627,6629,6631],{"class":267,"line":309},[265,6628,6309],{"class":394},[265,6630,499],{"class":446},[265,6632,503],{"class":502},[265,6634,6635,6637,6639],{"class":267,"line":323},[265,6636,6318],{"class":394},[265,6638,499],{"class":446},[265,6640,503],{"class":502},[265,6642,6643,6645,6647],{"class":267,"line":493},[265,6644,6327],{"class":394},[265,6646,499],{"class":446},[265,6648,503],{"class":502},[265,6650,6651],{"class":267,"line":506},[265,6652,1441],{"class":271},[265,6654,6655,6657,6659],{"class":267,"line":517},[265,6656,6340],{"class":394},[265,6658,512],{"class":446},[265,6660,6345],{"class":502},[265,6662,6663,6666,6668],{"class":267,"line":527},[265,6664,6665],{"class":394},"  isFollowing",[265,6667,499],{"class":446},[265,6669,6345],{"class":502},[265,6671,6672],{"class":267,"line":537},[265,6673,3647],{"class":271},[265,6675,6676],{"class":267,"line":543},[265,6677,473],{"emptyLinePlaceholder":331},[265,6679,6680,6682,6684,6686,6688],{"class":267,"line":548},[265,6681,594],{"class":446},[265,6683,3658],{"class":502},[265,6685,487],{"class":446},[265,6687,3663],{"class":369},[265,6689,3609],{"class":271},[265,6691,6692,6695,6698,6700,6703,6706,6708],{"class":267,"line":561},[265,6693,6694],{"class":271},"  (",[265,6696,6697],{"class":394},"e",[265,6699,499],{"class":446},[265,6701,6702],{"class":437}," 'follow'",[265,6704,6705],{"class":271},")",[265,6707,499],{"class":446},[265,6709,1760],{"class":502},[265,6711,6712],{"class":267,"line":571},[265,6713,3647],{"class":271},[265,6715,6716,6718,6720],{"class":267,"line":581},[265,6717,2158],{"class":271},[265,6719,425],{"class":424},[265,6721,441],{"class":271},[265,6723,6724],{"class":267,"line":586},[265,6725,473],{"emptyLinePlaceholder":331},[265,6727,6728,6730,6732],{"class":267,"line":591},[265,6729,421],{"class":271},[265,6731,2175],{"class":424},[265,6733,441],{"class":271},[265,6735,6736,6738,6740,6742,6744,6746],{"class":267,"line":608},[265,6737,2183],{"class":271},[265,6739,2266],{"class":424},[265,6741,2269],{"class":369},[265,6743,434],{"class":271},[265,6745,6464],{"class":437},[265,6747,441],{"class":271},[265,6749,6750,6752,6754,6756,6758,6761,6764,6766,6769],{"class":267,"line":613},[265,6751,2263],{"class":271},[265,6753,141],{"class":424},[265,6755,6475],{"class":369},[265,6757,434],{"class":271},[265,6759,6760],{"class":437},"\"props.user.avatar\"",[265,6762,6763],{"class":369}," :alt",[265,6765,434],{"class":271},[265,6767,6768],{"class":437},"\"props.user.name\"",[265,6770,441],{"class":271},[265,6772,6773,6775,6777,6780,6782],{"class":267,"line":620},[265,6774,2263],{"class":271},[265,6776,2266],{"class":424},[265,6778,6779],{"class":271},">{{ props.user.name }}\u003C/",[265,6781,2266],{"class":424},[265,6783,441],{"class":271},[265,6785,6786],{"class":267,"line":641},[265,6787,473],{"emptyLinePlaceholder":331},[265,6789,6790,6792,6794,6796,6798,6801,6803,6805,6808],{"class":267,"line":646},[265,6791,2263],{"class":271},[265,6793,6506],{"class":424},[265,6795,6509],{"class":369},[265,6797,434],{"class":271},[265,6799,6800],{"class":437},"\"props.showFollow\"",[265,6802,2772],{"class":369},[265,6804,434],{"class":271},[265,6806,6807],{"class":437},"\"emit('follow')\"",[265,6809,441],{"class":271},[265,6811,6812],{"class":267,"line":652},[265,6813,6814],{"class":271},"      {{ props.isFollowing ? '已关注' : '关注' }}\n",[265,6816,6817,6819,6821],{"class":267,"line":677},[265,6818,3077],{"class":271},[265,6820,6506],{"class":424},[265,6822,441],{"class":271},[265,6824,6825,6827,6829],{"class":267,"line":682},[265,6826,3208],{"class":271},[265,6828,2266],{"class":424},[265,6830,441],{"class":271},[265,6832,6833,6835,6837],{"class":267,"line":688},[265,6834,2158],{"class":271},[265,6836,2175],{"class":424},[265,6838,441],{"class":271},[256,6840,6842],{"className":412,"code":6841,"language":414,"meta":261,"style":261},"\u003Cscript setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useUserStore } from '@/store/user'\nimport UserCard from './UserCard.vue'\n\nconst props = defineProps\u003C{\n  user: {\n    id: string\n    name: string\n    avatar: string\n  }\n}>()\n\nconst userStore = useUserStore()\n\nconst isFollowing = computed(() =>\n  userStore.followingIds.includes(props.user.id)\n)\n\nasync function handleFollow() {\n  await userStore.follow(props.user.id)\n}\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CUserCard\n    :user=\"user\"\n    :is-following=\"isFollowing\"\n    show-follow\n    @follow=\"handleFollow\"\n  />\n\u003C/template>\n",[22,6843,6844,6860,6871,6881,6893,6897,6909,6917,6925,6933,6941,6945,6949,6953,6965,6969,6983,6991,6995,6999,7009,7019,7023,7031,7035,7043,7050,7060,7070,7075,7085,7089],{"__ignoreMap":261},[265,6845,6846,6848,6850,6852,6854,6856,6858],{"class":267,"line":268},[265,6847,421],{"class":271},[265,6849,425],{"class":424},[265,6851,428],{"class":369},[265,6853,431],{"class":369},[265,6855,434],{"class":271},[265,6857,438],{"class":437},[265,6859,441],{"class":271},[265,6861,6862,6864,6867,6869],{"class":267,"line":275},[265,6863,447],{"class":446},[265,6865,6866],{"class":271}," { computed } ",[265,6868,453],{"class":446},[265,6870,3502],{"class":437},[265,6872,6873,6875,6877,6879],{"class":267,"line":281},[265,6874,447],{"class":446},[265,6876,463],{"class":271},[265,6878,453],{"class":446},[265,6880,6279],{"class":437},[265,6882,6883,6885,6888,6890],{"class":267,"line":309},[265,6884,447],{"class":446},[265,6886,6887],{"class":271}," UserCard ",[265,6889,453],{"class":446},[265,6891,6892],{"class":437}," './UserCard.vue'\n",[265,6894,6895],{"class":267,"line":323},[265,6896,473],{"emptyLinePlaceholder":331},[265,6898,6899,6901,6903,6905,6907],{"class":267,"line":493},[265,6900,594],{"class":446},[265,6902,3601],{"class":502},[265,6904,487],{"class":446},[265,6906,3606],{"class":369},[265,6908,3609],{"class":271},[265,6910,6911,6913,6915],{"class":267,"line":506},[265,6912,6300],{"class":394},[265,6914,499],{"class":446},[265,6916,490],{"class":271},[265,6918,6919,6921,6923],{"class":267,"line":517},[265,6920,6309],{"class":394},[265,6922,499],{"class":446},[265,6924,503],{"class":502},[265,6926,6927,6929,6931],{"class":267,"line":527},[265,6928,6318],{"class":394},[265,6930,499],{"class":446},[265,6932,503],{"class":502},[265,6934,6935,6937,6939],{"class":267,"line":537},[265,6936,6327],{"class":394},[265,6938,499],{"class":446},[265,6940,503],{"class":502},[265,6942,6943],{"class":267,"line":543},[265,6944,1441],{"class":271},[265,6946,6947],{"class":267,"line":548},[265,6948,3647],{"class":271},[265,6950,6951],{"class":267,"line":561},[265,6952,473],{"emptyLinePlaceholder":331},[265,6954,6955,6957,6959,6961,6963],{"class":267,"line":571},[265,6956,594],{"class":446},[265,6958,597],{"class":502},[265,6960,487],{"class":446},[265,6962,602],{"class":369},[265,6964,605],{"class":271},[265,6966,6967],{"class":267,"line":581},[265,6968,473],{"emptyLinePlaceholder":331},[265,6970,6971,6973,6975,6977,6979,6981],{"class":267,"line":586},[265,6972,594],{"class":446},[265,6974,6376],{"class":502},[265,6976,487],{"class":446},[265,6978,1056],{"class":369},[265,6980,1059],{"class":271},[265,6982,6385],{"class":446},[265,6984,6985,6987,6989],{"class":267,"line":591},[265,6986,6390],{"class":271},[265,6988,6393],{"class":369},[265,6990,6396],{"class":271},[265,6992,6993],{"class":267,"line":608},[265,6994,638],{"class":271},[265,6996,6997],{"class":267,"line":613},[265,6998,473],{"emptyLinePlaceholder":331},[265,7000,7001,7003,7005,7007],{"class":267,"line":620},[265,7002,828],{"class":446},[265,7004,831],{"class":446},[265,7006,6413],{"class":369},[265,7008,837],{"class":271},[265,7010,7011,7013,7015,7017],{"class":267,"line":641},[265,7012,1902],{"class":446},[265,7014,6422],{"class":271},[265,7016,6425],{"class":369},[265,7018,6396],{"class":271},[265,7020,7021],{"class":267,"line":646},[265,7022,540],{"class":271},[265,7024,7025,7027,7029],{"class":267,"line":652},[265,7026,2158],{"class":271},[265,7028,425],{"class":424},[265,7030,441],{"class":271},[265,7032,7033],{"class":267,"line":677},[265,7034,473],{"emptyLinePlaceholder":331},[265,7036,7037,7039,7041],{"class":267,"line":682},[265,7038,421],{"class":271},[265,7040,2175],{"class":424},[265,7042,441],{"class":271},[265,7044,7045,7047],{"class":267,"line":688},[265,7046,2183],{"class":271},[265,7048,7049],{"class":424},"UserCard\n",[265,7051,7052,7055,7057],{"class":267,"line":741},[265,7053,7054],{"class":369},"    :user",[265,7056,434],{"class":271},[265,7058,7059],{"class":437},"\"user\"\n",[265,7061,7062,7065,7067],{"class":267,"line":746},[265,7063,7064],{"class":369},"    :is-following",[265,7066,434],{"class":271},[265,7068,7069],{"class":437},"\"isFollowing\"\n",[265,7071,7072],{"class":267,"line":752},[265,7073,7074],{"class":369},"    show-follow\n",[265,7076,7077,7080,7082],{"class":267,"line":771},[265,7078,7079],{"class":369},"    @follow",[265,7081,434],{"class":271},[265,7083,7084],{"class":437},"\"handleFollow\"\n",[265,7086,7087],{"class":267,"line":789},[265,7088,3450],{"class":271},[265,7090,7091,7093,7095],{"class":267,"line":794},[265,7092,2158],{"class":271},[265,7094,2175],{"class":424},[265,7096,441],{"class":271},[18,7098,7099],{},"使用状态管理可能会让代码量减少，但代码量少并不意味着简单，上面之前的例子中，想要复用或修改功能就需要付出额外的代价",[305,7101,7102],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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 .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);}",{"title":261,"searchDepth":309,"depth":309,"links":7104},[7105],{"id":6228,"depth":275,"text":6228,"children":7106},[7107,7108,7109],{"id":6231,"depth":281,"text":6231},{"id":6243,"depth":281,"text":6244},{"id":6580,"depth":281,"text":6580},"一个组件肯定是要降低复杂度，如何封装才能降低复杂度",{},"/thinking/component-encapsulation-1",{"title":6223,"description":7110},"thinking/组件封装的思考-上",[5891],"EpM8UaHm_fr1vCQ2O1ad292NOX7VP06VAJhK7-Vwy6w",{"id":7118,"title":7119,"body":7120,"date":8706,"description":8707,"extension":260,"meta":8708,"navigation":331,"path":8709,"seo":8710,"stem":8711,"tags":8712,"__hash__":8714},"content/thinking/避免重复请求的思考.md","避免重复请求",{"type":8,"value":7121,"toc":8702},[7122,7124,7131,7134,7137,7143,7630,7634,7637,8679,8682,8690,8699],[11,7123,7119],{"id":7119},[18,7125,7126,7127,7130],{},"对于一个HTTP请求，前端可以经由",[22,7128,7129],{},"AbortController","取消浏览器对该请求的响应；但请求仍会在服务器处理",[18,7132,7133],{},"故而，通过在Axios中取消请求，想减少代码在UI上的锁机制是行不通的",[18,7135,7136],{},"如果此时有一个表单的修改操作，用户重复按下5次，“取消请求”后，服务器仍会收到5次修改操作。这种重复请求被发送到服务器显然是一种资源浪费，甚至污染日志数据。通常，前端会在表单确认按钮上添加loading保证响应返回。而后端如何处理，我理解的是后端如何解决数据竞争问题，此处不做讨论",[18,7138,7139,7140,7142],{},"恰巧，本人刚从事前端开发时，网上很盛行如下写法，",[22,7141,7129],{},"结合请求拦截器和响应拦截器，使用取消响应来解决重复请求的问题。",[256,7144,7146],{"className":357,"code":7145,"language":359,"meta":261,"style":261},"/*\n * @Description: AbortController解决请求未返回时取消发送同样请求\n */\nimport type { AxiosRequestConfig } from 'axios'\nimport qs from 'qs'\n\nexport class RequestCanceler {\n  // 存储每个请求的标志和取消函数\n  private pendingRequestMap: Map\u003Cstring, AbortController>\n  constructor() {\n    this.pendingRequestMap = new Map\u003Cstring, AbortController>()\n  }\n\n  private generateReqKey(config: AxiosRequestConfig): string {\n    const { method, url } = config\n    return [url || '', method || '', qs.stringify(config.params), qs.stringify(config.data)].join('&')\n  }\n\n  addPendingRequest(config: AxiosRequestConfig) {\n    const requestKey: string = this.generateReqKey(config)\n    if (!this.pendingRequestMap.has(requestKey)) {\n      const controller = new AbortController()\n      // 给config挂载signal\n      config.signal = controller.signal\n      this.pendingRequestMap.set(requestKey, controller)\n    }\n    else {\n      // 如果requestKey已经存在，则获取之前设置的controller，并挂载signal\n      config.signal = this.pendingRequestMap.get(requestKey)!.signal\n    }\n  }\n\n  removePendingRequest(config: AxiosRequestConfig) {\n    const requestKey = this.generateReqKey(config)\n    // message.destroy(requestKey)\n    if (this.pendingRequestMap.has(requestKey)) {\n      // 取消请求\n      ;this.pendingRequestMap.get(requestKey)!.abort()\n      // 从pendingRequest中删掉\n      this.pendingRequestMap.delete(requestKey)\n    }\n  }\n}\n",[22,7147,7148,7153,7158,7163,7177,7189,7193,7204,7209,7232,7239,7264,7268,7272,7297,7319,7363,7367,7371,7386,7411,7430,7447,7452,7462,7475,7479,7486,7491,7512,7516,7520,7524,7539,7555,7560,7574,7579,7601,7606,7618,7622,7626],{"__ignoreMap":261},[265,7149,7150],{"class":267,"line":268},[265,7151,7152],{"class":616},"/*\n",[265,7154,7155],{"class":267,"line":275},[265,7156,7157],{"class":616}," * @Description: AbortController解决请求未返回时取消发送同样请求\n",[265,7159,7160],{"class":267,"line":281},[265,7161,7162],{"class":616}," */\n",[265,7164,7165,7167,7169,7172,7174],{"class":267,"line":309},[265,7166,447],{"class":446},[265,7168,481],{"class":446},[265,7170,7171],{"class":271}," { AxiosRequestConfig } ",[265,7173,453],{"class":446},[265,7175,7176],{"class":437}," 'axios'\n",[265,7178,7179,7181,7184,7186],{"class":267,"line":323},[265,7180,447],{"class":446},[265,7182,7183],{"class":271}," qs ",[265,7185,453],{"class":446},[265,7187,7188],{"class":437}," 'qs'\n",[265,7190,7191],{"class":267,"line":493},[265,7192,473],{"emptyLinePlaceholder":331},[265,7194,7195,7197,7199,7202],{"class":267,"line":506},[265,7196,478],{"class":446},[265,7198,2269],{"class":446},[265,7200,7201],{"class":369}," RequestCanceler",[265,7203,490],{"class":271},[265,7205,7206],{"class":267,"line":517},[265,7207,7208],{"class":616},"  // 存储每个请求的标志和取消函数\n",[265,7210,7211,7214,7217,7219,7222,7224,7226,7228,7230],{"class":267,"line":527},[265,7212,7213],{"class":446},"  private",[265,7215,7216],{"class":394}," pendingRequestMap",[265,7218,499],{"class":446},[265,7220,7221],{"class":369}," Map",[265,7223,421],{"class":271},[265,7225,5236],{"class":502},[265,7227,1824],{"class":271},[265,7229,7129],{"class":369},[265,7231,441],{"class":271},[265,7233,7234,7237],{"class":267,"line":537},[265,7235,7236],{"class":446},"  constructor",[265,7238,837],{"class":271},[265,7240,7241,7244,7247,7249,7251,7253,7255,7257,7259,7261],{"class":267,"line":543},[265,7242,7243],{"class":502},"    this",[265,7245,7246],{"class":271},".pendingRequestMap ",[265,7248,434],{"class":446},[265,7250,1064],{"class":446},[265,7252,7221],{"class":369},[265,7254,421],{"class":271},[265,7256,5236],{"class":502},[265,7258,1824],{"class":271},[265,7260,7129],{"class":369},[265,7262,7263],{"class":271},">()\n",[265,7265,7266],{"class":267,"line":548},[265,7267,1441],{"class":271},[265,7269,7270],{"class":267,"line":561},[265,7271,473],{"emptyLinePlaceholder":331},[265,7273,7274,7276,7279,7281,7284,7286,7289,7291,7293,7295],{"class":267,"line":571},[265,7275,7213],{"class":446},[265,7277,7278],{"class":369}," generateReqKey",[265,7280,391],{"class":271},[265,7282,7283],{"class":394},"config",[265,7285,499],{"class":446},[265,7287,7288],{"class":369}," AxiosRequestConfig",[265,7290,6705],{"class":271},[265,7292,499],{"class":446},[265,7294,3578],{"class":502},[265,7296,490],{"class":271},[265,7298,7299,7302,7304,7307,7309,7312,7314,7316],{"class":267,"line":581},[265,7300,7301],{"class":446},"    const",[265,7303,846],{"class":271},[265,7305,7306],{"class":502},"method",[265,7308,1824],{"class":271},[265,7310,7311],{"class":502},"url",[265,7313,852],{"class":271},[265,7315,434],{"class":446},[265,7317,7318],{"class":271}," config\n",[265,7320,7321,7324,7327,7329,7332,7335,7337,7339,7342,7345,7348,7350,7353,7356,7358,7361],{"class":267,"line":586},[265,7322,7323],{"class":446},"    return",[265,7325,7326],{"class":271}," [url ",[265,7328,1864],{"class":446},[265,7330,7331],{"class":437}," ''",[265,7333,7334],{"class":271},", method ",[265,7336,1864],{"class":446},[265,7338,7331],{"class":437},[265,7340,7341],{"class":271},", qs.",[265,7343,7344],{"class":369},"stringify",[265,7346,7347],{"class":271},"(config.params), qs.",[265,7349,7344],{"class":369},[265,7351,7352],{"class":271},"(config.data)].",[265,7354,7355],{"class":369},"join",[265,7357,391],{"class":271},[265,7359,7360],{"class":437},"'&'",[265,7362,638],{"class":271},[265,7364,7365],{"class":267,"line":591},[265,7366,1441],{"class":271},[265,7368,7369],{"class":267,"line":608},[265,7370,473],{"emptyLinePlaceholder":331},[265,7372,7373,7376,7378,7380,7382,7384],{"class":267,"line":613},[265,7374,7375],{"class":369},"  addPendingRequest",[265,7377,391],{"class":271},[265,7379,7283],{"class":394},[265,7381,499],{"class":446},[265,7383,7288],{"class":369},[265,7385,1116],{"class":271},[265,7387,7388,7390,7393,7395,7397,7399,7402,7405,7408],{"class":267,"line":620},[265,7389,7301],{"class":446},[265,7391,7392],{"class":502}," requestKey",[265,7394,499],{"class":446},[265,7396,3578],{"class":502},[265,7398,487],{"class":446},[265,7400,7401],{"class":502}," this",[265,7403,7404],{"class":271},".",[265,7406,7407],{"class":369},"generateReqKey",[265,7409,7410],{"class":271},"(config)\n",[265,7412,7413,7415,7417,7419,7422,7425,7427],{"class":267,"line":641},[265,7414,1214],{"class":446},[265,7416,1217],{"class":271},[265,7418,1220],{"class":446},[265,7420,7421],{"class":502},"this",[265,7423,7424],{"class":271},".pendingRequestMap.",[265,7426,1131],{"class":369},[265,7428,7429],{"class":271},"(requestKey)) {\n",[265,7431,7432,7435,7438,7440,7442,7445],{"class":267,"line":646},[265,7433,7434],{"class":446},"      const",[265,7436,7437],{"class":502}," controller",[265,7439,487],{"class":446},[265,7441,1064],{"class":446},[265,7443,7444],{"class":369}," AbortController",[265,7446,605],{"class":271},[265,7448,7449],{"class":267,"line":652},[265,7450,7451],{"class":616},"      // 给config挂载signal\n",[265,7453,7454,7457,7459],{"class":267,"line":677},[265,7455,7456],{"class":271},"      config.signal ",[265,7458,434],{"class":446},[265,7460,7461],{"class":271}," controller.signal\n",[265,7463,7464,7467,7469,7472],{"class":267,"line":682},[265,7465,7466],{"class":502},"      this",[265,7468,7424],{"class":271},[265,7470,7471],{"class":369},"set",[265,7473,7474],{"class":271},"(requestKey, controller)\n",[265,7476,7477],{"class":267,"line":688},[265,7478,1251],{"class":271},[265,7480,7481,7484],{"class":267,"line":741},[265,7482,7483],{"class":446},"    else",[265,7485,490],{"class":271},[265,7487,7488],{"class":267,"line":746},[265,7489,7490],{"class":616},"      // 如果requestKey已经存在，则获取之前设置的controller，并挂载signal\n",[265,7492,7493,7495,7497,7499,7501,7504,7507,7509],{"class":267,"line":752},[265,7494,7456],{"class":271},[265,7496,434],{"class":446},[265,7498,7401],{"class":502},[265,7500,7424],{"class":271},[265,7502,7503],{"class":369},"get",[265,7505,7506],{"class":271},"(requestKey)",[265,7508,1220],{"class":446},[265,7510,7511],{"class":271},".signal\n",[265,7513,7514],{"class":267,"line":771},[265,7515,1251],{"class":271},[265,7517,7518],{"class":267,"line":789},[265,7519,1441],{"class":271},[265,7521,7522],{"class":267,"line":794},[265,7523,473],{"emptyLinePlaceholder":331},[265,7525,7526,7529,7531,7533,7535,7537],{"class":267,"line":800},[265,7527,7528],{"class":369},"  removePendingRequest",[265,7530,391],{"class":271},[265,7532,7283],{"class":394},[265,7534,499],{"class":446},[265,7536,7288],{"class":369},[265,7538,1116],{"class":271},[265,7540,7541,7543,7545,7547,7549,7551,7553],{"class":267,"line":820},[265,7542,7301],{"class":446},[265,7544,7392],{"class":502},[265,7546,487],{"class":446},[265,7548,7401],{"class":502},[265,7550,7404],{"class":271},[265,7552,7407],{"class":369},[265,7554,7410],{"class":271},[265,7556,7557],{"class":267,"line":825},[265,7558,7559],{"class":616},"    // message.destroy(requestKey)\n",[265,7561,7562,7564,7566,7568,7570,7572],{"class":267,"line":840},[265,7563,1214],{"class":446},[265,7565,1217],{"class":271},[265,7567,7421],{"class":502},[265,7569,7424],{"class":271},[265,7571,1131],{"class":369},[265,7573,7429],{"class":271},[265,7575,7576],{"class":267,"line":865},[265,7577,7578],{"class":616},"      // 取消请求\n",[265,7580,7581,7584,7586,7588,7590,7592,7594,7596,7599],{"class":267,"line":871},[265,7582,7583],{"class":271},"      ;",[265,7585,7421],{"class":502},[265,7587,7424],{"class":271},[265,7589,7503],{"class":369},[265,7591,7506],{"class":271},[265,7593,1220],{"class":446},[265,7595,7404],{"class":271},[265,7597,7598],{"class":369},"abort",[265,7600,605],{"class":271},[265,7602,7603],{"class":267,"line":877},[265,7604,7605],{"class":616},"      // 从pendingRequest中删掉\n",[265,7607,7608,7610,7612,7615],{"class":267,"line":888},[265,7609,7466],{"class":502},[265,7611,7424],{"class":271},[265,7613,7614],{"class":369},"delete",[265,7616,7617],{"class":271},"(requestKey)\n",[265,7619,7620],{"class":267,"line":893},[265,7621,1251],{"class":271},[265,7623,7624],{"class":267,"line":898},[265,7625,1441],{"class":271},[265,7627,7628],{"class":267,"line":904},[265,7629,540],{"class":271},[7631,7632,7633],"h4",{"id":7633},"不发送请求",[18,7635,7636],{},"然而，当然可以不发送请求，可以有两种方式，一种是每个按钮添加loading；另一种是在请求层统一处理，如下",[256,7638,7640],{"className":357,"code":7639,"language":359,"meta":261,"style":261},"import type { AxiosError, AxiosInstance, AxiosRequestConfig } from 'axios'\nimport axios from 'axios'\nimport qs from 'qs'\n\n/** “不发送重复请求”：同键已有在途请求则抛错，不取消、不替换上一次请求 */\nexport class DuplicateRequestGuard {\n  /** 在途请求键（无 AbortController：不通过 abort 取消在途请求） */\n  private pendingKeys = new Set\u003Cstring>()\n\n  /** 用 method + url + 序列化后的 params/data 作为“同一请求”的键；排序保证键稳定 */\n  private generateReqKey(config: AxiosRequestConfig): string {\n    const { method = '', url = '' } = config\n    const params = qs.stringify(config.params, { sort: (a, b) => a.localeCompare(b) })\n    const data = typeof config.data === 'string'\n      ? config.data\n      : qs.stringify(config.data, { sort: (a, b) => a.localeCompare(b) })\n\n    return [method, url, params, data].join('&')\n  }\n\n  /** 若同键已在途则抛错，由拦截器转为 reject，本次请求不会发出 */\n  addPendingRequest(config: AxiosRequestConfig) {\n    const key = this.generateReqKey(config)\n    if (this.pendingKeys.has(key)) {\n      throw new Error('DUPLICATE_REQUEST')\n    }\n    this.pendingKeys.add(key)\n  }\n\n  /** 成功或失败都要调用，否则 Set 会一直认为该键仍在途 */\n  removePendingRequest(config: AxiosRequestConfig) {\n    const key = this.generateReqKey(config)\n    this.pendingKeys.delete(key)\n  }\n\n  clear() {\n    this.pendingKeys.clear()\n  }\n}\n\n// 与拦截器共用的单例（须放在类声明之后，避免 TDZ）\nconst duplicateRequestGuard = new DuplicateRequestGuard()\n\nclass RequestHttp {\n  private service: AxiosInstance\n\n  constructor(config: AxiosRequestConfig) {\n    this.service = axios.create(config)\n\n    this.service.interceptors.request.use(\n      (config) => {\n        try {\n          duplicateRequestGuard.addPendingRequest(config)\n        }\n        catch (e) {\n          // 避免prefer-promise-reject-errors，即 reject 须为 Error，再用属性区分业务类型\n          return Promise.reject(\n            Object.assign(new Error('重复请求'), { type: 'duplicate' as const })\n          )\n        }\n        return config\n      },\n      error => Promise.reject(error)\n    )\n\n    this.service.interceptors.response.use(\n      (response) => {\n        duplicateRequestGuard.removePendingRequest(response.config)\n\n        const { data } = response\n        const { code } = data\n\n        if (code === 401) {\n          // 401\n          return Promise.reject(data)\n        }\n\n        if (code && code !== 200) {\n          return Promise.reject(data)\n        }\n\n        return data\n      },\n      (error: AxiosError) => {\n        if (error.config) {\n          duplicateRequestGuard.removePendingRequest(error.config)\n        }\n\n        if (error.message?.includes('timeout')) {\n          showWarning('请求超时')\n        }\n\n        if (!navigator.onLine) {\n          window.location.hash = '/500'\n        }\n\n        return Promise.reject(error)\n      }\n    )\n  }\n\n  request\u003CT = any>(config: AxiosRequestConfig): Promise\u003CT> {\n    return this.service.request(config)\n  }\n}\n",[22,7641,7642,7655,7666,7676,7680,7685,7696,7701,7720,7724,7729,7751,7777,7820,7840,7848,7880,7884,7899,7903,7907,7912,7926,7943,7959,7976,7980,7992,7996,8000,8005,8019,8035,8045,8049,8053,8060,8071,8075,8079,8083,8088,8103,8107,8117,8129,8133,8147,8164,8168,8180,8193,8200,8210,8215,8223,8228,8243,8277,8282,8286,8293,8298,8314,8319,8323,8334,8347,8358,8362,8378,8392,8396,8411,8416,8429,8433,8437,8456,8468,8472,8476,8482,8486,8504,8511,8520,8524,8528,8545,8557,8561,8565,8576,8586,8590,8594,8606,8611,8615,8619,8623,8657,8671,8675],{"__ignoreMap":261},[265,7643,7644,7646,7648,7651,7653],{"class":267,"line":268},[265,7645,447],{"class":446},[265,7647,481],{"class":446},[265,7649,7650],{"class":271}," { AxiosError, AxiosInstance, AxiosRequestConfig } ",[265,7652,453],{"class":446},[265,7654,7176],{"class":437},[265,7656,7657,7659,7662,7664],{"class":267,"line":275},[265,7658,447],{"class":446},[265,7660,7661],{"class":271}," axios ",[265,7663,453],{"class":446},[265,7665,7176],{"class":437},[265,7667,7668,7670,7672,7674],{"class":267,"line":281},[265,7669,447],{"class":446},[265,7671,7183],{"class":271},[265,7673,453],{"class":446},[265,7675,7188],{"class":437},[265,7677,7678],{"class":267,"line":309},[265,7679,473],{"emptyLinePlaceholder":331},[265,7681,7682],{"class":267,"line":323},[265,7683,7684],{"class":616},"/** “不发送重复请求”：同键已有在途请求则抛错，不取消、不替换上一次请求 */\n",[265,7686,7687,7689,7691,7694],{"class":267,"line":493},[265,7688,478],{"class":446},[265,7690,2269],{"class":446},[265,7692,7693],{"class":369}," DuplicateRequestGuard",[265,7695,490],{"class":271},[265,7697,7698],{"class":267,"line":506},[265,7699,7700],{"class":616},"  /** 在途请求键（无 AbortController：不通过 abort 取消在途请求） */\n",[265,7702,7703,7705,7708,7710,7712,7714,7716,7718],{"class":267,"line":517},[265,7704,7213],{"class":446},[265,7706,7707],{"class":394}," pendingKeys",[265,7709,487],{"class":446},[265,7711,1064],{"class":446},[265,7713,1067],{"class":369},[265,7715,421],{"class":271},[265,7717,5236],{"class":502},[265,7719,7263],{"class":271},[265,7721,7722],{"class":267,"line":527},[265,7723,473],{"emptyLinePlaceholder":331},[265,7725,7726],{"class":267,"line":537},[265,7727,7728],{"class":616},"  /** 用 method + url + 序列化后的 params/data 作为“同一请求”的键；排序保证键稳定 */\n",[265,7730,7731,7733,7735,7737,7739,7741,7743,7745,7747,7749],{"class":267,"line":543},[265,7732,7213],{"class":446},[265,7734,7278],{"class":369},[265,7736,391],{"class":271},[265,7738,7283],{"class":394},[265,7740,499],{"class":446},[265,7742,7288],{"class":369},[265,7744,6705],{"class":271},[265,7746,499],{"class":446},[265,7748,3578],{"class":502},[265,7750,490],{"class":271},[265,7752,7753,7755,7757,7759,7761,7763,7765,7767,7769,7771,7773,7775],{"class":267,"line":548},[265,7754,7301],{"class":446},[265,7756,846],{"class":271},[265,7758,7306],{"class":502},[265,7760,487],{"class":446},[265,7762,7331],{"class":437},[265,7764,1824],{"class":271},[265,7766,7311],{"class":502},[265,7768,487],{"class":446},[265,7770,7331],{"class":437},[265,7772,852],{"class":271},[265,7774,434],{"class":446},[265,7776,7318],{"class":271},[265,7778,7779,7781,7784,7786,7789,7791,7794,7797,7800,7802,7804,7807,7809,7811,7814,7817],{"class":267,"line":561},[265,7780,7301],{"class":446},[265,7782,7783],{"class":502}," params",[265,7785,487],{"class":446},[265,7787,7788],{"class":271}," qs.",[265,7790,7344],{"class":369},[265,7792,7793],{"class":271},"(config.params, { ",[265,7795,7796],{"class":369},"sort",[265,7798,7799],{"class":271},": (",[265,7801,33],{"class":394},[265,7803,1824],{"class":271},[265,7805,7806],{"class":394},"b",[265,7808,719],{"class":271},[265,7810,722],{"class":446},[265,7812,7813],{"class":271}," a.",[265,7815,7816],{"class":369},"localeCompare",[265,7818,7819],{"class":271},"(b) })\n",[265,7821,7822,7824,7827,7829,7832,7835,7837],{"class":267,"line":571},[265,7823,7301],{"class":446},[265,7825,7826],{"class":502}," data",[265,7828,487],{"class":446},[265,7830,7831],{"class":446}," typeof",[265,7833,7834],{"class":271}," config.data ",[265,7836,1396],{"class":446},[265,7838,7839],{"class":437}," 'string'\n",[265,7841,7842,7845],{"class":267,"line":581},[265,7843,7844],{"class":446},"      ?",[265,7846,7847],{"class":271}," config.data\n",[265,7849,7850,7853,7855,7857,7860,7862,7864,7866,7868,7870,7872,7874,7876,7878],{"class":267,"line":586},[265,7851,7852],{"class":446},"      :",[265,7854,7788],{"class":271},[265,7856,7344],{"class":369},[265,7858,7859],{"class":271},"(config.data, { ",[265,7861,7796],{"class":369},[265,7863,7799],{"class":271},[265,7865,33],{"class":394},[265,7867,1824],{"class":271},[265,7869,7806],{"class":394},[265,7871,719],{"class":271},[265,7873,722],{"class":446},[265,7875,7813],{"class":271},[265,7877,7816],{"class":369},[265,7879,7819],{"class":271},[265,7881,7882],{"class":267,"line":591},[265,7883,473],{"emptyLinePlaceholder":331},[265,7885,7886,7888,7891,7893,7895,7897],{"class":267,"line":608},[265,7887,7323],{"class":446},[265,7889,7890],{"class":271}," [method, url, params, data].",[265,7892,7355],{"class":369},[265,7894,391],{"class":271},[265,7896,7360],{"class":437},[265,7898,638],{"class":271},[265,7900,7901],{"class":267,"line":613},[265,7902,1441],{"class":271},[265,7904,7905],{"class":267,"line":620},[265,7906,473],{"emptyLinePlaceholder":331},[265,7908,7909],{"class":267,"line":641},[265,7910,7911],{"class":616},"  /** 若同键已在途则抛错，由拦截器转为 reject，本次请求不会发出 */\n",[265,7913,7914,7916,7918,7920,7922,7924],{"class":267,"line":646},[265,7915,7375],{"class":369},[265,7917,391],{"class":271},[265,7919,7283],{"class":394},[265,7921,499],{"class":446},[265,7923,7288],{"class":369},[265,7925,1116],{"class":271},[265,7927,7928,7930,7933,7935,7937,7939,7941],{"class":267,"line":652},[265,7929,7301],{"class":446},[265,7931,7932],{"class":502}," key",[265,7934,487],{"class":446},[265,7936,7401],{"class":502},[265,7938,7404],{"class":271},[265,7940,7407],{"class":369},[265,7942,7410],{"class":271},[265,7944,7945,7947,7949,7951,7954,7956],{"class":267,"line":677},[265,7946,1214],{"class":446},[265,7948,1217],{"class":271},[265,7950,7421],{"class":502},[265,7952,7953],{"class":271},".pendingKeys.",[265,7955,1131],{"class":369},[265,7957,7958],{"class":271},"(key)) {\n",[265,7960,7961,7964,7966,7969,7971,7974],{"class":267,"line":682},[265,7962,7963],{"class":446},"      throw",[265,7965,1064],{"class":446},[265,7967,7968],{"class":369}," Error",[265,7970,391],{"class":271},[265,7972,7973],{"class":437},"'DUPLICATE_REQUEST'",[265,7975,638],{"class":271},[265,7977,7978],{"class":267,"line":688},[265,7979,1251],{"class":271},[265,7981,7982,7984,7986,7989],{"class":267,"line":741},[265,7983,7243],{"class":502},[265,7985,7953],{"class":271},[265,7987,7988],{"class":369},"add",[265,7990,7991],{"class":271},"(key)\n",[265,7993,7994],{"class":267,"line":746},[265,7995,1441],{"class":271},[265,7997,7998],{"class":267,"line":752},[265,7999,473],{"emptyLinePlaceholder":331},[265,8001,8002],{"class":267,"line":771},[265,8003,8004],{"class":616},"  /** 成功或失败都要调用，否则 Set 会一直认为该键仍在途 */\n",[265,8006,8007,8009,8011,8013,8015,8017],{"class":267,"line":789},[265,8008,7528],{"class":369},[265,8010,391],{"class":271},[265,8012,7283],{"class":394},[265,8014,499],{"class":446},[265,8016,7288],{"class":369},[265,8018,1116],{"class":271},[265,8020,8021,8023,8025,8027,8029,8031,8033],{"class":267,"line":794},[265,8022,7301],{"class":446},[265,8024,7932],{"class":502},[265,8026,487],{"class":446},[265,8028,7401],{"class":502},[265,8030,7404],{"class":271},[265,8032,7407],{"class":369},[265,8034,7410],{"class":271},[265,8036,8037,8039,8041,8043],{"class":267,"line":800},[265,8038,7243],{"class":502},[265,8040,7953],{"class":271},[265,8042,7614],{"class":369},[265,8044,7991],{"class":271},[265,8046,8047],{"class":267,"line":820},[265,8048,1441],{"class":271},[265,8050,8051],{"class":267,"line":825},[265,8052,473],{"emptyLinePlaceholder":331},[265,8054,8055,8058],{"class":267,"line":840},[265,8056,8057],{"class":369},"  clear",[265,8059,837],{"class":271},[265,8061,8062,8064,8066,8069],{"class":267,"line":865},[265,8063,7243],{"class":502},[265,8065,7953],{"class":271},[265,8067,8068],{"class":369},"clear",[265,8070,605],{"class":271},[265,8072,8073],{"class":267,"line":871},[265,8074,1441],{"class":271},[265,8076,8077],{"class":267,"line":877},[265,8078,540],{"class":271},[265,8080,8081],{"class":267,"line":888},[265,8082,473],{"emptyLinePlaceholder":331},[265,8084,8085],{"class":267,"line":893},[265,8086,8087],{"class":616},"// 与拦截器共用的单例（须放在类声明之后，避免 TDZ）\n",[265,8089,8090,8092,8095,8097,8099,8101],{"class":267,"line":898},[265,8091,594],{"class":446},[265,8093,8094],{"class":502}," duplicateRequestGuard",[265,8096,487],{"class":446},[265,8098,1064],{"class":446},[265,8100,7693],{"class":369},[265,8102,605],{"class":271},[265,8104,8105],{"class":267,"line":904},[265,8106,473],{"emptyLinePlaceholder":331},[265,8108,8109,8112,8115],{"class":267,"line":923},[265,8110,8111],{"class":446},"class",[265,8113,8114],{"class":369}," RequestHttp",[265,8116,490],{"class":271},[265,8118,8119,8121,8124,8126],{"class":267,"line":928},[265,8120,7213],{"class":446},[265,8122,8123],{"class":394}," service",[265,8125,499],{"class":446},[265,8127,8128],{"class":369}," AxiosInstance\n",[265,8130,8131],{"class":267,"line":934},[265,8132,473],{"emptyLinePlaceholder":331},[265,8134,8135,8137,8139,8141,8143,8145],{"class":267,"line":952},[265,8136,7236],{"class":446},[265,8138,391],{"class":271},[265,8140,7283],{"class":394},[265,8142,499],{"class":446},[265,8144,7288],{"class":369},[265,8146,1116],{"class":271},[265,8148,8149,8151,8154,8156,8159,8162],{"class":267,"line":957},[265,8150,7243],{"class":502},[265,8152,8153],{"class":271},".service ",[265,8155,434],{"class":446},[265,8157,8158],{"class":271}," axios.",[265,8160,8161],{"class":369},"create",[265,8163,7410],{"class":271},[265,8165,8166],{"class":267,"line":963},[265,8167,473],{"emptyLinePlaceholder":331},[265,8169,8170,8172,8175,8178],{"class":267,"line":981},[265,8171,7243],{"class":502},[265,8173,8174],{"class":271},".service.interceptors.request.",[265,8176,8177],{"class":369},"use",[265,8179,4090],{"class":271},[265,8181,8182,8185,8187,8189,8191],{"class":267,"line":986},[265,8183,8184],{"class":271},"      (",[265,8186,7283],{"class":394},[265,8188,719],{"class":271},[265,8190,722],{"class":446},[265,8192,490],{"class":271},[265,8194,8195,8198],{"class":267,"line":992},[265,8196,8197],{"class":446},"        try",[265,8199,490],{"class":271},[265,8201,8202,8205,8208],{"class":267,"line":1010},[265,8203,8204],{"class":271},"          duplicateRequestGuard.",[265,8206,8207],{"class":369},"addPendingRequest",[265,8209,7410],{"class":271},[265,8211,8212],{"class":267,"line":1015},[265,8213,8214],{"class":271},"        }\n",[265,8216,8217,8220],{"class":267,"line":1021},[265,8218,8219],{"class":446},"        catch",[265,8221,8222],{"class":271}," (e) {\n",[265,8224,8225],{"class":267,"line":1035},[265,8226,8227],{"class":616},"          // 避免prefer-promise-reject-errors，即 reject 须为 Error，再用属性区分业务类型\n",[265,8229,8230,8233,8236,8238,8241],{"class":267,"line":1040},[265,8231,8232],{"class":446},"          return",[265,8234,8235],{"class":502}," Promise",[265,8237,7404],{"class":271},[265,8239,8240],{"class":369},"reject",[265,8242,4090],{"class":271},[265,8244,8245,8248,8251,8253,8256,8258,8260,8263,8266,8269,8272,8275],{"class":267,"line":1046},[265,8246,8247],{"class":271},"            Object.",[265,8249,8250],{"class":369},"assign",[265,8252,391],{"class":271},[265,8254,8255],{"class":446},"new",[265,8257,7968],{"class":369},[265,8259,391],{"class":271},[265,8261,8262],{"class":437},"'重复请求'",[265,8264,8265],{"class":271},"), { type: ",[265,8267,8268],{"class":437},"'duplicate'",[265,8270,8271],{"class":446}," as",[265,8273,8274],{"class":446}," const",[265,8276,5275],{"class":271},[265,8278,8279],{"class":267,"line":1087},[265,8280,8281],{"class":271},"          )\n",[265,8283,8284],{"class":267,"line":1092},[265,8285,8214],{"class":271},[265,8287,8288,8291],{"class":267,"line":1098},[265,8289,8290],{"class":446},"        return",[265,8292,7318],{"class":271},[265,8294,8295],{"class":267,"line":1119},[265,8296,8297],{"class":271},"      },\n",[265,8299,8300,8303,8305,8307,8309,8311],{"class":267,"line":1137},[265,8301,8302],{"class":394},"      error",[265,8304,1081],{"class":446},[265,8306,8235],{"class":502},[265,8308,7404],{"class":271},[265,8310,8240],{"class":369},[265,8312,8313],{"class":271},"(error)\n",[265,8315,8316],{"class":267,"line":1142},[265,8317,8318],{"class":271},"    )\n",[265,8320,8321],{"class":267,"line":1147},[265,8322,473],{"emptyLinePlaceholder":331},[265,8324,8325,8327,8330,8332],{"class":267,"line":1153},[265,8326,7243],{"class":502},[265,8328,8329],{"class":271},".service.interceptors.response.",[265,8331,8177],{"class":369},[265,8333,4090],{"class":271},[265,8335,8336,8338,8341,8343,8345],{"class":267,"line":1173},[265,8337,8184],{"class":271},[265,8339,8340],{"class":394},"response",[265,8342,719],{"class":271},[265,8344,722],{"class":446},[265,8346,490],{"class":271},[265,8348,8349,8352,8355],{"class":267,"line":1184},[265,8350,8351],{"class":271},"        duplicateRequestGuard.",[265,8353,8354],{"class":369},"removePendingRequest",[265,8356,8357],{"class":271},"(response.config)\n",[265,8359,8360],{"class":267,"line":1190},[265,8361,473],{"emptyLinePlaceholder":331},[265,8363,8364,8367,8369,8371,8373,8375],{"class":267,"line":1211},[265,8365,8366],{"class":446},"        const",[265,8368,846],{"class":271},[265,8370,849],{"class":502},[265,8372,852],{"class":271},[265,8374,434],{"class":446},[265,8376,8377],{"class":271}," response\n",[265,8379,8380,8382,8384,8386,8388,8390],{"class":267,"line":1230},[265,8381,8366],{"class":446},[265,8383,846],{"class":271},[265,8385,22],{"class":502},[265,8387,852],{"class":271},[265,8389,434],{"class":446},[265,8391,885],{"class":271},[265,8393,8394],{"class":267,"line":1248},[265,8395,473],{"emptyLinePlaceholder":331},[265,8397,8398,8401,8404,8406,8409],{"class":267,"line":1254},[265,8399,8400],{"class":446},"        if",[265,8402,8403],{"class":271}," (code ",[265,8405,1396],{"class":446},[265,8407,8408],{"class":502}," 401",[265,8410,1116],{"class":271},[265,8412,8413],{"class":267,"line":1259},[265,8414,8415],{"class":616},"          // 401\n",[265,8417,8418,8420,8422,8424,8426],{"class":267,"line":1265},[265,8419,8232],{"class":446},[265,8421,8235],{"class":502},[265,8423,7404],{"class":271},[265,8425,8240],{"class":369},[265,8427,8428],{"class":271},"(data)\n",[265,8430,8431],{"class":267,"line":1277},[265,8432,8214],{"class":271},[265,8434,8435],{"class":267,"line":1288},[265,8436,473],{"emptyLinePlaceholder":331},[265,8438,8439,8441,8443,8446,8449,8451,8454],{"class":267,"line":1293},[265,8440,8400],{"class":446},[265,8442,8403],{"class":271},[265,8444,8445],{"class":446},"&&",[265,8447,8448],{"class":271}," code ",[265,8450,4115],{"class":446},[265,8452,8453],{"class":502}," 200",[265,8455,1116],{"class":271},[265,8457,8458,8460,8462,8464,8466],{"class":267,"line":1298},[265,8459,8232],{"class":446},[265,8461,8235],{"class":502},[265,8463,7404],{"class":271},[265,8465,8240],{"class":369},[265,8467,8428],{"class":271},[265,8469,8470],{"class":267,"line":1303},[265,8471,8214],{"class":271},[265,8473,8474],{"class":267,"line":1309},[265,8475,473],{"emptyLinePlaceholder":331},[265,8477,8478,8480],{"class":267,"line":1327},[265,8479,8290],{"class":446},[265,8481,885],{"class":271},[265,8483,8484],{"class":267,"line":1337},[265,8485,8297],{"class":271},[265,8487,8488,8490,8493,8495,8498,8500,8502],{"class":267,"line":1342},[265,8489,8184],{"class":271},[265,8491,8492],{"class":394},"error",[265,8494,499],{"class":446},[265,8496,8497],{"class":369}," AxiosError",[265,8499,719],{"class":271},[265,8501,722],{"class":446},[265,8503,490],{"class":271},[265,8505,8506,8508],{"class":267,"line":1347},[265,8507,8400],{"class":446},[265,8509,8510],{"class":271}," (error.config) {\n",[265,8512,8513,8515,8517],{"class":267,"line":1353},[265,8514,8204],{"class":271},[265,8516,8354],{"class":369},[265,8518,8519],{"class":271},"(error.config)\n",[265,8521,8522],{"class":267,"line":1371},[265,8523,8214],{"class":271},[265,8525,8526],{"class":267,"line":1402},[265,8527,473],{"emptyLinePlaceholder":331},[265,8529,8530,8532,8535,8537,8539,8542],{"class":267,"line":1422},[265,8531,8400],{"class":446},[265,8533,8534],{"class":271}," (error.message?.",[265,8536,6393],{"class":369},[265,8538,391],{"class":271},[265,8540,8541],{"class":437},"'timeout'",[265,8543,8544],{"class":271},")) {\n",[265,8546,8547,8550,8552,8555],{"class":267,"line":1438},[265,8548,8549],{"class":369},"          showWarning",[265,8551,391],{"class":271},[265,8553,8554],{"class":437},"'请求超时'",[265,8556,638],{"class":271},[265,8558,8559],{"class":267,"line":1444},[265,8560,8214],{"class":271},[265,8562,8563],{"class":267,"line":1449},[265,8564,473],{"emptyLinePlaceholder":331},[265,8566,8567,8569,8571,8573],{"class":267,"line":1454},[265,8568,8400],{"class":446},[265,8570,1217],{"class":271},[265,8572,1220],{"class":446},[265,8574,8575],{"class":271},"navigator.onLine) {\n",[265,8577,8578,8581,8583],{"class":267,"line":1460},[265,8579,8580],{"class":271},"          window.location.hash ",[265,8582,434],{"class":446},[265,8584,8585],{"class":437}," '/500'\n",[265,8587,8588],{"class":267,"line":1470},[265,8589,8214],{"class":271},[265,8591,8592],{"class":267,"line":1489},[265,8593,473],{"emptyLinePlaceholder":331},[265,8595,8596,8598,8600,8602,8604],{"class":267,"line":1505},[265,8597,8290],{"class":446},[265,8599,8235],{"class":502},[265,8601,7404],{"class":271},[265,8603,8240],{"class":369},[265,8605,8313],{"class":271},[265,8607,8608],{"class":267,"line":1511},[265,8609,8610],{"class":271},"      }\n",[265,8612,8613],{"class":267,"line":1516},[265,8614,8318],{"class":271},[265,8616,8617],{"class":267,"line":1544},[265,8618,1441],{"class":271},[265,8620,8621],{"class":267,"line":1573},[265,8622,473],{"emptyLinePlaceholder":331},[265,8624,8625,8628,8630,8632,8634,8636,8638,8640,8642,8644,8646,8648,8650,8652,8654],{"class":267,"line":1583},[265,8626,8627],{"class":369},"  request",[265,8629,421],{"class":271},[265,8631,5951],{"class":369},[265,8633,487],{"class":446},[265,8635,716],{"class":502},[265,8637,669],{"class":271},[265,8639,7283],{"class":394},[265,8641,499],{"class":446},[265,8643,7288],{"class":369},[265,8645,6705],{"class":271},[265,8647,499],{"class":446},[265,8649,8235],{"class":369},[265,8651,421],{"class":271},[265,8653,5951],{"class":369},[265,8655,8656],{"class":271},"> {\n",[265,8658,8659,8661,8663,8666,8669],{"class":267,"line":1588},[265,8660,7323],{"class":446},[265,8662,7401],{"class":502},[265,8664,8665],{"class":271},".service.",[265,8667,8668],{"class":369},"request",[265,8670,7410],{"class":271},[265,8672,8673],{"class":267,"line":1593},[265,8674,1441],{"class":271},[265,8676,8677],{"class":267,"line":1599},[265,8678,540],{"class":271},[7631,8680,8681],{"id":8681},"请求共享或缓存响应",[18,8683,8684,8685],{},"不过比起手动实现我更加推荐使用 ",[33,8686,8689],{"href":8687,"rel":8688},"https://alova.js.org/zh-CN/about/comparison#alova-%E4%B8%BA-axios-%E6%8F%90%E4%BE%9B%E5%93%8D%E5%BA%94%E6%95%B0%E6%8D%AE%E7%BC%93%E5%AD%98",[37],"Alova",[18,8691,8692],{},[68,8693,8694,8695,8698],{},"仍然记得发现这个库时的惊喜，当时颇有天下苦",[22,8696,8697],{},"Axios","久矣的感觉",[305,8700,8701],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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);}",{"title":261,"searchDepth":309,"depth":309,"links":8703},[8704,8705],{"id":7633,"depth":309,"text":7633},{"id":8681,"depth":309,"text":8681},"2026-04-15","记录了我从入门到现今对于请求封装的看法",{},"/thinking/avoid-duplicate-requests",{"title":7119,"description":8707},"thinking/避免重复请求的思考",[8713,8697,8689],"JavaScript","DMgbN0pt0grE_NNSczp_68bMN5X3p4bwNiv70gOZFS0",{"id":8716,"title":8717,"body":8718,"date":8941,"description":8942,"extension":260,"meta":8943,"navigation":331,"path":8944,"seo":8945,"stem":8946,"tags":8947,"__hash__":8948},"content/engineering/bfcache.md","bfcache可能导致新部署的代码不生效",{"type":8,"value":8719,"toc":8939},[8720,8936],[8721,8722,8726,8729,8737,8739,8742,8809,8812],"blur-reveal",{":duration":8723,"className":8724},"0.75",[8725],"pt-8",[18,8727,8728],{},"bfcache（Back/Forward Cache）可能让用户在前进 / 后退导航时看到的是旧页面状态，从而看不到新部署的代码，但这不是一次重新加载失败，而是浏览器的刻意设计行为。",[18,8730,8731,8736],{},[33,8732,8735],{"href":8733,"rel":8734},"https://web.dev/articles/bfcache?hl=zh-cn",[37],"bfcache"," 恢复的是“内存快照”，不是“最新资源”",[18,8738,163],{},[18,8740,8741],{},"手动检测",[256,8743,8747],{"className":8744,"code":8745,"language":8746,"meta":261,"style":261},"language-js shiki shiki-themes github-light github-dark","window.addEventListener('pageshow', (event) => {\n  if (event.persisted) {\n    // 来自 bfcache\n    console.warn('Restored from bfcache')\n  }\n})\n","js",[22,8748,8749,8774,8781,8786,8801,8805],{"__ignoreMap":261},[265,8750,8751,8754,8757,8759,8762,8765,8768,8770,8772],{"class":267,"line":268},[265,8752,8753],{"class":271},"window.",[265,8755,8756],{"class":369},"addEventListener",[265,8758,391],{"class":271},[265,8760,8761],{"class":437},"'pageshow'",[265,8763,8764],{"class":271},", (",[265,8766,8767],{"class":394},"event",[265,8769,719],{"class":271},[265,8771,722],{"class":446},[265,8773,490],{"class":271},[265,8775,8776,8778],{"class":267,"line":275},[265,8777,1405],{"class":446},[265,8779,8780],{"class":271}," (event.persisted) {\n",[265,8782,8783],{"class":267,"line":281},[265,8784,8785],{"class":616},"    // 来自 bfcache\n",[265,8787,8788,8791,8794,8796,8799],{"class":267,"line":309},[265,8789,8790],{"class":271},"    console.",[265,8792,8793],{"class":369},"warn",[265,8795,391],{"class":271},[265,8797,8798],{"class":437},"'Restored from bfcache'",[265,8800,638],{"class":271},[265,8802,8803],{"class":267,"line":323},[265,8804,1441],{"class":271},[265,8806,8807],{"class":267,"line":493},[265,8808,403],{"class":271},[18,8810,8811],{},"版本校验",[256,8813,8815],{"className":8744,"code":8814,"language":8746,"meta":261,"style":261},"window.addEventListener('pageshow', async (e) => {\n  if (e.persisted) {\n    const latest = await fetch('/version.json', { cache: 'no-store' })\n    const { version } = await latest.json()\n\n    if (version !== __APP_VERSION__) {\n      location.reload()\n    }\n  }\n})\n",[22,8816,8817,8841,8848,8875,8898,8902,8914,8924,8928,8932],{"__ignoreMap":261},[265,8818,8819,8821,8823,8825,8827,8829,8831,8833,8835,8837,8839],{"class":267,"line":268},[265,8820,8753],{"class":271},[265,8822,8756],{"class":369},[265,8824,391],{"class":271},[265,8826,8761],{"class":437},[265,8828,1824],{"class":271},[265,8830,828],{"class":446},[265,8832,1217],{"class":271},[265,8834,6697],{"class":394},[265,8836,719],{"class":271},[265,8838,722],{"class":446},[265,8840,490],{"class":271},[265,8842,8843,8845],{"class":267,"line":275},[265,8844,1405],{"class":446},[265,8846,8847],{"class":271}," (e.persisted) {\n",[265,8849,8850,8852,8855,8857,8859,8862,8864,8867,8870,8873],{"class":267,"line":281},[265,8851,7301],{"class":446},[265,8853,8854],{"class":502}," latest",[265,8856,487],{"class":446},[265,8858,857],{"class":446},[265,8860,8861],{"class":369}," fetch",[265,8863,391],{"class":271},[265,8865,8866],{"class":437},"'/version.json'",[265,8868,8869],{"class":271},", { cache: ",[265,8871,8872],{"class":437},"'no-store'",[265,8874,5275],{"class":271},[265,8876,8877,8879,8881,8884,8886,8888,8890,8893,8896],{"class":267,"line":309},[265,8878,7301],{"class":446},[265,8880,846],{"class":271},[265,8882,8883],{"class":502},"version",[265,8885,852],{"class":271},[265,8887,434],{"class":446},[265,8889,857],{"class":446},[265,8891,8892],{"class":271}," latest.",[265,8894,8895],{"class":369},"json",[265,8897,605],{"class":271},[265,8899,8900],{"class":267,"line":323},[265,8901,473],{"emptyLinePlaceholder":331},[265,8903,8904,8906,8909,8911],{"class":267,"line":493},[265,8905,1214],{"class":446},[265,8907,8908],{"class":271}," (version ",[265,8910,4115],{"class":446},[265,8912,8913],{"class":271}," __APP_VERSION__) {\n",[265,8915,8916,8919,8922],{"class":267,"line":506},[265,8917,8918],{"class":271},"      location.",[265,8920,8921],{"class":369},"reload",[265,8923,605],{"class":271},[265,8925,8926],{"class":267,"line":517},[265,8927,1251],{"class":271},[265,8929,8930],{"class":267,"line":527},[265,8931,1441],{"class":271},[265,8933,8934],{"class":267,"line":537},[265,8935,403],{"class":271},[305,8937,8938],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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 .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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":261,"searchDepth":309,"depth":309,"links":8940},[],"2026-01-14","前端应用成功发布新版本后，bfcache有可能导致新代码不生效",{},"/engineering/bfcache",{"title":8717,"description":8942},"engineering/bfcache",[8735],"IEH7a00Hdqpna3D5yOsW_FT1XoOil4h_J1SaIerGTFA",{"id":8950,"title":8951,"body":8952,"date":9096,"description":9097,"extension":260,"meta":9098,"navigation":331,"path":9099,"seo":9100,"stem":9101,"tags":9102,"__hash__":9104},"content/life/读过的书（技术）.md","一些读过的、在读的技术书籍",{"type":8,"value":8953,"toc":9088},[8954,8957,8963,8968,8971,8974,8978,8983,8998,9000,9004,9010,9015,9018,9020,9023,9029,9034,9037,9039,9043,9049,9053,9056,9058,9062,9068,9081],[14,8955,8956],{"id":8956},"前端工程体验优化实战",[18,8958,8959],{},[33,8960,8956],{"href":8961,"rel":8962},"https://juejin.cn/book/7306163555449962533?enter_from=course_center&utm_source=course_center",[37],[112,8964,8965],{},[18,8966,8967],{},"阅读时间：2024年前后",[18,8969,8970],{},"我是怎么认识监控与指标的，以及为什么要进行指标化。",[8972,8973],"hr",{},[14,8975,8977],{"id":8976},"vuejs设计与实现","Vue.js设计与实现",[112,8979,8980],{},[18,8981,8982],{},"阅读时间：2022年年中开始，未读完",[18,8984,8985,8986,8989,8990,8993,8994,8997],{},"我是怎么理解和思考 ",[22,8987,8988],{},"Vue.js"," 的，可以说书中的“权衡”就是前端技术的顶峰，尽管当时还不理解 ",[22,8991,8992],{},"Functional Programming","、不理解 ",[22,8995,8996],{},"Functional Reactive Programming","。但读这本书让我不停地思考为什么，我始终就像十几年前的自己一直在问为什么。",[8972,8999],{},[14,9001,9003],{"id":9002},"javascript-函数式编程实践指南","JavaScript 函数式编程实践指南",[18,9005,9006],{},[33,9007,9003],{"href":9008,"rel":9009},"https://juejin.cn/book/7173591403639865377?enter_from=course_center&utm_source=course_center",[37],[112,9011,9012],{},[18,9013,9014],{},"阅读时间：2024年",[18,9016,9017],{},"代码究竟应该如何组合才能真正降低复杂度，虽然这本书的主旨在于函数式编程，但函数式编程，乃至组合，乃至范畴论都能回答这个问题。在我看来，组件化远不止拆离文件：与外部如何约定、状态如何管理、边界如何划分？这本书并未真正解答这些问题，但却给了我思考的方向。",[8972,9019],{},[14,9021,9022],{"id":9022},"前端性能优化原理与实践",[18,9024,9025],{},[33,9026,9022],{"href":9027,"rel":9028},"https://juejin.cn/book/6844733750048210957?enter_from=course_center&utm_source=course_center",[37],[112,9030,9031],{},[18,9032,9033],{},"阅读时间：2023年",[18,9035,9036],{},"简单入门的性能优化，但是对于更加现代的网页，SSR、SSG 是少不了的。",[8972,9038],{},[14,9040,9042],{"id":9041},"javascript-设计模式核心原理与应用实践","JavaScript 设计模式核心原理与应用实践",[18,9044,9045],{},[33,9046,9042],{"href":9047,"rel":9048},"https://juejin.cn/book/6844733790204461070?enter_from=course_center&utm_source=course_center",[37],[112,9050,9051],{},[18,9052,9033],{},[18,9054,9055],{},"易于理解的设计模式讲解。",[8972,9057],{},[14,9059,9061],{"id":9060},"webpack5-核心原理与应用实践","Webpack5 核心原理与应用实践",[18,9063,9064],{},[33,9065,9061],{"href":9066,"rel":9067},"https://juejin.cn/book/7115598540721618944?scrollMenuIndex=0",[37],[112,9069,9070],{},[18,9071,9072,9073,9076,9077,9080],{},"阅读时间：2024年，",[22,9074,9075],{},"plugin","和",[22,9078,9079],{},"loader","未读完，所以现在还不会写插件",[18,9082,9083,9084,9087],{},"不得不承认 ",[22,9085,9086],{},"Webpack"," 相当复杂，但这本书也并非完全深入核心讲解原理。",{"title":261,"searchDepth":309,"depth":309,"links":9089},[9090,9091,9092,9093,9094,9095],{"id":8956,"depth":275,"text":8956},{"id":8976,"depth":275,"text":8977},{"id":9002,"depth":275,"text":9003},{"id":9022,"depth":275,"text":9022},{"id":9041,"depth":275,"text":9042},{"id":9060,"depth":275,"text":9061},"2026-01-04","几乎都是小册……",{},"/life/tech-books-read",{"title":8951,"description":9097},"life/读过的书（技术）",[9103],"Reading","6FUXNXbxg7aER3WBprCKrVEyQhJiSuDprP5ZIOJfYm0",{"id":9106,"title":9107,"body":9108,"date":12855,"description":12856,"extension":260,"meta":12857,"navigation":331,"path":12858,"seo":12859,"stem":12860,"tags":12861,"__hash__":12864},"content/life/hello-world.md","Hello Nuxt Blog",{"type":8,"value":9109,"toc":12850},[9110,9114,9122,9125,9128,9136,9140,9148,9151,10051,10385,10387,11407,11409,12288,12290],[11,9111,9113],{"id":9112},"hello-world","Hello World",[18,9115,9116,9117,9121],{},"This is a ",[9118,9119,9120],"strong",{},"fully TypeScript controlled"," Nuxt 3 blog.",[18,9123,9124],{},"这是一个测试文档",[14,9126,9127],{"id":9127},"测试按钮",[9129,9130],"interactive-hover-button",{"className":9131,"message":9134,"text":9135},[9132,9133],"max-w-[200px]","mb-4","keep it up","一个按钮",[14,9137,9139],{"id":9138},"测试tooltip","测试Tooltip",[18,9141,9142,9143,9147],{},"这里有一个术语提示示例：",[90,9144,9146],{"text":9145,"tone":93},"范畴论里的基本构造：给定 A、B，积 A×B 满足一个泛性质。","积 (product)","。",[14,9149,9150],{"id":9150},"测试公式渲染",[18,9152,9153,9154,5905,9200,9230,9231,9288,9289,9350,9351,9432,9433,9506,9507,9147],{},"两个范畴 ",[265,9155,9158,9182],{"className":9156},[9157],"katex",[265,9159,9162],{"className":9160},[9161],"katex-mathml",[9163,9164,9166],"math",{"xmlns":9165},"http://www.w3.org/1998/Math/MathML",[9167,9168,9169,9177],"semantics",{},[9170,9171,9172],"mrow",{},[9173,9174,9176],"mi",{"mathvariant":9175},"bold","C",[9178,9179,9181],"annotation",{"encoding":9180},"application/x-tex","\\mathbf{C}",[265,9183,9186],{"className":9184,"ariaHidden":6148},[9185],"katex-html",[265,9187,9190,9195],{"className":9188},[9189],"base",[265,9191],{"className":9192,"style":9194},[9193],"strut","height:0.6861em;",[265,9196,9176],{"className":9197},[9198,9199],"mord","mathbf",[265,9201,9203,9218],{"className":9202},[9157],[265,9204,9206],{"className":9205},[9161],[9163,9207,9208],{"xmlns":9165},[9167,9209,9210,9215],{},[9170,9211,9212],{},[9173,9213,9214],{"mathvariant":9175},"D",[9178,9216,9217],{"encoding":9180},"\\mathbf{D}",[265,9219,9221],{"className":9220,"ariaHidden":6148},[9185],[265,9222,9224,9227],{"className":9223},[9189],[265,9225],{"className":9226,"style":9194},[9193],[265,9228,9214],{"className":9229},[9198,9199]," 的积范畴定义为 ",[265,9232,9234,9254],{"className":9233},[9157],[265,9235,9237],{"className":9236},[9161],[9163,9238,9239],{"xmlns":9165},[9167,9240,9241,9251],{},[9170,9242,9243,9245,9249],{},[9173,9244,9176],{"mathvariant":9175},[9246,9247,9248],"mo",{},"×",[9173,9250,9214],{"mathvariant":9175},[9178,9252,9253],{"encoding":9180},"\\mathbf{C} \\times \\mathbf{D}",[265,9255,9257,9279],{"className":9256,"ariaHidden":6148},[9185],[265,9258,9260,9264,9267,9272,9276],{"className":9259},[9189],[265,9261],{"className":9262,"style":9263},[9193],"height:0.7694em;vertical-align:-0.0833em;",[265,9265,9176],{"className":9266},[9198,9199],[265,9268],{"className":9269,"style":9271},[9270],"mspace","margin-right:0.2222em;",[265,9273,9248],{"className":9274},[9275],"mbin",[265,9277],{"className":9278,"style":9271},[9270],[265,9280,9282,9285],{"className":9281},[9189],[265,9283],{"className":9284,"style":9194},[9193],[265,9286,9214],{"className":9287},[9198,9199],"，其对象为有序对 ",[265,9290,9292,9315],{"className":9291},[9157],[265,9293,9295],{"className":9294},[9161],[9163,9296,9297],{"xmlns":9165},[9167,9298,9299,9312],{},[9170,9300,9301,9303,9305,9308,9310],{},[9246,9302,391],{"stretchy":635},[9173,9304,9176],{},[9246,9306,9307],{"separator":6148},",",[9173,9309,9214],{},[9246,9311,6705],{"stretchy":635},[9178,9313,9314],{"encoding":9180},"(C,D)",[265,9316,9318],{"className":9317,"ariaHidden":6148},[9185],[265,9319,9321,9325,9329,9334,9338,9342,9346],{"className":9320},[9189],[265,9322],{"className":9323,"style":9324},[9193],"height:1em;vertical-align:-0.25em;",[265,9326,391],{"className":9327},[9328],"mopen",[265,9330,9176],{"className":9331,"style":9333},[9198,9332],"mathnormal","margin-right:0.07153em;",[265,9335,9307],{"className":9336},[9337],"mpunct",[265,9339],{"className":9340,"style":9341},[9270],"margin-right:0.1667em;",[265,9343,9214],{"className":9344,"style":9345},[9198,9332],"margin-right:0.02778em;",[265,9347,6705],{"className":9348},[9349],"mclose","，其中 ",[265,9352,9354,9385],{"className":9353},[9157],[265,9355,9357],{"className":9356},[9161],[9163,9358,9359],{"xmlns":9165},[9167,9360,9361,9382],{},[9170,9362,9363,9365,9368,9376,9378,9380],{},[9173,9364,9176],{},[9246,9366,9367],{},"∈",[9170,9369,9370,9374],{},[9173,9371,9373],{"mathvariant":9372},"normal","O",[9173,9375,7806],{"mathvariant":9372},[9246,9377,391],{"stretchy":635},[9173,9379,9176],{"mathvariant":9175},[9246,9381,6705],{"stretchy":635},[9178,9383,9384],{"encoding":9180},"C \\in \\mathrm{Ob}(\\mathbf{C})",[265,9386,9388,9409],{"className":9387,"ariaHidden":6148},[9185],[265,9389,9391,9395,9398,9402,9406],{"className":9390},[9189],[265,9392],{"className":9393,"style":9394},[9193],"height:0.7224em;vertical-align:-0.0391em;",[265,9396,9176],{"className":9397,"style":9333},[9198,9332],[265,9399],{"className":9400,"style":9401},[9270],"margin-right:0.2778em;",[265,9403,9367],{"className":9404},[9405],"mrel",[265,9407],{"className":9408,"style":9401},[9270],[265,9410,9412,9415,9423,9426,9429],{"className":9411},[9189],[265,9413],{"className":9414,"style":9324},[9193],[265,9416,9418],{"className":9417},[9198],[265,9419,9422],{"className":9420},[9198,9421],"mathrm","Ob",[265,9424,391],{"className":9425},[9328],[265,9427,9176],{"className":9428},[9198,9199],[265,9430,6705],{"className":9431},[9349]," 且 ",[265,9434,9436,9464],{"className":9435},[9157],[265,9437,9439],{"className":9438},[9161],[9163,9440,9441],{"xmlns":9165},[9167,9442,9443,9461],{},[9170,9444,9445,9447,9449,9455,9457,9459],{},[9173,9446,9214],{},[9246,9448,9367],{},[9170,9450,9451,9453],{},[9173,9452,9373],{"mathvariant":9372},[9173,9454,7806],{"mathvariant":9372},[9246,9456,391],{"stretchy":635},[9173,9458,9214],{"mathvariant":9175},[9246,9460,6705],{"stretchy":635},[9178,9462,9463],{"encoding":9180},"D \\in \\mathrm{Ob}(\\mathbf{D})",[265,9465,9467,9485],{"className":9466,"ariaHidden":6148},[9185],[265,9468,9470,9473,9476,9479,9482],{"className":9469},[9189],[265,9471],{"className":9472,"style":9394},[9193],[265,9474,9214],{"className":9475,"style":9345},[9198,9332],[265,9477],{"className":9478,"style":9401},[9270],[265,9480,9367],{"className":9481},[9405],[265,9483],{"className":9484,"style":9401},[9270],[265,9486,9488,9491,9497,9500,9503],{"className":9487},[9189],[265,9489],{"className":9490,"style":9324},[9193],[265,9492,9494],{"className":9493},[9198],[265,9495,9422],{"className":9496},[9198,9421],[265,9498,391],{"className":9499},[9328],[265,9501,9214],{"className":9502},[9198,9199],[265,9504,6705],{"className":9505},[9349],"。\n其态射定义为：",[265,9508,9510,9638],{"className":9509},[9157],[265,9511,9513],{"className":9512},[9161],[9163,9514,9515],{"xmlns":9165},[9167,9516,9517,9635],{},[9170,9518,9519,9541,9544,9546,9548,9550,9552,9554,9556,9558,9567,9569,9575,9577,9579,9581,9593,9595,9597,9599,9605,9607,9609,9621,9623,9625,9627,9633],{},[9520,9521,9522,9533],"msub",{},[9170,9523,9524,9527,9530],{},[9173,9525,9526],{"mathvariant":9372},"H",[9173,9528,9529],{"mathvariant":9372},"o",[9173,9531,9532],{"mathvariant":9372},"m",[9170,9534,9535,9537,9539],{},[9173,9536,9176],{"mathvariant":9175},[9246,9538,9248],{},[9173,9540,9214],{"mathvariant":9175},[9246,9542,391],{"fence":635,"stretchy":6148,"minsize":9543,"maxsize":9543},"1.2em",[9246,9545,391],{"stretchy":635},[9173,9547,9176],{},[9246,9549,9307],{"separator":6148},[9173,9551,9214],{},[9246,9553,6705],{"stretchy":635},[9246,9555,9307],{"separator":6148},[9246,9557,391],{"stretchy":635},[9559,9560,9561,9563],"msup",{},[9173,9562,9176],{},[9246,9564,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},"0em","′",[9246,9568,9307],{"separator":6148},[9559,9570,9571,9573],{},[9173,9572,9214],{},[9246,9574,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,9576,6705],{"stretchy":635},[9246,9578,6705],{"fence":635,"stretchy":6148,"minsize":9543,"maxsize":9543},[9246,9580,434],{},[9520,9582,9583,9591],{},[9170,9584,9585,9587,9589],{},[9173,9586,9526],{"mathvariant":9372},[9173,9588,9529],{"mathvariant":9372},[9173,9590,9532],{"mathvariant":9372},[9173,9592,9176],{"mathvariant":9175},[9246,9594,391],{"stretchy":635},[9173,9596,9176],{},[9246,9598,9307],{"separator":6148},[9559,9600,9601,9603],{},[9173,9602,9176],{},[9246,9604,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,9606,6705],{"stretchy":635},[9246,9608,9248],{},[9520,9610,9611,9619],{},[9170,9612,9613,9615,9617],{},[9173,9614,9526],{"mathvariant":9372},[9173,9616,9529],{"mathvariant":9372},[9173,9618,9532],{"mathvariant":9372},[9173,9620,9214],{"mathvariant":9175},[9246,9622,391],{"stretchy":635},[9173,9624,9214],{},[9246,9626,9307],{"separator":6148},[9559,9628,9629,9631],{},[9173,9630,9214],{},[9246,9632,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,9634,6705],{"stretchy":635},[9178,9636,9637],{"encoding":9180},"\\mathrm{Hom}_{\\mathbf{C}\\times\\mathbf{D}}\\big((C,D),(C',D')\\big)=\\mathrm{Hom}_{\\mathbf{C}}(C,C')\\times\\mathrm{Hom}_{\\mathbf{D}}(D,D')",[265,9639,9641,9842,9952],{"className":9640,"ariaHidden":6148},[9185],[265,9642,9644,9648,9717,9725,9728,9731,9734,9737,9740,9743,9746,9749,9752,9786,9789,9792,9824,9827,9833,9836,9839],{"className":9643},[9189],[265,9645],{"className":9646,"style":9647},[9193],"height:1.2em;vertical-align:-0.35em;",[265,9649,9651,9658],{"className":9650},[9198],[265,9652,9654],{"className":9653},[9198],[265,9655,9657],{"className":9656},[9198,9421],"Hom",[265,9659,9662],{"className":9660},[9661],"msupsub",[265,9663,9667,9708],{"className":9664},[9665,9666],"vlist-t","vlist-t2",[265,9668,9671,9703],{"className":9669},[9670],"vlist-r",[265,9672,9676],{"className":9673,"style":9675},[9674],"vlist","height:0.3303em;",[265,9677,9679,9684],{"style":9678},"top:-2.55em;margin-right:0.05em;",[265,9680],{"className":9681,"style":9683},[9682],"pstrut","height:2.7em;",[265,9685,9691],{"className":9686},[9687,9688,9689,9690],"sizing","reset-size6","size3","mtight",[265,9692,9694,9697,9700],{"className":9693},[9198,9690],[265,9695,9176],{"className":9696},[9198,9199,9690],[265,9698,9248],{"className":9699},[9275,9690],[265,9701,9214],{"className":9702},[9198,9199,9690],[265,9704,9707],{"className":9705},[9706],"vlist-s","​",[265,9709,9711],{"className":9710},[9670],[265,9712,9715],{"className":9713,"style":9714},[9674],"height:0.2083em;",[265,9716],{},[265,9718,9720],{"className":9719},[9198],[265,9721,391],{"className":9722},[9723,9724],"delimsizing","size1",[265,9726,391],{"className":9727},[9328],[265,9729,9176],{"className":9730,"style":9333},[9198,9332],[265,9732,9307],{"className":9733},[9337],[265,9735],{"className":9736,"style":9341},[9270],[265,9738,9214],{"className":9739,"style":9345},[9198,9332],[265,9741,6705],{"className":9742},[9349],[265,9744,9307],{"className":9745},[9337],[265,9747],{"className":9748,"style":9341},[9270],[265,9750,391],{"className":9751},[9328],[265,9753,9755,9758],{"className":9754},[9198],[265,9756,9176],{"className":9757,"style":9333},[9198,9332],[265,9759,9761],{"className":9760},[9661],[265,9762,9764],{"className":9763},[9665],[265,9765,9767],{"className":9766},[9670],[265,9768,9771],{"className":9769,"style":9770},[9674],"height:0.7519em;",[265,9772,9774,9777],{"style":9773},"top:-3.063em;margin-right:0.05em;",[265,9775],{"className":9776,"style":9683},[9682],[265,9778,9780],{"className":9779},[9687,9688,9689,9690],[265,9781,9783],{"className":9782},[9198,9690],[265,9784,9566],{"className":9785},[9198,9690],[265,9787,9307],{"className":9788},[9337],[265,9790],{"className":9791,"style":9341},[9270],[265,9793,9795,9798],{"className":9794},[9198],[265,9796,9214],{"className":9797,"style":9345},[9198,9332],[265,9799,9801],{"className":9800},[9661],[265,9802,9804],{"className":9803},[9665],[265,9805,9807],{"className":9806},[9670],[265,9808,9810],{"className":9809,"style":9770},[9674],[265,9811,9812,9815],{"style":9773},[265,9813],{"className":9814,"style":9683},[9682],[265,9816,9818],{"className":9817},[9687,9688,9689,9690],[265,9819,9821],{"className":9820},[9198,9690],[265,9822,9566],{"className":9823},[9198,9690],[265,9825,6705],{"className":9826},[9349],[265,9828,9830],{"className":9829},[9198],[265,9831,6705],{"className":9832},[9723,9724],[265,9834],{"className":9835,"style":9401},[9270],[265,9837,434],{"className":9838},[9405],[265,9840],{"className":9841,"style":9401},[9270],[265,9843,9845,9849,9896,9899,9902,9905,9908,9940,9943,9946,9949],{"className":9844},[9189],[265,9846],{"className":9847,"style":9848},[9193],"height:1.0019em;vertical-align:-0.25em;",[265,9850,9852,9858],{"className":9851},[9198],[265,9853,9855],{"className":9854},[9198],[265,9856,9657],{"className":9857},[9198,9421],[265,9859,9861],{"className":9860},[9661],[265,9862,9864,9887],{"className":9863},[9665,9666],[265,9865,9867,9884],{"className":9866},[9670],[265,9868,9870],{"className":9869,"style":9675},[9674],[265,9871,9872,9875],{"style":9678},[265,9873],{"className":9874,"style":9683},[9682],[265,9876,9878],{"className":9877},[9687,9688,9689,9690],[265,9879,9881],{"className":9880},[9198,9690],[265,9882,9176],{"className":9883},[9198,9199,9690],[265,9885,9707],{"className":9886},[9706],[265,9888,9890],{"className":9889},[9670],[265,9891,9894],{"className":9892,"style":9893},[9674],"height:0.15em;",[265,9895],{},[265,9897,391],{"className":9898},[9328],[265,9900,9176],{"className":9901,"style":9333},[9198,9332],[265,9903,9307],{"className":9904},[9337],[265,9906],{"className":9907,"style":9341},[9270],[265,9909,9911,9914],{"className":9910},[9198],[265,9912,9176],{"className":9913,"style":9333},[9198,9332],[265,9915,9917],{"className":9916},[9661],[265,9918,9920],{"className":9919},[9665],[265,9921,9923],{"className":9922},[9670],[265,9924,9926],{"className":9925,"style":9770},[9674],[265,9927,9928,9931],{"style":9773},[265,9929],{"className":9930,"style":9683},[9682],[265,9932,9934],{"className":9933},[9687,9688,9689,9690],[265,9935,9937],{"className":9936},[9198,9690],[265,9938,9566],{"className":9939},[9198,9690],[265,9941,6705],{"className":9942},[9349],[265,9944],{"className":9945,"style":9271},[9270],[265,9947,9248],{"className":9948},[9275],[265,9950],{"className":9951,"style":9271},[9270],[265,9953,9955,9958,10004,10007,10010,10013,10016,10048],{"className":9954},[9189],[265,9956],{"className":9957,"style":9848},[9193],[265,9959,9961,9967],{"className":9960},[9198],[265,9962,9964],{"className":9963},[9198],[265,9965,9657],{"className":9966},[9198,9421],[265,9968,9970],{"className":9969},[9661],[265,9971,9973,9996],{"className":9972},[9665,9666],[265,9974,9976,9993],{"className":9975},[9670],[265,9977,9979],{"className":9978,"style":9675},[9674],[265,9980,9981,9984],{"style":9678},[265,9982],{"className":9983,"style":9683},[9682],[265,9985,9987],{"className":9986},[9687,9688,9689,9690],[265,9988,9990],{"className":9989},[9198,9690],[265,9991,9214],{"className":9992},[9198,9199,9690],[265,9994,9707],{"className":9995},[9706],[265,9997,9999],{"className":9998},[9670],[265,10000,10002],{"className":10001,"style":9893},[9674],[265,10003],{},[265,10005,391],{"className":10006},[9328],[265,10008,9214],{"className":10009,"style":9345},[9198,9332],[265,10011,9307],{"className":10012},[9337],[265,10014],{"className":10015,"style":9341},[9270],[265,10017,10019,10022],{"className":10018},[9198],[265,10020,9214],{"className":10021,"style":9345},[9198,9332],[265,10023,10025],{"className":10024},[9661],[265,10026,10028],{"className":10027},[9665],[265,10029,10031],{"className":10030},[9670],[265,10032,10034],{"className":10033,"style":9770},[9674],[265,10035,10036,10039],{"style":9773},[265,10037],{"className":10038,"style":9683},[9682],[265,10040,10042],{"className":10041},[9687,9688,9689,9690],[265,10043,10045],{"className":10044},[9198,9690],[265,10046,9566],{"className":10047},[9198,9690],[265,10049,6705],{"className":10050},[9349],[18,10052,10053,10054,9147],{},"积范畴的复合运算逐分量定义：",[265,10055,10057,10134],{"className":10056},[9157],[265,10058,10060],{"className":10059},[9161],[9163,10061,10062],{"xmlns":9165},[9167,10063,10064,10131],{},[9170,10065,10066,10068,10071,10073,10076,10078,10081,10083,10089,10091,10097,10099,10101,10103,10105,10107,10113,10115,10119,10121,10123,10129],{},[9246,10067,391],{"stretchy":635},[9173,10069,10070],{},"f",[9246,10072,9307],{"separator":6148},[9173,10074,10075],{},"g",[9246,10077,6705],{"stretchy":635},[9246,10079,10080],{},"∘",[9246,10082,391],{"stretchy":635},[9559,10084,10085,10087],{},[9173,10086,10070],{},[9246,10088,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,10090,9307],{"separator":6148},[9559,10092,10093,10095],{},[9173,10094,10075],{},[9246,10096,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,10098,6705],{"stretchy":635},[9246,10100,434],{},[9246,10102,391],{"stretchy":635},[9173,10104,10070],{},[9246,10106,10080],{},[9559,10108,10109,10111],{},[9173,10110,10070],{},[9246,10112,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,10114,9307],{"separator":6148},[10116,10117,10118],"mtext",{}," ",[9173,10120,10075],{},[9246,10122,10080],{},[9559,10124,10125,10127],{},[9173,10126,10075],{},[9246,10128,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,10130,6705],{"stretchy":635},[9178,10132,10133],{"encoding":9180},"(f,g)\\circ(f',g')=(f\\circ f',\\, g\\circ g')",[265,10135,10137,10172,10263,10284,10344],{"className":10136,"ariaHidden":6148},[9185],[265,10138,10140,10143,10146,10150,10153,10156,10160,10163,10166,10169],{"className":10139},[9189],[265,10141],{"className":10142,"style":9324},[9193],[265,10144,391],{"className":10145},[9328],[265,10147,10070],{"className":10148,"style":10149},[9198,9332],"margin-right:0.10764em;",[265,10151,9307],{"className":10152},[9337],[265,10154],{"className":10155,"style":9341},[9270],[265,10157,10075],{"className":10158,"style":10159},[9198,9332],"margin-right:0.03588em;",[265,10161,6705],{"className":10162},[9349],[265,10164],{"className":10165,"style":9271},[9270],[265,10167,10080],{"className":10168},[9275],[265,10170],{"className":10171,"style":9271},[9270],[265,10173,10175,10178,10181,10213,10216,10219,10251,10254,10257,10260],{"className":10174},[9189],[265,10176],{"className":10177,"style":9848},[9193],[265,10179,391],{"className":10180},[9328],[265,10182,10184,10187],{"className":10183},[9198],[265,10185,10070],{"className":10186,"style":10149},[9198,9332],[265,10188,10190],{"className":10189},[9661],[265,10191,10193],{"className":10192},[9665],[265,10194,10196],{"className":10195},[9670],[265,10197,10199],{"className":10198,"style":9770},[9674],[265,10200,10201,10204],{"style":9773},[265,10202],{"className":10203,"style":9683},[9682],[265,10205,10207],{"className":10206},[9687,9688,9689,9690],[265,10208,10210],{"className":10209},[9198,9690],[265,10211,9566],{"className":10212},[9198,9690],[265,10214,9307],{"className":10215},[9337],[265,10217],{"className":10218,"style":9341},[9270],[265,10220,10222,10225],{"className":10221},[9198],[265,10223,10075],{"className":10224,"style":10159},[9198,9332],[265,10226,10228],{"className":10227},[9661],[265,10229,10231],{"className":10230},[9665],[265,10232,10234],{"className":10233},[9670],[265,10235,10237],{"className":10236,"style":9770},[9674],[265,10238,10239,10242],{"style":9773},[265,10240],{"className":10241,"style":9683},[9682],[265,10243,10245],{"className":10244},[9687,9688,9689,9690],[265,10246,10248],{"className":10247},[9198,9690],[265,10249,9566],{"className":10250},[9198,9690],[265,10252,6705],{"className":10253},[9349],[265,10255],{"className":10256,"style":9401},[9270],[265,10258,434],{"className":10259},[9405],[265,10261],{"className":10262,"style":9401},[9270],[265,10264,10266,10269,10272,10275,10278,10281],{"className":10265},[9189],[265,10267],{"className":10268,"style":9324},[9193],[265,10270,391],{"className":10271},[9328],[265,10273,10070],{"className":10274,"style":10149},[9198,9332],[265,10276],{"className":10277,"style":9271},[9270],[265,10279,10080],{"className":10280},[9275],[265,10282],{"className":10283,"style":9271},[9270],[265,10285,10287,10291,10323,10326,10329,10332,10335,10338,10341],{"className":10286},[9189],[265,10288],{"className":10289,"style":10290},[9193],"height:0.9463em;vertical-align:-0.1944em;",[265,10292,10294,10297],{"className":10293},[9198],[265,10295,10070],{"className":10296,"style":10149},[9198,9332],[265,10298,10300],{"className":10299},[9661],[265,10301,10303],{"className":10302},[9665],[265,10304,10306],{"className":10305},[9670],[265,10307,10309],{"className":10308,"style":9770},[9674],[265,10310,10311,10314],{"style":9773},[265,10312],{"className":10313,"style":9683},[9682],[265,10315,10317],{"className":10316},[9687,9688,9689,9690],[265,10318,10320],{"className":10319},[9198,9690],[265,10321,9566],{"className":10322},[9198,9690],[265,10324,9307],{"className":10325},[9337],[265,10327],{"className":10328,"style":9341},[9270],[265,10330],{"className":10331,"style":9341},[9270],[265,10333,10075],{"className":10334,"style":10159},[9198,9332],[265,10336],{"className":10337,"style":9271},[9270],[265,10339,10080],{"className":10340},[9275],[265,10342],{"className":10343,"style":9271},[9270],[265,10345,10347,10350,10382],{"className":10346},[9189],[265,10348],{"className":10349,"style":9848},[9193],[265,10351,10353,10356],{"className":10352},[9198],[265,10354,10075],{"className":10355,"style":10159},[9198,9332],[265,10357,10359],{"className":10358},[9661],[265,10360,10362],{"className":10361},[9665],[265,10363,10365],{"className":10364},[9670],[265,10366,10368],{"className":10367,"style":9770},[9674],[265,10369,10370,10373],{"style":9773},[265,10371],{"className":10372,"style":9683},[9682],[265,10374,10376],{"className":10375},[9687,9688,9689,9690],[265,10377,10379],{"className":10378},[9198,9690],[265,10380,9566],{"className":10381},[9198,9690],[265,10383,6705],{"className":10384},[9349],[8972,10386],{},[18,10388,10389,10390,10418,10419,10509,10510,10563,10564,5905,10705,10841,10842,10872,10873,11009,11010,11130,11131,9432,11269,9147],{},"在范畴 ",[265,10391,10393,10406],{"className":10392},[9157],[265,10394,10396],{"className":10395},[9161],[9163,10397,10398],{"xmlns":9165},[9167,10399,10400,10404],{},[9170,10401,10402],{},[9173,10403,9176],{"mathvariant":9175},[9178,10405,9181],{"encoding":9180},[265,10407,10409],{"className":10408,"ariaHidden":6148},[9185],[265,10410,10412,10415],{"className":10411},[9189],[265,10413],{"className":10414,"style":9194},[9193],[265,10416,9176],{"className":10417},[9198,9199]," 内，给定两个对象 ",[265,10420,10422,10456],{"className":10421},[9157],[265,10423,10425],{"className":10424},[9161],[9163,10426,10427],{"xmlns":9165},[9167,10428,10429,10453],{},[9170,10430,10431,10434,10436,10439,10441,10447,10449,10451],{},[9173,10432,10433],{},"A",[9246,10435,9307],{"separator":6148},[9173,10437,10438],{},"B",[9246,10440,9367],{},[9170,10442,10443,10445],{},[9173,10444,9373],{"mathvariant":9372},[9173,10446,7806],{"mathvariant":9372},[9246,10448,391],{"stretchy":635},[9173,10450,9176],{"mathvariant":9175},[9246,10452,6705],{"stretchy":635},[9178,10454,10455],{"encoding":9180},"A,B\\in\\mathrm{Ob}(\\mathbf{C})",[265,10457,10459,10488],{"className":10458,"ariaHidden":6148},[9185],[265,10460,10462,10466,10469,10472,10475,10479,10482,10485],{"className":10461},[9189],[265,10463],{"className":10464,"style":10465},[9193],"height:0.8778em;vertical-align:-0.1944em;",[265,10467,10433],{"className":10468},[9198,9332],[265,10470,9307],{"className":10471},[9337],[265,10473],{"className":10474,"style":9341},[9270],[265,10476,10438],{"className":10477,"style":10478},[9198,9332],"margin-right:0.05017em;",[265,10480],{"className":10481,"style":9401},[9270],[265,10483,9367],{"className":10484},[9405],[265,10486],{"className":10487,"style":9401},[9270],[265,10489,10491,10494,10500,10503,10506],{"className":10490},[9189],[265,10492],{"className":10493,"style":9324},[9193],[265,10495,10497],{"className":10496},[9198],[265,10498,9422],{"className":10499},[9198,9421],[265,10501,391],{"className":10502},[9328],[265,10504,9176],{"className":10505},[9198,9199],[265,10507,6705],{"className":10508},[9349],"，它们的积 (product) 定义为一个对象 ",[265,10511,10513,10531],{"className":10512},[9157],[265,10514,10516],{"className":10515},[9161],[9163,10517,10518],{"xmlns":9165},[9167,10519,10520,10528],{},[9170,10521,10522,10524,10526],{},[9173,10523,10433],{},[9246,10525,9248],{},[9173,10527,10438],{},[9178,10529,10530],{"encoding":9180},"A\\times B",[265,10532,10534,10553],{"className":10533,"ariaHidden":6148},[9185],[265,10535,10537,10541,10544,10547,10550],{"className":10536},[9189],[265,10538],{"className":10539,"style":10540},[9193],"height:0.7667em;vertical-align:-0.0833em;",[265,10542,10433],{"className":10543},[9198,9332],[265,10545],{"className":10546,"style":9271},[9270],[265,10548,9248],{"className":10549},[9275],[265,10551],{"className":10552,"style":9271},[9270],[265,10554,10556,10560],{"className":10555},[9189],[265,10557],{"className":10558,"style":10559},[9193],"height:0.6833em;",[265,10561,10438],{"className":10562,"style":10478},[9198,9332],"，配备投影态射 ",[265,10565,10567,10599],{"className":10566},[9157],[265,10568,10570],{"className":10569},[9161],[9163,10571,10572],{"xmlns":9165},[9167,10573,10574,10596],{},[9170,10575,10576,10583,10585,10587,10589,10591,10594],{},[9520,10577,10578,10581],{},[9173,10579,10580],{},"π",[9173,10582,10433],{},[9246,10584,499],{},[9173,10586,10433],{},[9246,10588,9248],{},[9173,10590,10438],{},[9246,10592,10593],{},"→",[9173,10595,10433],{},[9178,10597,10598],{"encoding":9180},"\\pi_A:A\\times B\\to A",[265,10600,10602,10660,10678,10696],{"className":10601,"ariaHidden":6148},[9185],[265,10603,10605,10609,10651,10654,10657],{"className":10604},[9189],[265,10606],{"className":10607,"style":10608},[9193],"height:0.5806em;vertical-align:-0.15em;",[265,10610,10612,10615],{"className":10611},[9198],[265,10613,10580],{"className":10614,"style":10159},[9198,9332],[265,10616,10618],{"className":10617},[9661],[265,10619,10621,10643],{"className":10620},[9665,9666],[265,10622,10624,10640],{"className":10623},[9670],[265,10625,10628],{"className":10626,"style":10627},[9674],"height:0.3283em;",[265,10629,10631,10634],{"style":10630},"top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;",[265,10632],{"className":10633,"style":9683},[9682],[265,10635,10637],{"className":10636},[9687,9688,9689,9690],[265,10638,10433],{"className":10639},[9198,9332,9690],[265,10641,9707],{"className":10642},[9706],[265,10644,10646],{"className":10645},[9670],[265,10647,10649],{"className":10648,"style":9893},[9674],[265,10650],{},[265,10652],{"className":10653,"style":9401},[9270],[265,10655,499],{"className":10656},[9405],[265,10658],{"className":10659,"style":9401},[9270],[265,10661,10663,10666,10669,10672,10675],{"className":10662},[9189],[265,10664],{"className":10665,"style":10540},[9193],[265,10667,10433],{"className":10668},[9198,9332],[265,10670],{"className":10671,"style":9271},[9270],[265,10673,9248],{"className":10674},[9275],[265,10676],{"className":10677,"style":9271},[9270],[265,10679,10681,10684,10687,10690,10693],{"className":10680},[9189],[265,10682],{"className":10683,"style":10559},[9193],[265,10685,10438],{"className":10686,"style":10478},[9198,9332],[265,10688],{"className":10689,"style":9401},[9270],[265,10691,10593],{"className":10692},[9405],[265,10694],{"className":10695,"style":9401},[9270],[265,10697,10699,10702],{"className":10698},[9189],[265,10700],{"className":10701,"style":10559},[9193],[265,10703,10433],{"className":10704},[9198,9332],[265,10706,10708,10738],{"className":10707},[9157],[265,10709,10711],{"className":10710},[9161],[9163,10712,10713],{"xmlns":9165},[9167,10714,10715,10735],{},[9170,10716,10717,10723,10725,10727,10729,10731,10733],{},[9520,10718,10719,10721],{},[9173,10720,10580],{},[9173,10722,10438],{},[9246,10724,499],{},[9173,10726,10433],{},[9246,10728,9248],{},[9173,10730,10438],{},[9246,10732,10593],{},[9173,10734,10438],{},[9178,10736,10737],{"encoding":9180},"\\pi_B:A\\times B\\to B",[265,10739,10741,10796,10814,10832],{"className":10740,"ariaHidden":6148},[9185],[265,10742,10744,10747,10787,10790,10793],{"className":10743},[9189],[265,10745],{"className":10746,"style":10608},[9193],[265,10748,10750,10753],{"className":10749},[9198],[265,10751,10580],{"className":10752,"style":10159},[9198,9332],[265,10754,10756],{"className":10755},[9661],[265,10757,10759,10779],{"className":10758},[9665,9666],[265,10760,10762,10776],{"className":10761},[9670],[265,10763,10765],{"className":10764,"style":10627},[9674],[265,10766,10767,10770],{"style":10630},[265,10768],{"className":10769,"style":9683},[9682],[265,10771,10773],{"className":10772},[9687,9688,9689,9690],[265,10774,10438],{"className":10775,"style":10478},[9198,9332,9690],[265,10777,9707],{"className":10778},[9706],[265,10780,10782],{"className":10781},[9670],[265,10783,10785],{"className":10784,"style":9893},[9674],[265,10786],{},[265,10788],{"className":10789,"style":9401},[9270],[265,10791,499],{"className":10792},[9405],[265,10794],{"className":10795,"style":9401},[9270],[265,10797,10799,10802,10805,10808,10811],{"className":10798},[9189],[265,10800],{"className":10801,"style":10540},[9193],[265,10803,10433],{"className":10804},[9198,9332],[265,10806],{"className":10807,"style":9271},[9270],[265,10809,9248],{"className":10810},[9275],[265,10812],{"className":10813,"style":9271},[9270],[265,10815,10817,10820,10823,10826,10829],{"className":10816},[9189],[265,10818],{"className":10819,"style":10559},[9193],[265,10821,10438],{"className":10822,"style":10478},[9198,9332],[265,10824],{"className":10825,"style":9401},[9270],[265,10827,10593],{"className":10828},[9405],[265,10830],{"className":10831,"style":9401},[9270],[265,10833,10835,10838],{"className":10834},[9189],[265,10836],{"className":10837,"style":10559},[9193],[265,10839,10438],{"className":10840,"style":10478},[9198,9332],"，满足如下泛性质：\n对任意对象 ",[265,10843,10845,10859],{"className":10844},[9157],[265,10846,10848],{"className":10847},[9161],[9163,10849,10850],{"xmlns":9165},[9167,10851,10852,10857],{},[9170,10853,10854],{},[9173,10855,10856],{},"X",[9178,10858,10856],{"encoding":9180},[265,10860,10862],{"className":10861,"ariaHidden":6148},[9185],[265,10863,10865,10868],{"className":10864},[9189],[265,10866],{"className":10867,"style":10559},[9193],[265,10869,10856],{"className":10870,"style":10871},[9198,9332],"margin-right:0.07847em;"," 及态射 ",[265,10874,10876,10912],{"className":10875},[9157],[265,10877,10879],{"className":10878},[9161],[9163,10880,10881],{"xmlns":9165},[9167,10882,10883,10909],{},[9170,10884,10885,10887,10889,10891,10893,10895,10897,10899,10901,10903,10905,10907],{},[9173,10886,10070],{},[9246,10888,499],{},[9173,10890,10856],{},[9246,10892,10593],{},[9173,10894,10433],{},[9246,10896,9307],{"separator":6148},[10116,10898,10118],{},[9173,10900,10075],{},[9246,10902,499],{},[9173,10904,10856],{},[9246,10906,10593],{},[9173,10908,10438],{},[9178,10910,10911],{"encoding":9180},"f:X\\to A,\\, g:X\\to B",[265,10913,10915,10934,10952,10982,11000],{"className":10914,"ariaHidden":6148},[9185],[265,10916,10918,10922,10925,10928,10931],{"className":10917},[9189],[265,10919],{"className":10920,"style":10921},[9193],"height:0.8889em;vertical-align:-0.1944em;",[265,10923,10070],{"className":10924,"style":10149},[9198,9332],[265,10926],{"className":10927,"style":9401},[9270],[265,10929,499],{"className":10930},[9405],[265,10932],{"className":10933,"style":9401},[9270],[265,10935,10937,10940,10943,10946,10949],{"className":10936},[9189],[265,10938],{"className":10939,"style":10559},[9193],[265,10941,10856],{"className":10942,"style":10871},[9198,9332],[265,10944],{"className":10945,"style":9401},[9270],[265,10947,10593],{"className":10948},[9405],[265,10950],{"className":10951,"style":9401},[9270],[265,10953,10955,10958,10961,10964,10967,10970,10973,10976,10979],{"className":10954},[9189],[265,10956],{"className":10957,"style":10465},[9193],[265,10959,10433],{"className":10960},[9198,9332],[265,10962,9307],{"className":10963},[9337],[265,10965],{"className":10966,"style":9341},[9270],[265,10968],{"className":10969,"style":9341},[9270],[265,10971,10075],{"className":10972,"style":10159},[9198,9332],[265,10974],{"className":10975,"style":9401},[9270],[265,10977,499],{"className":10978},[9405],[265,10980],{"className":10981,"style":9401},[9270],[265,10983,10985,10988,10991,10994,10997],{"className":10984},[9189],[265,10986],{"className":10987,"style":10559},[9193],[265,10989,10856],{"className":10990,"style":10871},[9198,9332],[265,10992],{"className":10993,"style":9401},[9270],[265,10995,10593],{"className":10996},[9405],[265,10998],{"className":10999,"style":9401},[9270],[265,11001,11003,11006],{"className":11002},[9189],[265,11004],{"className":11005,"style":10559},[9193],[265,11007,10438],{"className":11008,"style":10478},[9198,9332],"，存在唯一态射 ",[265,11011,11013,11049],{"className":11012},[9157],[265,11014,11016],{"className":11015},[9161],[9163,11017,11018],{"xmlns":9165},[9167,11019,11020,11046],{},[9170,11021,11022,11025,11027,11029,11031,11034,11036,11038,11040,11042,11044],{},[9246,11023,11024],{"stretchy":635},"⟨",[9173,11026,10070],{},[9246,11028,9307],{"separator":6148},[9173,11030,10075],{},[9246,11032,11033],{"stretchy":635},"⟩",[9246,11035,499],{},[9173,11037,10856],{},[9246,11039,10593],{},[9173,11041,10433],{},[9246,11043,9248],{},[9173,11045,10438],{},[9178,11047,11048],{"encoding":9180},"\\langle f,g\\rangle:X\\to A\\times B",[265,11050,11052,11085,11103,11121],{"className":11051,"ariaHidden":6148},[9185],[265,11053,11055,11058,11061,11064,11067,11070,11073,11076,11079,11082],{"className":11054},[9189],[265,11056],{"className":11057,"style":9324},[9193],[265,11059,11024],{"className":11060},[9328],[265,11062,10070],{"className":11063,"style":10149},[9198,9332],[265,11065,9307],{"className":11066},[9337],[265,11068],{"className":11069,"style":9341},[9270],[265,11071,10075],{"className":11072,"style":10159},[9198,9332],[265,11074,11033],{"className":11075},[9349],[265,11077],{"className":11078,"style":9401},[9270],[265,11080,499],{"className":11081},[9405],[265,11083],{"className":11084,"style":9401},[9270],[265,11086,11088,11091,11094,11097,11100],{"className":11087},[9189],[265,11089],{"className":11090,"style":10559},[9193],[265,11092,10856],{"className":11093,"style":10871},[9198,9332],[265,11095],{"className":11096,"style":9401},[9270],[265,11098,10593],{"className":11099},[9405],[265,11101],{"className":11102,"style":9401},[9270],[265,11104,11106,11109,11112,11115,11118],{"className":11105},[9189],[265,11107],{"className":11108,"style":10540},[9193],[265,11110,10433],{"className":11111},[9198,9332],[265,11113],{"className":11114,"style":9271},[9270],[265,11116,9248],{"className":11117},[9275],[265,11119],{"className":11120,"style":9271},[9270],[265,11122,11124,11127],{"className":11123},[9189],[265,11125],{"className":11126,"style":10559},[9193],[265,11128,10438],{"className":11129,"style":10478},[9198,9332]," 使得 ",[265,11132,11134,11168],{"className":11133},[9157],[265,11135,11137],{"className":11136},[9161],[9163,11138,11139],{"xmlns":9165},[9167,11140,11141,11165],{},[9170,11142,11143,11149,11151,11153,11155,11157,11159,11161,11163],{},[9520,11144,11145,11147],{},[9173,11146,10580],{},[9173,11148,10433],{},[9246,11150,10080],{},[9246,11152,11024],{"stretchy":635},[9173,11154,10070],{},[9246,11156,9307],{"separator":6148},[9173,11158,10075],{},[9246,11160,11033],{"stretchy":635},[9246,11162,434],{},[9173,11164,10070],{},[9178,11166,11167],{"encoding":9180},"\\pi_A\\circ\\langle f,g\\rangle=f",[265,11169,11171,11227,11260],{"className":11170,"ariaHidden":6148},[9185],[265,11172,11174,11178,11218,11221,11224],{"className":11173},[9189],[265,11175],{"className":11176,"style":11177},[9193],"height:0.5945em;vertical-align:-0.15em;",[265,11179,11181,11184],{"className":11180},[9198],[265,11182,10580],{"className":11183,"style":10159},[9198,9332],[265,11185,11187],{"className":11186},[9661],[265,11188,11190,11210],{"className":11189},[9665,9666],[265,11191,11193,11207],{"className":11192},[9670],[265,11194,11196],{"className":11195,"style":10627},[9674],[265,11197,11198,11201],{"style":10630},[265,11199],{"className":11200,"style":9683},[9682],[265,11202,11204],{"className":11203},[9687,9688,9689,9690],[265,11205,10433],{"className":11206},[9198,9332,9690],[265,11208,9707],{"className":11209},[9706],[265,11211,11213],{"className":11212},[9670],[265,11214,11216],{"className":11215,"style":9893},[9674],[265,11217],{},[265,11219],{"className":11220,"style":9271},[9270],[265,11222,10080],{"className":11223},[9275],[265,11225],{"className":11226,"style":9271},[9270],[265,11228,11230,11233,11236,11239,11242,11245,11248,11251,11254,11257],{"className":11229},[9189],[265,11231],{"className":11232,"style":9324},[9193],[265,11234,11024],{"className":11235},[9328],[265,11237,10070],{"className":11238,"style":10149},[9198,9332],[265,11240,9307],{"className":11241},[9337],[265,11243],{"className":11244,"style":9341},[9270],[265,11246,10075],{"className":11247,"style":10159},[9198,9332],[265,11249,11033],{"className":11250},[9349],[265,11252],{"className":11253,"style":9401},[9270],[265,11255,434],{"className":11256},[9405],[265,11258],{"className":11259,"style":9401},[9270],[265,11261,11263,11266],{"className":11262},[9189],[265,11264],{"className":11265,"style":10921},[9193],[265,11267,10070],{"className":11268,"style":10149},[9198,9332],[265,11270,11272,11306],{"className":11271},[9157],[265,11273,11275],{"className":11274},[9161],[9163,11276,11277],{"xmlns":9165},[9167,11278,11279,11303],{},[9170,11280,11281,11287,11289,11291,11293,11295,11297,11299,11301],{},[9520,11282,11283,11285],{},[9173,11284,10580],{},[9173,11286,10438],{},[9246,11288,10080],{},[9246,11290,11024],{"stretchy":635},[9173,11292,10070],{},[9246,11294,9307],{"separator":6148},[9173,11296,10075],{},[9246,11298,11033],{"stretchy":635},[9246,11300,434],{},[9173,11302,10075],{},[9178,11304,11305],{"encoding":9180},"\\pi_B\\circ\\langle f,g\\rangle=g",[265,11307,11309,11364,11397],{"className":11308,"ariaHidden":6148},[9185],[265,11310,11312,11315,11355,11358,11361],{"className":11311},[9189],[265,11313],{"className":11314,"style":11177},[9193],[265,11316,11318,11321],{"className":11317},[9198],[265,11319,10580],{"className":11320,"style":10159},[9198,9332],[265,11322,11324],{"className":11323},[9661],[265,11325,11327,11347],{"className":11326},[9665,9666],[265,11328,11330,11344],{"className":11329},[9670],[265,11331,11333],{"className":11332,"style":10627},[9674],[265,11334,11335,11338],{"style":10630},[265,11336],{"className":11337,"style":9683},[9682],[265,11339,11341],{"className":11340},[9687,9688,9689,9690],[265,11342,10438],{"className":11343,"style":10478},[9198,9332,9690],[265,11345,9707],{"className":11346},[9706],[265,11348,11350],{"className":11349},[9670],[265,11351,11353],{"className":11352,"style":9893},[9674],[265,11354],{},[265,11356],{"className":11357,"style":9271},[9270],[265,11359,10080],{"className":11360},[9275],[265,11362],{"className":11363,"style":9271},[9270],[265,11365,11367,11370,11373,11376,11379,11382,11385,11388,11391,11394],{"className":11366},[9189],[265,11368],{"className":11369,"style":9324},[9193],[265,11371,11024],{"className":11372},[9328],[265,11374,10070],{"className":11375,"style":10149},[9198,9332],[265,11377,9307],{"className":11378},[9337],[265,11380],{"className":11381,"style":9341},[9270],[265,11383,10075],{"className":11384,"style":10159},[9198,9332],[265,11386,11033],{"className":11387},[9349],[265,11389],{"className":11390,"style":9401},[9270],[265,11392,434],{"className":11393},[9405],[265,11395],{"className":11396,"style":9401},[9270],[265,11398,11400,11404],{"className":11399},[9189],[265,11401],{"className":11402,"style":11403},[9193],"height:0.625em;vertical-align:-0.1944em;",[265,11405,10075],{"className":11406,"style":10159},[9198,9332],[8972,11408],{},[18,11410,11411,11412,11464,11465,10841,11729,10872,11759,11009,11894,11130,12014,9432,12151,9147],{},"相对地，余积 (coproduct) 定义为对象 ",[265,11413,11415,11434],{"className":11414},[9157],[265,11416,11418],{"className":11417},[9161],[9163,11419,11420],{"xmlns":9165},[9167,11421,11422,11431],{},[9170,11423,11424,11426,11429],{},[9173,11425,10433],{},[9246,11427,11428],{},"⊔",[9173,11430,10438],{},[9178,11432,11433],{"encoding":9180},"A\\sqcup B",[265,11435,11437,11455],{"className":11436,"ariaHidden":6148},[9185],[265,11438,11440,11443,11446,11449,11452],{"className":11439},[9189],[265,11441],{"className":11442,"style":10559},[9193],[265,11444,10433],{"className":11445},[9198,9332],[265,11447],{"className":11448,"style":9271},[9270],[265,11450,11428],{"className":11451},[9275],[265,11453],{"className":11454,"style":9271},[9270],[265,11456,11458,11461],{"className":11457},[9189],[265,11459],{"className":11460,"style":10559},[9193],[265,11462,10438],{"className":11463,"style":10478},[9198,9332],"，配备单射 ",[265,11466,11468,11521],{"className":11467},[9157],[265,11469,11471],{"className":11470},[9161],[9163,11472,11473],{"xmlns":9165},[9167,11474,11475,11518],{},[9170,11476,11477,11484,11486,11488,11490,11492,11494,11496,11498,11500,11506,11508,11510,11512,11514,11516],{},[9520,11478,11479,11482],{},[9173,11480,11481],{},"i",[9173,11483,10433],{},[9246,11485,499],{},[9173,11487,10433],{},[9246,11489,10593],{},[9173,11491,10433],{},[9246,11493,11428],{},[9173,11495,10438],{},[9246,11497,9307],{"separator":6148},[10116,11499,10118],{},[9520,11501,11502,11504],{},[9173,11503,11481],{},[9173,11505,10438],{},[9246,11507,499],{},[9173,11509,10438],{},[9246,11511,10593],{},[9173,11513,10433],{},[9246,11515,11428],{},[9173,11517,10438],{},[9178,11519,11520],{"encoding":9180},"i_A:A\\to A\\sqcup B,\\, i_B:B\\to A\\sqcup B",[265,11522,11524,11581,11599,11617,11684,11702,11720],{"className":11523,"ariaHidden":6148},[9185],[265,11525,11527,11531,11572,11575,11578],{"className":11526},[9189],[265,11528],{"className":11529,"style":11530},[9193],"height:0.8095em;vertical-align:-0.15em;",[265,11532,11534,11537],{"className":11533},[9198],[265,11535,11481],{"className":11536},[9198,9332],[265,11538,11540],{"className":11539},[9661],[265,11541,11543,11564],{"className":11542},[9665,9666],[265,11544,11546,11561],{"className":11545},[9670],[265,11547,11549],{"className":11548,"style":10627},[9674],[265,11550,11552,11555],{"style":11551},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[265,11553],{"className":11554,"style":9683},[9682],[265,11556,11558],{"className":11557},[9687,9688,9689,9690],[265,11559,10433],{"className":11560},[9198,9332,9690],[265,11562,9707],{"className":11563},[9706],[265,11565,11567],{"className":11566},[9670],[265,11568,11570],{"className":11569,"style":9893},[9674],[265,11571],{},[265,11573],{"className":11574,"style":9401},[9270],[265,11576,499],{"className":11577},[9405],[265,11579],{"className":11580,"style":9401},[9270],[265,11582,11584,11587,11590,11593,11596],{"className":11583},[9189],[265,11585],{"className":11586,"style":10559},[9193],[265,11588,10433],{"className":11589},[9198,9332],[265,11591],{"className":11592,"style":9401},[9270],[265,11594,10593],{"className":11595},[9405],[265,11597],{"className":11598,"style":9401},[9270],[265,11600,11602,11605,11608,11611,11614],{"className":11601},[9189],[265,11603],{"className":11604,"style":10559},[9193],[265,11606,10433],{"className":11607},[9198,9332],[265,11609],{"className":11610,"style":9271},[9270],[265,11612,11428],{"className":11613},[9275],[265,11615],{"className":11616,"style":9271},[9270],[265,11618,11620,11623,11626,11629,11632,11635,11675,11678,11681],{"className":11619},[9189],[265,11621],{"className":11622,"style":10465},[9193],[265,11624,10438],{"className":11625,"style":10478},[9198,9332],[265,11627,9307],{"className":11628},[9337],[265,11630],{"className":11631,"style":9341},[9270],[265,11633],{"className":11634,"style":9341},[9270],[265,11636,11638,11641],{"className":11637},[9198],[265,11639,11481],{"className":11640},[9198,9332],[265,11642,11644],{"className":11643},[9661],[265,11645,11647,11667],{"className":11646},[9665,9666],[265,11648,11650,11664],{"className":11649},[9670],[265,11651,11653],{"className":11652,"style":10627},[9674],[265,11654,11655,11658],{"style":11551},[265,11656],{"className":11657,"style":9683},[9682],[265,11659,11661],{"className":11660},[9687,9688,9689,9690],[265,11662,10438],{"className":11663,"style":10478},[9198,9332,9690],[265,11665,9707],{"className":11666},[9706],[265,11668,11670],{"className":11669},[9670],[265,11671,11673],{"className":11672,"style":9893},[9674],[265,11674],{},[265,11676],{"className":11677,"style":9401},[9270],[265,11679,499],{"className":11680},[9405],[265,11682],{"className":11683,"style":9401},[9270],[265,11685,11687,11690,11693,11696,11699],{"className":11686},[9189],[265,11688],{"className":11689,"style":10559},[9193],[265,11691,10438],{"className":11692,"style":10478},[9198,9332],[265,11694],{"className":11695,"style":9401},[9270],[265,11697,10593],{"className":11698},[9405],[265,11700],{"className":11701,"style":9401},[9270],[265,11703,11705,11708,11711,11714,11717],{"className":11704},[9189],[265,11706],{"className":11707,"style":10559},[9193],[265,11709,10433],{"className":11710},[9198,9332],[265,11712],{"className":11713,"style":9271},[9270],[265,11715,11428],{"className":11716},[9275],[265,11718],{"className":11719,"style":9271},[9270],[265,11721,11723,11726],{"className":11722},[9189],[265,11724],{"className":11725,"style":10559},[9193],[265,11727,10438],{"className":11728,"style":10478},[9198,9332],[265,11730,11732,11746],{"className":11731},[9157],[265,11733,11735],{"className":11734},[9161],[9163,11736,11737],{"xmlns":9165},[9167,11738,11739,11744],{},[9170,11740,11741],{},[9173,11742,11743],{},"Y",[9178,11745,11743],{"encoding":9180},[265,11747,11749],{"className":11748,"ariaHidden":6148},[9185],[265,11750,11752,11755],{"className":11751},[9189],[265,11753],{"className":11754,"style":10559},[9193],[265,11756,11743],{"className":11757,"style":11758},[9198,9332],"margin-right:0.22222em;",[265,11760,11762,11798],{"className":11761},[9157],[265,11763,11765],{"className":11764},[9161],[9163,11766,11767],{"xmlns":9165},[9167,11768,11769,11795],{},[9170,11770,11771,11773,11775,11777,11779,11781,11783,11785,11787,11789,11791,11793],{},[9173,11772,10070],{},[9246,11774,499],{},[9173,11776,10433],{},[9246,11778,10593],{},[9173,11780,11743],{},[9246,11782,9307],{"separator":6148},[10116,11784,10118],{},[9173,11786,10075],{},[9246,11788,499],{},[9173,11790,10438],{},[9246,11792,10593],{},[9173,11794,11743],{},[9178,11796,11797],{"encoding":9180},"f:A\\to Y,\\, g:B\\to Y",[265,11799,11801,11819,11837,11867,11885],{"className":11800,"ariaHidden":6148},[9185],[265,11802,11804,11807,11810,11813,11816],{"className":11803},[9189],[265,11805],{"className":11806,"style":10921},[9193],[265,11808,10070],{"className":11809,"style":10149},[9198,9332],[265,11811],{"className":11812,"style":9401},[9270],[265,11814,499],{"className":11815},[9405],[265,11817],{"className":11818,"style":9401},[9270],[265,11820,11822,11825,11828,11831,11834],{"className":11821},[9189],[265,11823],{"className":11824,"style":10559},[9193],[265,11826,10433],{"className":11827},[9198,9332],[265,11829],{"className":11830,"style":9401},[9270],[265,11832,10593],{"className":11833},[9405],[265,11835],{"className":11836,"style":9401},[9270],[265,11838,11840,11843,11846,11849,11852,11855,11858,11861,11864],{"className":11839},[9189],[265,11841],{"className":11842,"style":10465},[9193],[265,11844,11743],{"className":11845,"style":11758},[9198,9332],[265,11847,9307],{"className":11848},[9337],[265,11850],{"className":11851,"style":9341},[9270],[265,11853],{"className":11854,"style":9341},[9270],[265,11856,10075],{"className":11857,"style":10159},[9198,9332],[265,11859],{"className":11860,"style":9401},[9270],[265,11862,499],{"className":11863},[9405],[265,11865],{"className":11866,"style":9401},[9270],[265,11868,11870,11873,11876,11879,11882],{"className":11869},[9189],[265,11871],{"className":11872,"style":10559},[9193],[265,11874,10438],{"className":11875,"style":10478},[9198,9332],[265,11877],{"className":11878,"style":9401},[9270],[265,11880,10593],{"className":11881},[9405],[265,11883],{"className":11884,"style":9401},[9270],[265,11886,11888,11891],{"className":11887},[9189],[265,11889],{"className":11890,"style":10559},[9193],[265,11892,11743],{"className":11893,"style":11758},[9198,9332],[265,11895,11897,11933],{"className":11896},[9157],[265,11898,11900],{"className":11899},[9161],[9163,11901,11902],{"xmlns":9165},[9167,11903,11904,11930],{},[9170,11905,11906,11909,11911,11913,11915,11918,11920,11922,11924,11926,11928],{},[9246,11907,11908],{"stretchy":635},"[",[9173,11910,10070],{},[9246,11912,9307],{"separator":6148},[9173,11914,10075],{},[9246,11916,11917],{"stretchy":635},"]",[9246,11919,499],{},[9173,11921,10433],{},[9246,11923,11428],{},[9173,11925,10438],{},[9246,11927,10593],{},[9173,11929,11743],{},[9178,11931,11932],{"encoding":9180},"[f,g]:A\\sqcup B\\to Y",[265,11934,11936,11969,11987,12005],{"className":11935,"ariaHidden":6148},[9185],[265,11937,11939,11942,11945,11948,11951,11954,11957,11960,11963,11966],{"className":11938},[9189],[265,11940],{"className":11941,"style":9324},[9193],[265,11943,11908],{"className":11944},[9328],[265,11946,10070],{"className":11947,"style":10149},[9198,9332],[265,11949,9307],{"className":11950},[9337],[265,11952],{"className":11953,"style":9341},[9270],[265,11955,10075],{"className":11956,"style":10159},[9198,9332],[265,11958,11917],{"className":11959},[9349],[265,11961],{"className":11962,"style":9401},[9270],[265,11964,499],{"className":11965},[9405],[265,11967],{"className":11968,"style":9401},[9270],[265,11970,11972,11975,11978,11981,11984],{"className":11971},[9189],[265,11973],{"className":11974,"style":10559},[9193],[265,11976,10433],{"className":11977},[9198,9332],[265,11979],{"className":11980,"style":9271},[9270],[265,11982,11428],{"className":11983},[9275],[265,11985],{"className":11986,"style":9271},[9270],[265,11988,11990,11993,11996,11999,12002],{"className":11989},[9189],[265,11991],{"className":11992,"style":10559},[9193],[265,11994,10438],{"className":11995,"style":10478},[9198,9332],[265,11997],{"className":11998,"style":9401},[9270],[265,12000,10593],{"className":12001},[9405],[265,12003],{"className":12004,"style":9401},[9270],[265,12006,12008,12011],{"className":12007},[9189],[265,12009],{"className":12010,"style":10559},[9193],[265,12012,11743],{"className":12013,"style":11758},[9198,9332],[265,12015,12017,12051],{"className":12016},[9157],[265,12018,12020],{"className":12019},[9161],[9163,12021,12022],{"xmlns":9165},[9167,12023,12024,12048],{},[9170,12025,12026,12028,12030,12032,12034,12036,12038,12044,12046],{},[9246,12027,11908],{"stretchy":635},[9173,12029,10070],{},[9246,12031,9307],{"separator":6148},[9173,12033,10075],{},[9246,12035,11917],{"stretchy":635},[9246,12037,10080],{},[9520,12039,12040,12042],{},[9173,12041,11481],{},[9173,12043,10433],{},[9246,12045,434],{},[9173,12047,10070],{},[9178,12049,12050],{"encoding":9180},"[f,g]\\circ i_A=f",[265,12052,12054,12087,12142],{"className":12053,"ariaHidden":6148},[9185],[265,12055,12057,12060,12063,12066,12069,12072,12075,12078,12081,12084],{"className":12056},[9189],[265,12058],{"className":12059,"style":9324},[9193],[265,12061,11908],{"className":12062},[9328],[265,12064,10070],{"className":12065,"style":10149},[9198,9332],[265,12067,9307],{"className":12068},[9337],[265,12070],{"className":12071,"style":9341},[9270],[265,12073,10075],{"className":12074,"style":10159},[9198,9332],[265,12076,11917],{"className":12077},[9349],[265,12079],{"className":12080,"style":9271},[9270],[265,12082,10080],{"className":12083},[9275],[265,12085],{"className":12086,"style":9271},[9270],[265,12088,12090,12093,12133,12136,12139],{"className":12089},[9189],[265,12091],{"className":12092,"style":11530},[9193],[265,12094,12096,12099],{"className":12095},[9198],[265,12097,11481],{"className":12098},[9198,9332],[265,12100,12102],{"className":12101},[9661],[265,12103,12105,12125],{"className":12104},[9665,9666],[265,12106,12108,12122],{"className":12107},[9670],[265,12109,12111],{"className":12110,"style":10627},[9674],[265,12112,12113,12116],{"style":11551},[265,12114],{"className":12115,"style":9683},[9682],[265,12117,12119],{"className":12118},[9687,9688,9689,9690],[265,12120,10433],{"className":12121},[9198,9332,9690],[265,12123,9707],{"className":12124},[9706],[265,12126,12128],{"className":12127},[9670],[265,12129,12131],{"className":12130,"style":9893},[9674],[265,12132],{},[265,12134],{"className":12135,"style":9401},[9270],[265,12137,434],{"className":12138},[9405],[265,12140],{"className":12141,"style":9401},[9270],[265,12143,12145,12148],{"className":12144},[9189],[265,12146],{"className":12147,"style":10921},[9193],[265,12149,10070],{"className":12150,"style":10149},[9198,9332],[265,12152,12154,12188],{"className":12153},[9157],[265,12155,12157],{"className":12156},[9161],[9163,12158,12159],{"xmlns":9165},[9167,12160,12161,12185],{},[9170,12162,12163,12165,12167,12169,12171,12173,12175,12181,12183],{},[9246,12164,11908],{"stretchy":635},[9173,12166,10070],{},[9246,12168,9307],{"separator":6148},[9173,12170,10075],{},[9246,12172,11917],{"stretchy":635},[9246,12174,10080],{},[9520,12176,12177,12179],{},[9173,12178,11481],{},[9173,12180,10438],{},[9246,12182,434],{},[9173,12184,10075],{},[9178,12186,12187],{"encoding":9180},"[f,g]\\circ i_B=g",[265,12189,12191,12224,12279],{"className":12190,"ariaHidden":6148},[9185],[265,12192,12194,12197,12200,12203,12206,12209,12212,12215,12218,12221],{"className":12193},[9189],[265,12195],{"className":12196,"style":9324},[9193],[265,12198,11908],{"className":12199},[9328],[265,12201,10070],{"className":12202,"style":10149},[9198,9332],[265,12204,9307],{"className":12205},[9337],[265,12207],{"className":12208,"style":9341},[9270],[265,12210,10075],{"className":12211,"style":10159},[9198,9332],[265,12213,11917],{"className":12214},[9349],[265,12216],{"className":12217,"style":9271},[9270],[265,12219,10080],{"className":12220},[9275],[265,12222],{"className":12223,"style":9271},[9270],[265,12225,12227,12230,12270,12273,12276],{"className":12226},[9189],[265,12228],{"className":12229,"style":11530},[9193],[265,12231,12233,12236],{"className":12232},[9198],[265,12234,11481],{"className":12235},[9198,9332],[265,12237,12239],{"className":12238},[9661],[265,12240,12242,12262],{"className":12241},[9665,9666],[265,12243,12245,12259],{"className":12244},[9670],[265,12246,12248],{"className":12247,"style":10627},[9674],[265,12249,12250,12253],{"style":11551},[265,12251],{"className":12252,"style":9683},[9682],[265,12254,12256],{"className":12255},[9687,9688,9689,9690],[265,12257,10438],{"className":12258,"style":10478},[9198,9332,9690],[265,12260,9707],{"className":12261},[9706],[265,12263,12265],{"className":12264},[9670],[265,12266,12268],{"className":12267,"style":9893},[9674],[265,12269],{},[265,12271],{"className":12272,"style":9401},[9270],[265,12274,434],{"className":12275},[9405],[265,12277],{"className":12278,"style":9401},[9270],[265,12280,12282,12285],{"className":12281},[9189],[265,12283],{"className":12284,"style":11403},[9193],[265,12286,10075],{"className":12287,"style":10159},[9198,9332],[8972,12289],{},[18,12291,12292,12293,5905,12367,12473,12474,12525,12526,12701,12702,12730,12731,12759,12760,12730,12788,9147],{},"最后，对于两个态射 ",[265,12294,12296,12318],{"className":12295},[9157],[265,12297,12299],{"className":12298},[9161],[9163,12300,12301],{"xmlns":9165},[9167,12302,12303,12315],{},[9170,12304,12305,12307,12309,12311,12313],{},[9173,12306,9532],{},[9246,12308,499],{},[9173,12310,10433],{},[9246,12312,10593],{},[9173,12314,10438],{},[9178,12316,12317],{"encoding":9180},"m:A\\to B",[265,12319,12321,12340,12358],{"className":12320,"ariaHidden":6148},[9185],[265,12322,12324,12328,12331,12334,12337],{"className":12323},[9189],[265,12325],{"className":12326,"style":12327},[9193],"height:0.4306em;",[265,12329,9532],{"className":12330},[9198,9332],[265,12332],{"className":12333,"style":9401},[9270],[265,12335,499],{"className":12336},[9405],[265,12338],{"className":12339,"style":9401},[9270],[265,12341,12343,12346,12349,12352,12355],{"className":12342},[9189],[265,12344],{"className":12345,"style":10559},[9193],[265,12347,10433],{"className":12348},[9198,9332],[265,12350],{"className":12351,"style":9401},[9270],[265,12353,10593],{"className":12354},[9405],[265,12356],{"className":12357,"style":9401},[9270],[265,12359,12361,12364],{"className":12360},[9189],[265,12362],{"className":12363,"style":10559},[9193],[265,12365,10438],{"className":12366,"style":10478},[9198,9332],[265,12368,12370,12396],{"className":12369},[9157],[265,12371,12373],{"className":12372},[9161],[9163,12374,12375],{"xmlns":9165},[9167,12376,12377,12393],{},[9170,12378,12379,12385,12387,12389,12391],{},[9559,12380,12381,12383],{},[9173,12382,9532],{},[9246,12384,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,12386,499],{},[9173,12388,9176],{},[9246,12390,10593],{},[9173,12392,9214],{},[9178,12394,12395],{"encoding":9180},"m':C\\to D",[265,12397,12399,12446,12464],{"className":12398,"ariaHidden":6148},[9185],[265,12400,12402,12405,12437,12440,12443],{"className":12401},[9189],[265,12403],{"className":12404,"style":9770},[9193],[265,12406,12408,12411],{"className":12407},[9198],[265,12409,9532],{"className":12410},[9198,9332],[265,12412,12414],{"className":12413},[9661],[265,12415,12417],{"className":12416},[9665],[265,12418,12420],{"className":12419},[9670],[265,12421,12423],{"className":12422,"style":9770},[9674],[265,12424,12425,12428],{"style":9773},[265,12426],{"className":12427,"style":9683},[9682],[265,12429,12431],{"className":12430},[9687,9688,9689,9690],[265,12432,12434],{"className":12433},[9198,9690],[265,12435,9566],{"className":12436},[9198,9690],[265,12438],{"className":12439,"style":9401},[9270],[265,12441,499],{"className":12442},[9405],[265,12444],{"className":12445,"style":9401},[9270],[265,12447,12449,12452,12455,12458,12461],{"className":12448},[9189],[265,12450],{"className":12451,"style":10559},[9193],[265,12453,9176],{"className":12454,"style":9333},[9198,9332],[265,12456],{"className":12457,"style":9401},[9270],[265,12459,10593],{"className":12460},[9405],[265,12462],{"className":12463,"style":9401},[9270],[265,12465,12467,12470],{"className":12466},[9189],[265,12468],{"className":12469,"style":10559},[9193],[265,12471,9214],{"className":12472,"style":9345},[9198,9332],"，在积范畴 ",[265,12475,12477,12495],{"className":12476},[9157],[265,12478,12480],{"className":12479},[9161],[9163,12481,12482],{"xmlns":9165},[9167,12483,12484,12492],{},[9170,12485,12486,12488,12490],{},[9173,12487,9176],{"mathvariant":9175},[9246,12489,9248],{},[9173,12491,9214],{"mathvariant":9175},[9178,12493,12494],{"encoding":9180},"\\mathbf{C}\\times\\mathbf{D}",[265,12496,12498,12516],{"className":12497,"ariaHidden":6148},[9185],[265,12499,12501,12504,12507,12510,12513],{"className":12500},[9189],[265,12502],{"className":12503,"style":9263},[9193],[265,12505,9176],{"className":12506},[9198,9199],[265,12508],{"className":12509,"style":9271},[9270],[265,12511,9248],{"className":12512},[9275],[265,12514],{"className":12515,"style":9271},[9270],[265,12517,12519,12522],{"className":12518},[9189],[265,12520],{"className":12521,"style":9194},[9193],[265,12523,9214],{"className":12524},[9198,9199]," 中，它们组成的态射为 ",[265,12527,12529,12579],{"className":12528},[9157],[265,12530,12532],{"className":12531},[9161],[9163,12533,12534],{"xmlns":9165},[9167,12535,12536,12576],{},[9170,12537,12538,12540,12542,12544,12550,12552,12554,12556,12558,12560,12562,12564,12566,12568,12570,12572,12574],{},[9246,12539,391],{"stretchy":635},[9173,12541,9532],{},[9246,12543,9307],{"separator":6148},[9559,12545,12546,12548],{},[9173,12547,9532],{},[9246,12549,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9246,12551,6705],{"stretchy":635},[9246,12553,499],{},[9246,12555,391],{"stretchy":635},[9173,12557,10433],{},[9246,12559,9307],{"separator":6148},[9173,12561,9176],{},[9246,12563,6705],{"stretchy":635},[9246,12565,10593],{},[9246,12567,391],{"stretchy":635},[9173,12569,10438],{},[9246,12571,9307],{"separator":6148},[9173,12573,9214],{},[9246,12575,6705],{"stretchy":635},[9178,12577,12578],{"encoding":9180},"(m,m'):(A,C)\\to(B,D)",[265,12580,12582,12644,12677],{"className":12581,"ariaHidden":6148},[9185],[265,12583,12585,12588,12591,12594,12597,12600,12632,12635,12638,12641],{"className":12584},[9189],[265,12586],{"className":12587,"style":9848},[9193],[265,12589,391],{"className":12590},[9328],[265,12592,9532],{"className":12593},[9198,9332],[265,12595,9307],{"className":12596},[9337],[265,12598],{"className":12599,"style":9341},[9270],[265,12601,12603,12606],{"className":12602},[9198],[265,12604,9532],{"className":12605},[9198,9332],[265,12607,12609],{"className":12608},[9661],[265,12610,12612],{"className":12611},[9665],[265,12613,12615],{"className":12614},[9670],[265,12616,12618],{"className":12617,"style":9770},[9674],[265,12619,12620,12623],{"style":9773},[265,12621],{"className":12622,"style":9683},[9682],[265,12624,12626],{"className":12625},[9687,9688,9689,9690],[265,12627,12629],{"className":12628},[9198,9690],[265,12630,9566],{"className":12631},[9198,9690],[265,12633,6705],{"className":12634},[9349],[265,12636],{"className":12637,"style":9401},[9270],[265,12639,499],{"className":12640},[9405],[265,12642],{"className":12643,"style":9401},[9270],[265,12645,12647,12650,12653,12656,12659,12662,12665,12668,12671,12674],{"className":12646},[9189],[265,12648],{"className":12649,"style":9324},[9193],[265,12651,391],{"className":12652},[9328],[265,12654,10433],{"className":12655},[9198,9332],[265,12657,9307],{"className":12658},[9337],[265,12660],{"className":12661,"style":9341},[9270],[265,12663,9176],{"className":12664,"style":9333},[9198,9332],[265,12666,6705],{"className":12667},[9349],[265,12669],{"className":12670,"style":9401},[9270],[265,12672,10593],{"className":12673},[9405],[265,12675],{"className":12676,"style":9401},[9270],[265,12678,12680,12683,12686,12689,12692,12695,12698],{"className":12679},[9189],[265,12681],{"className":12682,"style":9324},[9193],[265,12684,391],{"className":12685},[9328],[265,12687,10438],{"className":12688,"style":10478},[9198,9332],[265,12690,9307],{"className":12691},[9337],[265,12693],{"className":12694,"style":9341},[9270],[265,12696,9214],{"className":12697,"style":9345},[9198,9332],[265,12699,6705],{"className":12700},[9349],"。\n排序规则是逐分量的，即先看 ",[265,12703,12705,12718],{"className":12704},[9157],[265,12706,12708],{"className":12707},[9161],[9163,12709,12710],{"xmlns":9165},[9167,12711,12712,12716],{},[9170,12713,12714],{},[9173,12715,9176],{"mathvariant":9175},[9178,12717,9181],{"encoding":9180},[265,12719,12721],{"className":12720,"ariaHidden":6148},[9185],[265,12722,12724,12727],{"className":12723},[9189],[265,12725],{"className":12726,"style":9194},[9193],[265,12728,9176],{"className":12729},[9198,9199]," 分量 ",[265,12732,12734,12747],{"className":12733},[9157],[265,12735,12737],{"className":12736},[9161],[9163,12738,12739],{"xmlns":9165},[9167,12740,12741,12745],{},[9170,12742,12743],{},[9173,12744,9532],{},[9178,12746,9532],{"encoding":9180},[265,12748,12750],{"className":12749,"ariaHidden":6148},[9185],[265,12751,12753,12756],{"className":12752},[9189],[265,12754],{"className":12755,"style":12327},[9193],[265,12757,9532],{"className":12758},[9198,9332],"，再看 ",[265,12761,12763,12776],{"className":12762},[9157],[265,12764,12766],{"className":12765},[9161],[9163,12767,12768],{"xmlns":9165},[9167,12769,12770,12774],{},[9170,12771,12772],{},[9173,12773,9214],{"mathvariant":9175},[9178,12775,9217],{"encoding":9180},[265,12777,12779],{"className":12778,"ariaHidden":6148},[9185],[265,12780,12782,12785],{"className":12781},[9189],[265,12783],{"className":12784,"style":9194},[9193],[265,12786,9214],{"className":12787},[9198,9199],[265,12789,12791,12809],{"className":12790},[9157],[265,12792,12794],{"className":12793},[9161],[9163,12795,12796],{"xmlns":9165},[9167,12797,12798,12806],{},[9170,12799,12800],{},[9559,12801,12802,12804],{},[9173,12803,9532],{},[9246,12805,9566],{"mathvariant":9372,"lspace":9565,"rspace":9565},[9178,12807,12808],{"encoding":9180},"m'",[265,12810,12812],{"className":12811,"ariaHidden":6148},[9185],[265,12813,12815,12818],{"className":12814},[9189],[265,12816],{"className":12817,"style":9770},[9193],[265,12819,12821,12824],{"className":12820},[9198],[265,12822,9532],{"className":12823},[9198,9332],[265,12825,12827],{"className":12826},[9661],[265,12828,12830],{"className":12829},[9665],[265,12831,12833],{"className":12832},[9670],[265,12834,12836],{"className":12835,"style":9770},[9674],[265,12837,12838,12841],{"style":9773},[265,12839],{"className":12840,"style":9683},[9682],[265,12842,12844],{"className":12843},[9687,9688,9689,9690],[265,12845,12847],{"className":12846},[9198,9690],[265,12848,9566],{"className":12849},[9198,9690],{"title":261,"searchDepth":309,"depth":309,"links":12851},[12852,12853,12854],{"id":9127,"depth":275,"text":9127},{"id":9138,"depth":275,"text":9139},{"id":9150,"depth":275,"text":9150},"2026-01-01","My first fully controlled Nuxt blog",{},"/life/hello-world",{"title":9107,"description":12856},"life/hello-world",[12862,12863],"nuxt","blog","Wg0klQEgaKPfgdE36bQes6yNv70pD1EzaDX6xd5U1Z4",{"id":12866,"title":12867,"body":12868,"date":13911,"description":12874,"extension":260,"meta":13912,"navigation":331,"path":13913,"seo":13914,"stem":13915,"tags":13916,"__hash__":13918},"content/engineering/透传时的类型声明.md","透传时的类型声明",{"type":8,"value":12869,"toc":13908},[12870,12872,12875,12882,12889,12899,12917,13172,13205,13288,13298,13301,13310,13316,13597,13600,13905],[11,12871,12867],{"id":12867},[18,12873,12874],{},"完整导入一个组件的所有属性可借由透传实现",[18,12876,12877],{},[33,12878,12881],{"href":12879,"rel":12880},"https://cn.vuejs.org/guide/components/attrs",[37],"透传 Attributes | Vue.js",[18,12883,12884,12885,12888],{},"也可以控制非",[22,12886,12887],{},"props","属性不透传",[18,12890,12891,12892,6052,12895,12898],{},"对于一个完善的组件（比如",[22,12893,12894],{},"element-plus",[22,12896,12897],{},"prime-vue","）往往具有完备的类型声明，在透传时同样希望完整映射原组件的类型",[18,12900,12901,12902,12905,12906,12909,12910,6052,12913,12916],{},"在",[22,12903,12904],{},"vue.js","中，",[22,12907,12908],{},"defineProps","不支持复杂类型（比如动态类型推导",[22,12911,12912],{},"Record",[22,12914,12915],{},"[K in keyof T]","），如下：",[256,12918,12920],{"className":357,"code":12919,"language":359,"meta":261,"style":261},"// popover-items.ts\nimport type { ElPopover } from 'element-plus'\nimport type { RawProps } from './popover-items-type'\n\nexport const popoverItemsProps = {\n// 新增 props\n// foo: {\n// type: String,\n// default: 'foo',\n// },\n} as const\n\n// 自动继承 ElPopover 所有 props + 合并新增 props\nexport type PopoverItemsProps = RawProps\n\n// 自动继承 ElPopover emits + 合并新增 emits\nexport type PopoverItemsEmits\n  = InstanceType\u003Ctypeof ElPopover>['$emit']\n    & ((event: 'select', idx: number, vnode: any) => void)\n\nexport const popoverItemsEmits = {\n  select: (idx: number, _vNode: any) => !Number.isNaN(idx),\n} as const\n",[22,12921,12922,12927,12940,12954,12958,12971,12976,12981,12986,12991,12996,13006,13010,13015,13029,13033,13038,13047,13069,13110,13114,13127,13164],{"__ignoreMap":261},[265,12923,12924],{"class":267,"line":268},[265,12925,12926],{"class":616},"// popover-items.ts\n",[265,12928,12929,12931,12933,12936,12938],{"class":267,"line":275},[265,12930,447],{"class":446},[265,12932,481],{"class":446},[265,12934,12935],{"class":271}," { ElPopover } ",[265,12937,453],{"class":446},[265,12939,3490],{"class":437},[265,12941,12942,12944,12946,12949,12951],{"class":267,"line":281},[265,12943,447],{"class":446},[265,12945,481],{"class":446},[265,12947,12948],{"class":271}," { RawProps } ",[265,12950,453],{"class":446},[265,12952,12953],{"class":437}," './popover-items-type'\n",[265,12955,12956],{"class":267,"line":309},[265,12957,473],{"emptyLinePlaceholder":331},[265,12959,12960,12962,12964,12967,12969],{"class":267,"line":323},[265,12961,478],{"class":446},[265,12963,8274],{"class":446},[265,12965,12966],{"class":502}," popoverItemsProps",[265,12968,487],{"class":446},[265,12970,490],{"class":271},[265,12972,12973],{"class":267,"line":493},[265,12974,12975],{"class":616},"// 新增 props\n",[265,12977,12978],{"class":267,"line":506},[265,12979,12980],{"class":616},"// foo: {\n",[265,12982,12983],{"class":267,"line":517},[265,12984,12985],{"class":616},"// type: String,\n",[265,12987,12988],{"class":267,"line":527},[265,12989,12990],{"class":616},"// default: 'foo',\n",[265,12992,12993],{"class":267,"line":537},[265,12994,12995],{"class":616},"// },\n",[265,12997,12998,13001,13003],{"class":267,"line":543},[265,12999,13000],{"class":271},"} ",[265,13002,2018],{"class":446},[265,13004,13005],{"class":446}," const\n",[265,13007,13008],{"class":267,"line":548},[265,13009,473],{"emptyLinePlaceholder":331},[265,13011,13012],{"class":267,"line":561},[265,13013,13014],{"class":616},"// 自动继承 ElPopover 所有 props + 合并新增 props\n",[265,13016,13017,13019,13021,13024,13026],{"class":267,"line":571},[265,13018,478],{"class":446},[265,13020,481],{"class":446},[265,13022,13023],{"class":369}," PopoverItemsProps",[265,13025,487],{"class":446},[265,13027,13028],{"class":369}," RawProps\n",[265,13030,13031],{"class":267,"line":581},[265,13032,473],{"emptyLinePlaceholder":331},[265,13034,13035],{"class":267,"line":586},[265,13036,13037],{"class":616},"// 自动继承 ElPopover emits + 合并新增 emits\n",[265,13039,13040,13042,13044],{"class":267,"line":591},[265,13041,478],{"class":446},[265,13043,481],{"class":446},[265,13045,13046],{"class":369}," PopoverItemsEmits\n",[265,13048,13049,13052,13055,13057,13060,13063,13066],{"class":267,"line":608},[265,13050,13051],{"class":446},"  =",[265,13053,13054],{"class":369}," InstanceType",[265,13056,421],{"class":271},[265,13058,13059],{"class":446},"typeof",[265,13061,13062],{"class":271}," ElPopover>[",[265,13064,13065],{"class":437},"'$emit'",[265,13067,13068],{"class":271},"]\n",[265,13070,13071,13074,13076,13078,13080,13083,13085,13088,13090,13093,13095,13098,13100,13102,13104,13106,13108],{"class":267,"line":613},[265,13072,13073],{"class":446},"    &",[265,13075,699],{"class":271},[265,13077,8767],{"class":394},[265,13079,499],{"class":446},[265,13081,13082],{"class":437}," 'select'",[265,13084,1824],{"class":271},[265,13086,13087],{"class":394},"idx",[265,13089,499],{"class":446},[265,13091,13092],{"class":502}," number",[265,13094,1824],{"class":271},[265,13096,13097],{"class":394},"vnode",[265,13099,499],{"class":446},[265,13101,716],{"class":502},[265,13103,719],{"class":271},[265,13105,722],{"class":446},[265,13107,725],{"class":502},[265,13109,638],{"class":271},[265,13111,13112],{"class":267,"line":620},[265,13113,473],{"emptyLinePlaceholder":331},[265,13115,13116,13118,13120,13123,13125],{"class":267,"line":641},[265,13117,478],{"class":446},[265,13119,8274],{"class":446},[265,13121,13122],{"class":502}," popoverItemsEmits",[265,13124,487],{"class":446},[265,13126,490],{"class":271},[265,13128,13129,13132,13134,13136,13138,13140,13142,13145,13147,13149,13151,13153,13155,13158,13161],{"class":267,"line":646},[265,13130,13131],{"class":369},"  select",[265,13133,7799],{"class":271},[265,13135,13087],{"class":394},[265,13137,499],{"class":446},[265,13139,13092],{"class":502},[265,13141,1824],{"class":271},[265,13143,13144],{"class":394},"_vNode",[265,13146,499],{"class":446},[265,13148,716],{"class":502},[265,13150,719],{"class":271},[265,13152,722],{"class":446},[265,13154,1125],{"class":446},[265,13156,13157],{"class":271},"Number.",[265,13159,13160],{"class":369},"isNaN",[265,13162,13163],{"class":271},"(idx),\n",[265,13165,13166,13168,13170],{"class":267,"line":652},[265,13167,13000],{"class":271},[265,13169,2018],{"class":446},[265,13171,13005],{"class":446},[256,13173,13175],{"className":357,"code":13174,"language":359,"meta":261,"style":261},"// popover-items.vue\nconst props = defineProps\u003CPartial\u003CPopoverItemsProps>>()\n",[22,13176,13177,13182],{"__ignoreMap":261},[265,13178,13179],{"class":267,"line":268},[265,13180,13181],{"class":616},"// popover-items.vue\n",[265,13183,13184,13186,13188,13190,13192,13194,13197,13199,13202],{"class":267,"line":275},[265,13185,594],{"class":446},[265,13187,3601],{"class":502},[265,13189,487],{"class":446},[265,13191,3606],{"class":369},[265,13193,421],{"class":271},[265,13195,13196],{"class":369},"Partial",[265,13198,421],{"class":271},[265,13200,13201],{"class":369},"PopoverItemsProps",[265,13203,13204],{"class":271},">>()\n",[256,13206,13208],{"className":357,"code":13207,"language":359,"meta":261,"style":261},"// popover-items-type.d.ts\nimport type { PopoverProps } from 'element-plus'\nimport type { ExtractPropTypes } from 'vue'\nimport type { popoverItemsProps } from './popover-items'\n\nexport type RawProps\n  = PopoverProps\n    & ExtractPropTypes\u003Ctypeof popoverItemsProps>\n",[22,13209,13210,13215,13228,13241,13255,13259,13267,13274],{"__ignoreMap":261},[265,13211,13212],{"class":267,"line":268},[265,13213,13214],{"class":616},"// popover-items-type.d.ts\n",[265,13216,13217,13219,13221,13224,13226],{"class":267,"line":275},[265,13218,447],{"class":446},[265,13220,481],{"class":446},[265,13222,13223],{"class":271}," { PopoverProps } ",[265,13225,453],{"class":446},[265,13227,3490],{"class":437},[265,13229,13230,13232,13234,13237,13239],{"class":267,"line":281},[265,13231,447],{"class":446},[265,13233,481],{"class":446},[265,13235,13236],{"class":271}," { ExtractPropTypes } ",[265,13238,453],{"class":446},[265,13240,3502],{"class":437},[265,13242,13243,13245,13247,13250,13252],{"class":267,"line":309},[265,13244,447],{"class":446},[265,13246,481],{"class":446},[265,13248,13249],{"class":271}," { popoverItemsProps } ",[265,13251,453],{"class":446},[265,13253,13254],{"class":437}," './popover-items'\n",[265,13256,13257],{"class":267,"line":323},[265,13258,473],{"emptyLinePlaceholder":331},[265,13260,13261,13263,13265],{"class":267,"line":493},[265,13262,478],{"class":446},[265,13264,481],{"class":446},[265,13266,13028],{"class":369},[265,13268,13269,13271],{"class":267,"line":506},[265,13270,13051],{"class":446},[265,13272,13273],{"class":369}," PopoverProps\n",[265,13275,13276,13278,13281,13283,13285],{"class":267,"line":517},[265,13277,13073],{"class":446},[265,13279,13280],{"class":369}," ExtractPropTypes",[265,13282,421],{"class":271},[265,13284,13059],{"class":446},[265,13286,13287],{"class":271}," popoverItemsProps>\n",[18,13289,13290,13291,13294,13295,13297],{},"打包时将会提示",[22,13292,13293],{},"[vite:vue] [@vue/compiler-sfc] Unresolvable type: TSTypeQuery","\n尽管此时类型已经完全交由",[22,13296,359],{},"生成",[7631,13299,13300],{"id":13300},"解决方式",[13302,13303,13304,13307],"ol",{},[53,13305,13306],{},"显示定义: 对于一个属性较少、类型较简单的组件完全足够",[53,13308,13309],{},"完整映射：",[18,13311,13312,13313,13315],{},"使用",[22,13314,12894],{},"定义的元组，进行组合",[256,13317,13319],{"className":357,"code":13318,"language":359,"meta":261,"style":261},"import type { PopoverEmits, PopoverProps } from 'element-plus'\n// import type { PropType } from 'vue'\nimport { popoverEmits, popoverProps } from 'element-plus'\n\n// 直接继承 Element Plus 的运行时 props 定义\nexport const popoverItemsProps = {\n  ...popoverProps,\n  // 新增 props\n  // items: {\n  //   type: Array as PropType\u003CArray\u003C{ label: string, value: any }>>,\n  //   default: () => [],\n  // },\n} as const\n\n// 直接继承 Element Plus 的运行时 emits 定义\nexport const popoverItemsEmits = {\n  ...popoverEmits,\n  // 新增 emits\n  select: (idx: number, _vNode: any) => !Number.isNaN(idx),\n} as const\n\n// 类型定义\nexport type PopoverItemsProps = PopoverProps & {\n  items?: Array\u003C{ label: string, value: any }>\n}\n\nexport type PopoverItemsEmits = PopoverEmits & {\n  select: [idx: number, vnode: any]\n}\n",[22,13320,13321,13334,13339,13350,13354,13359,13371,13379,13384,13389,13394,13399,13404,13412,13416,13421,13433,13440,13445,13477,13485,13489,13494,13512,13543,13547,13551,13569,13593],{"__ignoreMap":261},[265,13322,13323,13325,13327,13330,13332],{"class":267,"line":268},[265,13324,447],{"class":446},[265,13326,481],{"class":446},[265,13328,13329],{"class":271}," { PopoverEmits, PopoverProps } ",[265,13331,453],{"class":446},[265,13333,3490],{"class":437},[265,13335,13336],{"class":267,"line":275},[265,13337,13338],{"class":616},"// import type { PropType } from 'vue'\n",[265,13340,13341,13343,13346,13348],{"class":267,"line":281},[265,13342,447],{"class":446},[265,13344,13345],{"class":271}," { popoverEmits, popoverProps } ",[265,13347,453],{"class":446},[265,13349,3490],{"class":437},[265,13351,13352],{"class":267,"line":309},[265,13353,473],{"emptyLinePlaceholder":331},[265,13355,13356],{"class":267,"line":323},[265,13357,13358],{"class":616},"// 直接继承 Element Plus 的运行时 props 定义\n",[265,13360,13361,13363,13365,13367,13369],{"class":267,"line":493},[265,13362,478],{"class":446},[265,13364,8274],{"class":446},[265,13366,12966],{"class":502},[265,13368,487],{"class":446},[265,13370,490],{"class":271},[265,13372,13373,13376],{"class":267,"line":506},[265,13374,13375],{"class":446},"  ...",[265,13377,13378],{"class":271},"popoverProps,\n",[265,13380,13381],{"class":267,"line":517},[265,13382,13383],{"class":616},"  // 新增 props\n",[265,13385,13386],{"class":267,"line":527},[265,13387,13388],{"class":616},"  // items: {\n",[265,13390,13391],{"class":267,"line":537},[265,13392,13393],{"class":616},"  //   type: Array as PropType\u003CArray\u003C{ label: string, value: any }>>,\n",[265,13395,13396],{"class":267,"line":543},[265,13397,13398],{"class":616},"  //   default: () => [],\n",[265,13400,13401],{"class":267,"line":548},[265,13402,13403],{"class":616},"  // },\n",[265,13405,13406,13408,13410],{"class":267,"line":561},[265,13407,13000],{"class":271},[265,13409,2018],{"class":446},[265,13411,13005],{"class":446},[265,13413,13414],{"class":267,"line":571},[265,13415,473],{"emptyLinePlaceholder":331},[265,13417,13418],{"class":267,"line":581},[265,13419,13420],{"class":616},"// 直接继承 Element Plus 的运行时 emits 定义\n",[265,13422,13423,13425,13427,13429,13431],{"class":267,"line":586},[265,13424,478],{"class":446},[265,13426,8274],{"class":446},[265,13428,13122],{"class":502},[265,13430,487],{"class":446},[265,13432,490],{"class":271},[265,13434,13435,13437],{"class":267,"line":591},[265,13436,13375],{"class":446},[265,13438,13439],{"class":271},"popoverEmits,\n",[265,13441,13442],{"class":267,"line":608},[265,13443,13444],{"class":616},"  // 新增 emits\n",[265,13446,13447,13449,13451,13453,13455,13457,13459,13461,13463,13465,13467,13469,13471,13473,13475],{"class":267,"line":613},[265,13448,13131],{"class":369},[265,13450,7799],{"class":271},[265,13452,13087],{"class":394},[265,13454,499],{"class":446},[265,13456,13092],{"class":502},[265,13458,1824],{"class":271},[265,13460,13144],{"class":394},[265,13462,499],{"class":446},[265,13464,716],{"class":502},[265,13466,719],{"class":271},[265,13468,722],{"class":446},[265,13470,1125],{"class":446},[265,13472,13157],{"class":271},[265,13474,13160],{"class":369},[265,13476,13163],{"class":271},[265,13478,13479,13481,13483],{"class":267,"line":620},[265,13480,13000],{"class":271},[265,13482,2018],{"class":446},[265,13484,13005],{"class":446},[265,13486,13487],{"class":267,"line":641},[265,13488,473],{"emptyLinePlaceholder":331},[265,13490,13491],{"class":267,"line":646},[265,13492,13493],{"class":616},"// 类型定义\n",[265,13495,13496,13498,13500,13502,13504,13507,13510],{"class":267,"line":652},[265,13497,478],{"class":446},[265,13499,481],{"class":446},[265,13501,13023],{"class":369},[265,13503,487],{"class":446},[265,13505,13506],{"class":369}," PopoverProps",[265,13508,13509],{"class":446}," &",[265,13511,490],{"class":271},[265,13513,13514,13517,13519,13522,13524,13527,13529,13531,13533,13536,13538,13540],{"class":267,"line":677},[265,13515,13516],{"class":394},"  items",[265,13518,512],{"class":446},[265,13520,13521],{"class":369}," Array",[265,13523,5167],{"class":271},[265,13525,13526],{"class":394},"label",[265,13528,499],{"class":446},[265,13530,3578],{"class":502},[265,13532,1824],{"class":271},[265,13534,13535],{"class":394},"value",[265,13537,499],{"class":446},[265,13539,716],{"class":502},[265,13541,13542],{"class":271}," }>\n",[265,13544,13545],{"class":267,"line":682},[265,13546,540],{"class":271},[265,13548,13549],{"class":267,"line":688},[265,13550,473],{"emptyLinePlaceholder":331},[265,13552,13553,13555,13557,13560,13562,13565,13567],{"class":267,"line":741},[265,13554,478],{"class":446},[265,13556,481],{"class":446},[265,13558,13559],{"class":369}," PopoverItemsEmits",[265,13561,487],{"class":446},[265,13563,13564],{"class":369}," PopoverEmits",[265,13566,13509],{"class":446},[265,13568,490],{"class":271},[265,13570,13571,13573,13575,13577,13579,13581,13583,13585,13587,13589,13591],{"class":267,"line":746},[265,13572,13131],{"class":394},[265,13574,499],{"class":446},[265,13576,1876],{"class":271},[265,13578,13087],{"class":369},[265,13580,1815],{"class":271},[265,13582,6051],{"class":502},[265,13584,1824],{"class":271},[265,13586,13097],{"class":369},[265,13588,1815],{"class":271},[265,13590,666],{"class":502},[265,13592,13068],{"class":271},[265,13594,13595],{"class":267,"line":752},[265,13596,540],{"class":271},[18,13598,13599],{},"对于不存在的属性元组，可以尝试访问实例的属性",[256,13601,13603],{"className":357,"code":13602,"language":359,"meta":261,"style":261},"import type { PopoverProps } from 'element-plus'\nimport type { PropType } from 'vue'\n// popover-items.ts\nimport { ElPopover } from 'element-plus'\n\n// 从组件实例获取 props 定义\nconst elPopoverProps = (ElPopover as any).props ?? {}\nconst elPopoverEmits = (ElPopover as any).emits ?? {}\n\nexport const popoverItemsProps = {\n  ...elPopoverProps,\n  // 新增 props\n  items: {\n    type: Array as PropType\u003CArray\u003C{ label: string, value: any }>>,\n    default: () => [],\n  },\n} as const\n\nexport const popoverItemsEmits = {\n  ...elPopoverEmits,\n  select: (idx: number, _vNode: any) => !Number.isNaN(idx),\n} as const\n\nexport type PopoverItemsProps = PopoverProps & {\n  items?: Array\u003C{ label: string, value: any }>\n}\n",[22,13604,13605,13617,13630,13634,13644,13648,13653,13678,13700,13704,13716,13723,13727,13732,13766,13779,13784,13792,13796,13808,13815,13847,13855,13859,13875,13901],{"__ignoreMap":261},[265,13606,13607,13609,13611,13613,13615],{"class":267,"line":268},[265,13608,447],{"class":446},[265,13610,481],{"class":446},[265,13612,13223],{"class":271},[265,13614,453],{"class":446},[265,13616,3490],{"class":437},[265,13618,13619,13621,13623,13626,13628],{"class":267,"line":275},[265,13620,447],{"class":446},[265,13622,481],{"class":446},[265,13624,13625],{"class":271}," { PropType } ",[265,13627,453],{"class":446},[265,13629,3502],{"class":437},[265,13631,13632],{"class":267,"line":281},[265,13633,12926],{"class":616},[265,13635,13636,13638,13640,13642],{"class":267,"line":309},[265,13637,447],{"class":446},[265,13639,12935],{"class":271},[265,13641,453],{"class":446},[265,13643,3490],{"class":437},[265,13645,13646],{"class":267,"line":323},[265,13647,473],{"emptyLinePlaceholder":331},[265,13649,13650],{"class":267,"line":493},[265,13651,13652],{"class":616},"// 从组件实例获取 props 定义\n",[265,13654,13655,13657,13660,13662,13665,13667,13669,13672,13675],{"class":267,"line":506},[265,13656,594],{"class":446},[265,13658,13659],{"class":502}," elPopoverProps",[265,13661,487],{"class":446},[265,13663,13664],{"class":271}," (ElPopover ",[265,13666,2018],{"class":446},[265,13668,716],{"class":502},[265,13670,13671],{"class":271},").props ",[265,13673,13674],{"class":446},"??",[265,13676,13677],{"class":271}," {}\n",[265,13679,13680,13682,13685,13687,13689,13691,13693,13696,13698],{"class":267,"line":517},[265,13681,594],{"class":446},[265,13683,13684],{"class":502}," elPopoverEmits",[265,13686,487],{"class":446},[265,13688,13664],{"class":271},[265,13690,2018],{"class":446},[265,13692,716],{"class":502},[265,13694,13695],{"class":271},").emits ",[265,13697,13674],{"class":446},[265,13699,13677],{"class":271},[265,13701,13702],{"class":267,"line":527},[265,13703,473],{"emptyLinePlaceholder":331},[265,13705,13706,13708,13710,13712,13714],{"class":267,"line":537},[265,13707,478],{"class":446},[265,13709,8274],{"class":446},[265,13711,12966],{"class":502},[265,13713,487],{"class":446},[265,13715,490],{"class":271},[265,13717,13718,13720],{"class":267,"line":543},[265,13719,13375],{"class":446},[265,13721,13722],{"class":271},"elPopoverProps,\n",[265,13724,13725],{"class":267,"line":548},[265,13726,13383],{"class":616},[265,13728,13729],{"class":267,"line":561},[265,13730,13731],{"class":271},"  items: {\n",[265,13733,13734,13737,13739,13742,13744,13747,13749,13751,13753,13755,13757,13759,13761,13763],{"class":267,"line":571},[265,13735,13736],{"class":271},"    type: Array ",[265,13738,2018],{"class":446},[265,13740,13741],{"class":369}," PropType",[265,13743,421],{"class":271},[265,13745,13746],{"class":369},"Array",[265,13748,5167],{"class":271},[265,13750,13526],{"class":394},[265,13752,499],{"class":446},[265,13754,3578],{"class":502},[265,13756,1824],{"class":271},[265,13758,13535],{"class":394},[265,13760,499],{"class":446},[265,13762,716],{"class":502},[265,13764,13765],{"class":271}," }>>,\n",[265,13767,13768,13771,13774,13776],{"class":267,"line":581},[265,13769,13770],{"class":369},"    default",[265,13772,13773],{"class":271},": () ",[265,13775,722],{"class":446},[265,13777,13778],{"class":271}," [],\n",[265,13780,13781],{"class":267,"line":586},[265,13782,13783],{"class":271},"  },\n",[265,13785,13786,13788,13790],{"class":267,"line":591},[265,13787,13000],{"class":271},[265,13789,2018],{"class":446},[265,13791,13005],{"class":446},[265,13793,13794],{"class":267,"line":608},[265,13795,473],{"emptyLinePlaceholder":331},[265,13797,13798,13800,13802,13804,13806],{"class":267,"line":613},[265,13799,478],{"class":446},[265,13801,8274],{"class":446},[265,13803,13122],{"class":502},[265,13805,487],{"class":446},[265,13807,490],{"class":271},[265,13809,13810,13812],{"class":267,"line":620},[265,13811,13375],{"class":446},[265,13813,13814],{"class":271},"elPopoverEmits,\n",[265,13816,13817,13819,13821,13823,13825,13827,13829,13831,13833,13835,13837,13839,13841,13843,13845],{"class":267,"line":641},[265,13818,13131],{"class":369},[265,13820,7799],{"class":271},[265,13822,13087],{"class":394},[265,13824,499],{"class":446},[265,13826,13092],{"class":502},[265,13828,1824],{"class":271},[265,13830,13144],{"class":394},[265,13832,499],{"class":446},[265,13834,716],{"class":502},[265,13836,719],{"class":271},[265,13838,722],{"class":446},[265,13840,1125],{"class":446},[265,13842,13157],{"class":271},[265,13844,13160],{"class":369},[265,13846,13163],{"class":271},[265,13848,13849,13851,13853],{"class":267,"line":646},[265,13850,13000],{"class":271},[265,13852,2018],{"class":446},[265,13854,13005],{"class":446},[265,13856,13857],{"class":267,"line":652},[265,13858,473],{"emptyLinePlaceholder":331},[265,13860,13861,13863,13865,13867,13869,13871,13873],{"class":267,"line":677},[265,13862,478],{"class":446},[265,13864,481],{"class":446},[265,13866,13023],{"class":369},[265,13868,487],{"class":446},[265,13870,13506],{"class":369},[265,13872,13509],{"class":446},[265,13874,490],{"class":271},[265,13876,13877,13879,13881,13883,13885,13887,13889,13891,13893,13895,13897,13899],{"class":267,"line":682},[265,13878,13516],{"class":394},[265,13880,512],{"class":446},[265,13882,13521],{"class":369},[265,13884,5167],{"class":271},[265,13886,13526],{"class":394},[265,13888,499],{"class":446},[265,13890,3578],{"class":502},[265,13892,1824],{"class":271},[265,13894,13535],{"class":394},[265,13896,499],{"class":446},[265,13898,716],{"class":502},[265,13900,13542],{"class":271},[265,13902,13903],{"class":267,"line":688},[265,13904,540],{"class":271},[305,13906,13907],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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 .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);}",{"title":261,"searchDepth":309,"depth":309,"links":13909},[13910],{"id":13300,"depth":309,"text":13300},"2025-12-20",{},"/engineering/vue-typescript-pass-through-types",{"title":12867,"description":12874},"engineering/透传时的类型声明",[13917,6219],"Vue","DuXa2LcfZ2q2oZUrSNFBxE4tWtUSspd30ko0tA3byog",{"id":13920,"title":13921,"body":13922,"date":15214,"description":15215,"extension":260,"meta":15216,"navigation":331,"path":15217,"seo":15218,"stem":15219,"tags":15220,"__hash__":15221},"content/thinking/CommitLint实践与思考.md","CommitLint实践与思考",{"type":8,"value":13923,"toc":15203},[13924,13928,13931,13942,13953,13958,13973,13979,13991,13997,14010,14016,14022,14027,14034,14041,14044,14047,14218,14221,15189,15200],[11,13925,13927],{"id":13926},"commitlint","CommitLint",[14,13929,13930],{"id":13930},"提交规范工程化实践",[256,13932,13936],{"className":13933,"code":13934,"language":13935,"meta":261,"style":261},"language-sh shiki shiki-themes github-light github-dark","pnpm add -D simple-git-hooks lint-staged @commitlint/cli @commitlint/config-conventional cz-git\n","sh",[22,13937,13938],{"__ignoreMap":261},[265,13939,13940],{"class":267,"line":268},[265,13941,13934],{},[7631,13943,13945,13946,13949,13950],{"id":13944},"为什么使用commitlintcli-commitlintconfig-conventional","为什么使用",[22,13947,13948],{},"@commitlint/cli"," ",[22,13951,13952],{},"@commitlint/config-conventional",[18,13954,13955,13957],{},[22,13956,13948],{}," 用于提交信息校验",[18,13959,13960,13962,13963,13966,13967,13972],{},[22,13961,13952],{},"用于使用",[22,13964,13965],{},"Conventional Commits","即 ",[33,13968,13971],{"href":13969,"rel":13970},"https://www.conventionalcommits.org/zh-hans/v1.0.0/",[37],"约定式提交"," 作为默认校验规则集",[7631,13974,6161,13976,13978],{"id":13975},"与commitlint的不同",[22,13977,13926],{},"的不同",[18,13980,13981,13983,13984,13986,13987,13990],{},[22,13982,13926],{},"是旧的使用方式，官方推荐以这种按需引用的方式安装\n",[22,13985,13926],{},"提供了用于提示的插件，但功能上",[22,13988,13989],{},"cz-git","更全面",[7631,13992,13945,13994],{"id":13993},"为什么使用simple-git-hooks",[22,13995,13996],{},"simple-git-hooks",[18,13998,13999,14000,14003,14004,235,14007,14009],{},"提供轻量的",[22,14001,14002],{},"git hooks","\n相较",[22,14005,14006],{},"husky",[22,14008,13996],{},"无需配置开箱即用",[7631,14011,13945,14013],{"id":14012},"为什么使用lint-staged",[22,14014,14015],{},"lint-staged",[18,14017,14018,14019],{},"在预提交时触发 ",[22,14020,14021],{},"eslint --fix",[7631,14023,13945,14025],{"id":14024},"为什么使用cz-git",[22,14026,13989],{},[18,14028,14029],{},[33,14030,14033],{"href":14031,"rel":14032},"https://cz-git.qbb.sh/zh/",[37],"cz-git | 一款工程性更强，轻量级，高度自定义，标准输出格式的 Commitizen 适配器",[18,14035,14036,14037,14040],{},"提供友好的命令行",[22,14038,14039],{},"git","提交体验，也可以集成 AI 来生成 commit",[14,14042,14043],{"id":14043},"具体配置",[18,14045,14046],{},"package.json",[256,14048,14051],{"className":14049,"code":14050,"language":8895,"meta":261,"style":261},"language-json shiki shiki-themes github-light github-dark","{\n  \"scripts\": {\n    \"build\": \"vite build\",\n    \"dev\": \"vite --port 3333 --open\",\n    \"lint\": \"eslint .\",\n    \"postinstall\": \"npx simple-git-hooks\",\n    \"commit\": \"cz-git\"\n  },\n  \"simple-git-hooks\": {\n    \"pre-commit\": \"pnpm lint-staged\",\n    \"commit-msg\": \"pnpm commitlint --edit\"\n  },\n  \"lint-staged\": {\n    \"*\": \"eslint --fix\"\n  },\n  \"config\": {\n    \"commitizen\": {\n      \"path\": \"node_modules/cz-git\"\n    }\n  }\n}\n",[22,14052,14053,14058,14066,14078,14090,14102,14114,14124,14128,14135,14147,14157,14161,14168,14178,14182,14189,14196,14206,14210,14214],{"__ignoreMap":261},[265,14054,14055],{"class":267,"line":268},[265,14056,14057],{"class":271},"{\n",[265,14059,14060,14063],{"class":267,"line":275},[265,14061,14062],{"class":502},"  \"scripts\"",[265,14064,14065],{"class":271},": {\n",[265,14067,14068,14071,14073,14076],{"class":267,"line":281},[265,14069,14070],{"class":502},"    \"build\"",[265,14072,1815],{"class":271},[265,14074,14075],{"class":437},"\"vite build\"",[265,14077,1980],{"class":271},[265,14079,14080,14083,14085,14088],{"class":267,"line":309},[265,14081,14082],{"class":502},"    \"dev\"",[265,14084,1815],{"class":271},[265,14086,14087],{"class":437},"\"vite --port 3333 --open\"",[265,14089,1980],{"class":271},[265,14091,14092,14095,14097,14100],{"class":267,"line":323},[265,14093,14094],{"class":502},"    \"lint\"",[265,14096,1815],{"class":271},[265,14098,14099],{"class":437},"\"eslint .\"",[265,14101,1980],{"class":271},[265,14103,14104,14107,14109,14112],{"class":267,"line":493},[265,14105,14106],{"class":502},"    \"postinstall\"",[265,14108,1815],{"class":271},[265,14110,14111],{"class":437},"\"npx simple-git-hooks\"",[265,14113,1980],{"class":271},[265,14115,14116,14119,14121],{"class":267,"line":506},[265,14117,14118],{"class":502},"    \"commit\"",[265,14120,1815],{"class":271},[265,14122,14123],{"class":437},"\"cz-git\"\n",[265,14125,14126],{"class":267,"line":517},[265,14127,13783],{"class":271},[265,14129,14130,14133],{"class":267,"line":527},[265,14131,14132],{"class":502},"  \"simple-git-hooks\"",[265,14134,14065],{"class":271},[265,14136,14137,14140,14142,14145],{"class":267,"line":537},[265,14138,14139],{"class":502},"    \"pre-commit\"",[265,14141,1815],{"class":271},[265,14143,14144],{"class":437},"\"pnpm lint-staged\"",[265,14146,1980],{"class":271},[265,14148,14149,14152,14154],{"class":267,"line":543},[265,14150,14151],{"class":502},"    \"commit-msg\"",[265,14153,1815],{"class":271},[265,14155,14156],{"class":437},"\"pnpm commitlint --edit\"\n",[265,14158,14159],{"class":267,"line":548},[265,14160,13783],{"class":271},[265,14162,14163,14166],{"class":267,"line":561},[265,14164,14165],{"class":502},"  \"lint-staged\"",[265,14167,14065],{"class":271},[265,14169,14170,14173,14175],{"class":267,"line":571},[265,14171,14172],{"class":502},"    \"*\"",[265,14174,1815],{"class":271},[265,14176,14177],{"class":437},"\"eslint --fix\"\n",[265,14179,14180],{"class":267,"line":581},[265,14181,13783],{"class":271},[265,14183,14184,14187],{"class":267,"line":586},[265,14185,14186],{"class":502},"  \"config\"",[265,14188,14065],{"class":271},[265,14190,14191,14194],{"class":267,"line":591},[265,14192,14193],{"class":502},"    \"commitizen\"",[265,14195,14065],{"class":271},[265,14197,14198,14201,14203],{"class":267,"line":608},[265,14199,14200],{"class":502},"      \"path\"",[265,14202,1815],{"class":271},[265,14204,14205],{"class":437},"\"node_modules/cz-git\"\n",[265,14207,14208],{"class":267,"line":613},[265,14209,1251],{"class":271},[265,14211,14212],{"class":267,"line":620},[265,14213,1441],{"class":271},[265,14215,14216],{"class":267,"line":641},[265,14217,540],{"class":271},[18,14219,14220],{},"commitlint.config.mjs",[256,14222,14224],{"className":8744,"code":14223,"language":8746,"meta":261,"style":261},"import { defineConfig } from 'cz-git'\n\nexport default defineConfig({\n  rules: {\n    // @see: https://commitlint.js.org/#/reference-rules\n    'type-enum': [2, 'always', ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore', 'perf', 'build', 'ci', 'revert']], // type 类型必须在以下类型范围内\n    'type-case': [2, 'always', 'lower-case'], // type 必须使用小写\n    'type-empty': [2, 'never'], // type 不能为空\n\n    // 'scope-enum': [2, 'always', ['login', 'user', 'api']], // scope 范围必须在以下范围范围内\n    'scope-case': [2, 'always', 'lower-case'], // scope 必须使用小写\n    'scope-empty': [0], // scope 可以为空\n\n    'subject-empty': [2, 'never'], // 描述内容不能为空\n    'subject-full-stop': [2, 'never', ['.', '，', '。', ',', ';', '；']], // 描述内容禁止以标点符号结尾\n\n    'header-max-length': [2, 'always', 100], // 头部最大长度\n  },\n  prompt: {\n    alias: { fd: 'docs: fix typos' },\n    messages: {\n      type: '选择你要提交的类型 :',\n      scope: '选择一个提交范围（可选）:',\n      customScope: '请输入自定义的提交范围 :',\n      subject: '填写简短精炼的变更描述 :\\n',\n      body: '填写更加详细的变更描述（可选）。使用 \"|\" 换行 :\\n',\n      breaking: '列举非兼容性重大的变更（可选）。使用 \"|\" 换行 :\\n',\n      footerPrefixesSelect: '选择关联issue前缀（可选）:',\n      customFooterPrefix: '输入自定义issue前缀 :',\n      footer: '列举关联issue (可选) 例如: #31, #I3244 :\\n',\n      confirmCommit: '是否提交或修改commit ?',\n    },\n    types: [\n      { value: 'feat', name: '1) feat:    ✨ 新功能', emoji: ':sparkles:' },\n      { value: 'fix', name: '2) fix:     🐛 Bug修复', emoji: ':bug:' },\n      { value: 'docs', name: '3) docs:    📝 文档变更', emoji: ':memo:' },\n      { value: 'style', name: '4) style:   💄 不影响逻辑的代码格式调整', emoji: ':lipstick:' },\n      { value: 'refactor', name: '5) refactor: ♻️ 重构（修改代码结构、变量名、函数名）', emoji: ':recycle:' },\n      { value: 'perf', name: '6) perf:    ⚡️ 性能优化', emoji: ':zap:' },\n      { value: 'test', name: '7) test:    ✅ 测试用例', emoji: ':white_check_mark:' },\n      { value: 'build', name: '8) build:   📦️ 修改项目构建系统（修改依赖库、外部接口或者升级 Node 版本）', emoji: ':package:' },\n      { value: 'ci', name: '9) ci:      🎡 持续集成', emoji: ':ferris_wheel:' },\n      { value: 'chore', name: '0) chore:   🔨 非业务性代码的修改（构建过程或辅助工具变更）', emoji: ':hammer:' },\n      { value: 'revert', name: '/) revert:  ⏪️ 回滚', emoji: ':rewind:' },\n    ],\n    useEmoji: true,\n    emojiAlign: 'center',\n    useAI: false,\n    aiNumber: 1,\n    themeColorCode: '',\n    scopes: [],\n    allowCustomScopes: true,\n    allowEmptyScopes: true,\n    customScopesAlign: 'top',\n    customScopesAlias: 'custom',\n    emptyScopesAlias: 'empty',\n    upperCaseSubject: false,\n    markBreakingChangeMode: false,\n    allowBreakingChanges: ['feat', 'fix'],\n    breaklineNumber: 100,\n    breaklineChar: '|',\n    skipQuestions: ['body', 'footer', 'footerPrefix', 'breaking'],\n    issuePrefixes: [{ value: 'closed', name: 'closed:   ISSUES has been processed' }],\n    customIssuePrefixAlign: 'top',\n    emptyIssuePrefixAlias: 'skip',\n    customIssuePrefixAlias: 'custom',\n    allowCustomIssuePrefix: true,\n    allowEmptyIssuePrefix: true,\n    confirmColorize: true,\n    scopeOverrides: undefined,\n    defaultBody: '',\n    defaultIssues: '',\n    defaultScope: '',\n    defaultSubject: '',\n  },\n})\n",[22,14225,14226,14238,14242,14254,14259,14264,14342,14366,14385,14389,14397,14419,14434,14438,14456,14504,14508,14531,14535,14540,14551,14556,14566,14576,14586,14602,14616,14630,14640,14650,14664,14674,14679,14684,14705,14723,14741,14759,14777,14795,14813,14831,14849,14867,14885,14890,14899,14909,14918,14927,14936,14941,14950,14959,14969,14979,14989,14998,15007,15021,15030,15040,15065,15081,15090,15100,15109,15118,15127,15136,15145,15154,15163,15172,15181,15185],{"__ignoreMap":261},[265,14227,14228,14230,14233,14235],{"class":267,"line":268},[265,14229,447],{"class":446},[265,14231,14232],{"class":271}," { defineConfig } ",[265,14234,453],{"class":446},[265,14236,14237],{"class":437}," 'cz-git'\n",[265,14239,14240],{"class":267,"line":275},[265,14241,473],{"emptyLinePlaceholder":331},[265,14243,14244,14246,14249,14252],{"class":267,"line":281},[265,14245,478],{"class":446},[265,14247,14248],{"class":446}," default",[265,14250,14251],{"class":369}," defineConfig",[265,14253,373],{"class":271},[265,14255,14256],{"class":267,"line":309},[265,14257,14258],{"class":271},"  rules: {\n",[265,14260,14261],{"class":267,"line":323},[265,14262,14263],{"class":616},"    // @see: https://commitlint.js.org/#/reference-rules\n",[265,14265,14266,14269,14272,14275,14277,14280,14283,14286,14288,14291,14293,14296,14298,14301,14303,14306,14308,14311,14313,14316,14318,14321,14323,14326,14328,14331,14333,14336,14339],{"class":267,"line":493},[265,14267,14268],{"class":437},"    'type-enum'",[265,14270,14271],{"class":271},": [",[265,14273,14274],{"class":502},"2",[265,14276,1824],{"class":271},[265,14278,14279],{"class":437},"'always'",[265,14281,14282],{"class":271},", [",[265,14284,14285],{"class":437},"'feat'",[265,14287,1824],{"class":271},[265,14289,14290],{"class":437},"'fix'",[265,14292,1824],{"class":271},[265,14294,14295],{"class":437},"'docs'",[265,14297,1824],{"class":271},[265,14299,14300],{"class":437},"'style'",[265,14302,1824],{"class":271},[265,14304,14305],{"class":437},"'refactor'",[265,14307,1824],{"class":271},[265,14309,14310],{"class":437},"'test'",[265,14312,1824],{"class":271},[265,14314,14315],{"class":437},"'chore'",[265,14317,1824],{"class":271},[265,14319,14320],{"class":437},"'perf'",[265,14322,1824],{"class":271},[265,14324,14325],{"class":437},"'build'",[265,14327,1824],{"class":271},[265,14329,14330],{"class":437},"'ci'",[265,14332,1824],{"class":271},[265,14334,14335],{"class":437},"'revert'",[265,14337,14338],{"class":271},"]], ",[265,14340,14341],{"class":616},"// type 类型必须在以下类型范围内\n",[265,14343,14344,14347,14349,14351,14353,14355,14357,14360,14363],{"class":267,"line":506},[265,14345,14346],{"class":437},"    'type-case'",[265,14348,14271],{"class":271},[265,14350,14274],{"class":502},[265,14352,1824],{"class":271},[265,14354,14279],{"class":437},[265,14356,1824],{"class":271},[265,14358,14359],{"class":437},"'lower-case'",[265,14361,14362],{"class":271},"], ",[265,14364,14365],{"class":616},"// type 必须使用小写\n",[265,14367,14368,14371,14373,14375,14377,14380,14382],{"class":267,"line":517},[265,14369,14370],{"class":437},"    'type-empty'",[265,14372,14271],{"class":271},[265,14374,14274],{"class":502},[265,14376,1824],{"class":271},[265,14378,14379],{"class":437},"'never'",[265,14381,14362],{"class":271},[265,14383,14384],{"class":616},"// type 不能为空\n",[265,14386,14387],{"class":267,"line":527},[265,14388,473],{"emptyLinePlaceholder":331},[265,14390,14391,14394],{"class":267,"line":537},[265,14392,14393],{"class":616},"    // 'scope-enum': [2, 'always', ['login', 'user', 'api']],",[265,14395,14396],{"class":616}," // scope 范围必须在以下范围范围内\n",[265,14398,14399,14402,14404,14406,14408,14410,14412,14414,14416],{"class":267,"line":543},[265,14400,14401],{"class":437},"    'scope-case'",[265,14403,14271],{"class":271},[265,14405,14274],{"class":502},[265,14407,1824],{"class":271},[265,14409,14279],{"class":437},[265,14411,1824],{"class":271},[265,14413,14359],{"class":437},[265,14415,14362],{"class":271},[265,14417,14418],{"class":616},"// scope 必须使用小写\n",[265,14420,14421,14424,14426,14429,14431],{"class":267,"line":548},[265,14422,14423],{"class":437},"    'scope-empty'",[265,14425,14271],{"class":271},[265,14427,14428],{"class":502},"0",[265,14430,14362],{"class":271},[265,14432,14433],{"class":616},"// scope 可以为空\n",[265,14435,14436],{"class":267,"line":561},[265,14437,473],{"emptyLinePlaceholder":331},[265,14439,14440,14443,14445,14447,14449,14451,14453],{"class":267,"line":571},[265,14441,14442],{"class":437},"    'subject-empty'",[265,14444,14271],{"class":271},[265,14446,14274],{"class":502},[265,14448,1824],{"class":271},[265,14450,14379],{"class":437},[265,14452,14362],{"class":271},[265,14454,14455],{"class":616},"// 描述内容不能为空\n",[265,14457,14458,14461,14463,14465,14467,14469,14471,14474,14476,14479,14481,14484,14486,14489,14491,14494,14496,14499,14501],{"class":267,"line":581},[265,14459,14460],{"class":437},"    'subject-full-stop'",[265,14462,14271],{"class":271},[265,14464,14274],{"class":502},[265,14466,1824],{"class":271},[265,14468,14379],{"class":437},[265,14470,14282],{"class":271},[265,14472,14473],{"class":437},"'.'",[265,14475,1824],{"class":271},[265,14477,14478],{"class":437},"'，'",[265,14480,1824],{"class":271},[265,14482,14483],{"class":437},"'。'",[265,14485,1824],{"class":271},[265,14487,14488],{"class":437},"','",[265,14490,1824],{"class":271},[265,14492,14493],{"class":437},"';'",[265,14495,1824],{"class":271},[265,14497,14498],{"class":437},"'；'",[265,14500,14338],{"class":271},[265,14502,14503],{"class":616},"// 描述内容禁止以标点符号结尾\n",[265,14505,14506],{"class":267,"line":586},[265,14507,473],{"emptyLinePlaceholder":331},[265,14509,14510,14513,14515,14517,14519,14521,14523,14526,14528],{"class":267,"line":591},[265,14511,14512],{"class":437},"    'header-max-length'",[265,14514,14271],{"class":271},[265,14516,14274],{"class":502},[265,14518,1824],{"class":271},[265,14520,14279],{"class":437},[265,14522,1824],{"class":271},[265,14524,14525],{"class":502},"100",[265,14527,14362],{"class":271},[265,14529,14530],{"class":616},"// 头部最大长度\n",[265,14532,14533],{"class":267,"line":608},[265,14534,13783],{"class":271},[265,14536,14537],{"class":267,"line":613},[265,14538,14539],{"class":271},"  prompt: {\n",[265,14541,14542,14545,14548],{"class":267,"line":620},[265,14543,14544],{"class":271},"    alias: { fd: ",[265,14546,14547],{"class":437},"'docs: fix typos'",[265,14549,14550],{"class":271}," },\n",[265,14552,14553],{"class":267,"line":641},[265,14554,14555],{"class":271},"    messages: {\n",[265,14557,14558,14561,14564],{"class":267,"line":646},[265,14559,14560],{"class":271},"      type: ",[265,14562,14563],{"class":437},"'选择你要提交的类型 :'",[265,14565,1980],{"class":271},[265,14567,14568,14571,14574],{"class":267,"line":652},[265,14569,14570],{"class":271},"      scope: ",[265,14572,14573],{"class":437},"'选择一个提交范围（可选）:'",[265,14575,1980],{"class":271},[265,14577,14578,14581,14584],{"class":267,"line":677},[265,14579,14580],{"class":271},"      customScope: ",[265,14582,14583],{"class":437},"'请输入自定义的提交范围 :'",[265,14585,1980],{"class":271},[265,14587,14588,14591,14594,14597,14600],{"class":267,"line":682},[265,14589,14590],{"class":271},"      subject: ",[265,14592,14593],{"class":437},"'填写简短精炼的变更描述 :",[265,14595,14596],{"class":502},"\\n",[265,14598,14599],{"class":437},"'",[265,14601,1980],{"class":271},[265,14603,14604,14607,14610,14612,14614],{"class":267,"line":688},[265,14605,14606],{"class":271},"      body: ",[265,14608,14609],{"class":437},"'填写更加详细的变更描述（可选）。使用 \"|\" 换行 :",[265,14611,14596],{"class":502},[265,14613,14599],{"class":437},[265,14615,1980],{"class":271},[265,14617,14618,14621,14624,14626,14628],{"class":267,"line":741},[265,14619,14620],{"class":271},"      breaking: ",[265,14622,14623],{"class":437},"'列举非兼容性重大的变更（可选）。使用 \"|\" 换行 :",[265,14625,14596],{"class":502},[265,14627,14599],{"class":437},[265,14629,1980],{"class":271},[265,14631,14632,14635,14638],{"class":267,"line":746},[265,14633,14634],{"class":271},"      footerPrefixesSelect: ",[265,14636,14637],{"class":437},"'选择关联issue前缀（可选）:'",[265,14639,1980],{"class":271},[265,14641,14642,14645,14648],{"class":267,"line":752},[265,14643,14644],{"class":271},"      customFooterPrefix: ",[265,14646,14647],{"class":437},"'输入自定义issue前缀 :'",[265,14649,1980],{"class":271},[265,14651,14652,14655,14658,14660,14662],{"class":267,"line":771},[265,14653,14654],{"class":271},"      footer: ",[265,14656,14657],{"class":437},"'列举关联issue (可选) 例如: #31, #I3244 :",[265,14659,14596],{"class":502},[265,14661,14599],{"class":437},[265,14663,1980],{"class":271},[265,14665,14666,14669,14672],{"class":267,"line":789},[265,14667,14668],{"class":271},"      confirmCommit: ",[265,14670,14671],{"class":437},"'是否提交或修改commit ?'",[265,14673,1980],{"class":271},[265,14675,14676],{"class":267,"line":794},[265,14677,14678],{"class":271},"    },\n",[265,14680,14681],{"class":267,"line":800},[265,14682,14683],{"class":271},"    types: [\n",[265,14685,14686,14689,14691,14694,14697,14700,14703],{"class":267,"line":820},[265,14687,14688],{"class":271},"      { value: ",[265,14690,14285],{"class":437},[265,14692,14693],{"class":271},", name: ",[265,14695,14696],{"class":437},"'1) feat:    ✨ 新功能'",[265,14698,14699],{"class":271},", emoji: ",[265,14701,14702],{"class":437},"':sparkles:'",[265,14704,14550],{"class":271},[265,14706,14707,14709,14711,14713,14716,14718,14721],{"class":267,"line":825},[265,14708,14688],{"class":271},[265,14710,14290],{"class":437},[265,14712,14693],{"class":271},[265,14714,14715],{"class":437},"'2) fix:     🐛 Bug修复'",[265,14717,14699],{"class":271},[265,14719,14720],{"class":437},"':bug:'",[265,14722,14550],{"class":271},[265,14724,14725,14727,14729,14731,14734,14736,14739],{"class":267,"line":840},[265,14726,14688],{"class":271},[265,14728,14295],{"class":437},[265,14730,14693],{"class":271},[265,14732,14733],{"class":437},"'3) docs:    📝 文档变更'",[265,14735,14699],{"class":271},[265,14737,14738],{"class":437},"':memo:'",[265,14740,14550],{"class":271},[265,14742,14743,14745,14747,14749,14752,14754,14757],{"class":267,"line":865},[265,14744,14688],{"class":271},[265,14746,14300],{"class":437},[265,14748,14693],{"class":271},[265,14750,14751],{"class":437},"'4) style:   💄 不影响逻辑的代码格式调整'",[265,14753,14699],{"class":271},[265,14755,14756],{"class":437},"':lipstick:'",[265,14758,14550],{"class":271},[265,14760,14761,14763,14765,14767,14770,14772,14775],{"class":267,"line":871},[265,14762,14688],{"class":271},[265,14764,14305],{"class":437},[265,14766,14693],{"class":271},[265,14768,14769],{"class":437},"'5) refactor: ♻️ 重构（修改代码结构、变量名、函数名）'",[265,14771,14699],{"class":271},[265,14773,14774],{"class":437},"':recycle:'",[265,14776,14550],{"class":271},[265,14778,14779,14781,14783,14785,14788,14790,14793],{"class":267,"line":877},[265,14780,14688],{"class":271},[265,14782,14320],{"class":437},[265,14784,14693],{"class":271},[265,14786,14787],{"class":437},"'6) perf:    ⚡️ 性能优化'",[265,14789,14699],{"class":271},[265,14791,14792],{"class":437},"':zap:'",[265,14794,14550],{"class":271},[265,14796,14797,14799,14801,14803,14806,14808,14811],{"class":267,"line":888},[265,14798,14688],{"class":271},[265,14800,14310],{"class":437},[265,14802,14693],{"class":271},[265,14804,14805],{"class":437},"'7) test:    ✅ 测试用例'",[265,14807,14699],{"class":271},[265,14809,14810],{"class":437},"':white_check_mark:'",[265,14812,14550],{"class":271},[265,14814,14815,14817,14819,14821,14824,14826,14829],{"class":267,"line":893},[265,14816,14688],{"class":271},[265,14818,14325],{"class":437},[265,14820,14693],{"class":271},[265,14822,14823],{"class":437},"'8) build:   📦️ 修改项目构建系统（修改依赖库、外部接口或者升级 Node 版本）'",[265,14825,14699],{"class":271},[265,14827,14828],{"class":437},"':package:'",[265,14830,14550],{"class":271},[265,14832,14833,14835,14837,14839,14842,14844,14847],{"class":267,"line":898},[265,14834,14688],{"class":271},[265,14836,14330],{"class":437},[265,14838,14693],{"class":271},[265,14840,14841],{"class":437},"'9) ci:      🎡 持续集成'",[265,14843,14699],{"class":271},[265,14845,14846],{"class":437},"':ferris_wheel:'",[265,14848,14550],{"class":271},[265,14850,14851,14853,14855,14857,14860,14862,14865],{"class":267,"line":904},[265,14852,14688],{"class":271},[265,14854,14315],{"class":437},[265,14856,14693],{"class":271},[265,14858,14859],{"class":437},"'0) chore:   🔨 非业务性代码的修改（构建过程或辅助工具变更）'",[265,14861,14699],{"class":271},[265,14863,14864],{"class":437},"':hammer:'",[265,14866,14550],{"class":271},[265,14868,14869,14871,14873,14875,14878,14880,14883],{"class":267,"line":923},[265,14870,14688],{"class":271},[265,14872,14335],{"class":437},[265,14874,14693],{"class":271},[265,14876,14877],{"class":437},"'/) revert:  ⏪️ 回滚'",[265,14879,14699],{"class":271},[265,14881,14882],{"class":437},"':rewind:'",[265,14884,14550],{"class":271},[265,14886,14887],{"class":267,"line":928},[265,14888,14889],{"class":271},"    ],\n",[265,14891,14892,14895,14897],{"class":267,"line":934},[265,14893,14894],{"class":271},"    useEmoji: ",[265,14896,6148],{"class":502},[265,14898,1980],{"class":271},[265,14900,14901,14904,14907],{"class":267,"line":952},[265,14902,14903],{"class":271},"    emojiAlign: ",[265,14905,14906],{"class":437},"'center'",[265,14908,1980],{"class":271},[265,14910,14911,14914,14916],{"class":267,"line":957},[265,14912,14913],{"class":271},"    useAI: ",[265,14915,635],{"class":502},[265,14917,1980],{"class":271},[265,14919,14920,14923,14925],{"class":267,"line":963},[265,14921,14922],{"class":271},"    aiNumber: ",[265,14924,1417],{"class":502},[265,14926,1980],{"class":271},[265,14928,14929,14932,14934],{"class":267,"line":981},[265,14930,14931],{"class":271},"    themeColorCode: ",[265,14933,766],{"class":437},[265,14935,1980],{"class":271},[265,14937,14938],{"class":267,"line":986},[265,14939,14940],{"class":271},"    scopes: [],\n",[265,14942,14943,14946,14948],{"class":267,"line":992},[265,14944,14945],{"class":271},"    allowCustomScopes: ",[265,14947,6148],{"class":502},[265,14949,1980],{"class":271},[265,14951,14952,14955,14957],{"class":267,"line":1010},[265,14953,14954],{"class":271},"    allowEmptyScopes: ",[265,14956,6148],{"class":502},[265,14958,1980],{"class":271},[265,14960,14961,14964,14967],{"class":267,"line":1015},[265,14962,14963],{"class":271},"    customScopesAlign: ",[265,14965,14966],{"class":437},"'top'",[265,14968,1980],{"class":271},[265,14970,14971,14974,14977],{"class":267,"line":1021},[265,14972,14973],{"class":271},"    customScopesAlias: ",[265,14975,14976],{"class":437},"'custom'",[265,14978,1980],{"class":271},[265,14980,14981,14984,14987],{"class":267,"line":1035},[265,14982,14983],{"class":271},"    emptyScopesAlias: ",[265,14985,14986],{"class":437},"'empty'",[265,14988,1980],{"class":271},[265,14990,14991,14994,14996],{"class":267,"line":1040},[265,14992,14993],{"class":271},"    upperCaseSubject: ",[265,14995,635],{"class":502},[265,14997,1980],{"class":271},[265,14999,15000,15003,15005],{"class":267,"line":1046},[265,15001,15002],{"class":271},"    markBreakingChangeMode: ",[265,15004,635],{"class":502},[265,15006,1980],{"class":271},[265,15008,15009,15012,15014,15016,15018],{"class":267,"line":1087},[265,15010,15011],{"class":271},"    allowBreakingChanges: [",[265,15013,14285],{"class":437},[265,15015,1824],{"class":271},[265,15017,14290],{"class":437},[265,15019,15020],{"class":271},"],\n",[265,15022,15023,15026,15028],{"class":267,"line":1092},[265,15024,15025],{"class":271},"    breaklineNumber: ",[265,15027,14525],{"class":502},[265,15029,1980],{"class":271},[265,15031,15032,15035,15038],{"class":267,"line":1098},[265,15033,15034],{"class":271},"    breaklineChar: ",[265,15036,15037],{"class":437},"'|'",[265,15039,1980],{"class":271},[265,15041,15042,15045,15048,15050,15053,15055,15058,15060,15063],{"class":267,"line":1119},[265,15043,15044],{"class":271},"    skipQuestions: [",[265,15046,15047],{"class":437},"'body'",[265,15049,1824],{"class":271},[265,15051,15052],{"class":437},"'footer'",[265,15054,1824],{"class":271},[265,15056,15057],{"class":437},"'footerPrefix'",[265,15059,1824],{"class":271},[265,15061,15062],{"class":437},"'breaking'",[265,15064,15020],{"class":271},[265,15066,15067,15070,15073,15075,15078],{"class":267,"line":1137},[265,15068,15069],{"class":271},"    issuePrefixes: [{ value: ",[265,15071,15072],{"class":437},"'closed'",[265,15074,14693],{"class":271},[265,15076,15077],{"class":437},"'closed:   ISSUES has been processed'",[265,15079,15080],{"class":271}," }],\n",[265,15082,15083,15086,15088],{"class":267,"line":1142},[265,15084,15085],{"class":271},"    customIssuePrefixAlign: ",[265,15087,14966],{"class":437},[265,15089,1980],{"class":271},[265,15091,15092,15095,15098],{"class":267,"line":1147},[265,15093,15094],{"class":271},"    emptyIssuePrefixAlias: ",[265,15096,15097],{"class":437},"'skip'",[265,15099,1980],{"class":271},[265,15101,15102,15105,15107],{"class":267,"line":1153},[265,15103,15104],{"class":271},"    customIssuePrefixAlias: ",[265,15106,14976],{"class":437},[265,15108,1980],{"class":271},[265,15110,15111,15114,15116],{"class":267,"line":1173},[265,15112,15113],{"class":271},"    allowCustomIssuePrefix: ",[265,15115,6148],{"class":502},[265,15117,1980],{"class":271},[265,15119,15120,15123,15125],{"class":267,"line":1184},[265,15121,15122],{"class":271},"    allowEmptyIssuePrefix: ",[265,15124,6148],{"class":502},[265,15126,1980],{"class":271},[265,15128,15129,15132,15134],{"class":267,"line":1190},[265,15130,15131],{"class":271},"    confirmColorize: ",[265,15133,6148],{"class":502},[265,15135,1980],{"class":271},[265,15137,15138,15141,15143],{"class":267,"line":1211},[265,15139,15140],{"class":271},"    scopeOverrides: ",[265,15142,6116],{"class":502},[265,15144,1980],{"class":271},[265,15146,15147,15150,15152],{"class":267,"line":1230},[265,15148,15149],{"class":271},"    defaultBody: ",[265,15151,766],{"class":437},[265,15153,1980],{"class":271},[265,15155,15156,15159,15161],{"class":267,"line":1248},[265,15157,15158],{"class":271},"    defaultIssues: ",[265,15160,766],{"class":437},[265,15162,1980],{"class":271},[265,15164,15165,15168,15170],{"class":267,"line":1254},[265,15166,15167],{"class":271},"    defaultScope: ",[265,15169,766],{"class":437},[265,15171,1980],{"class":271},[265,15173,15174,15177,15179],{"class":267,"line":1259},[265,15175,15176],{"class":271},"    defaultSubject: ",[265,15178,766],{"class":437},[265,15180,1980],{"class":271},[265,15182,15183],{"class":267,"line":1265},[265,15184,13783],{"class":271},[265,15186,15187],{"class":267,"line":1277},[265,15188,403],{"class":271},[18,15190,15191,15192,15195,15196,15199],{},"运行 ",[22,15193,15194],{},"pnpm postinstall"," 后，使用 ",[22,15197,15198],{},"pnpm cz"," 即可触发提交交互",[305,15201,15202],{},"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 .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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":261,"searchDepth":309,"depth":309,"links":15204},[15205,15213],{"id":13930,"depth":275,"text":13930,"children":15206},[15207,15209,15210,15211,15212],{"id":13944,"depth":309,"text":15208},"为什么使用@commitlint/cli @commitlint/config-conventional",{"id":13975,"depth":309,"text":13975},{"id":13993,"depth":309,"text":13993},{"id":14012,"depth":309,"text":14012},{"id":14024,"depth":309,"text":14024},{"id":14043,"depth":275,"text":14043},"2025-05-22","完备的Git CommitLint实践以及为什么这么做",{},"/thinking/commitlint-practice",{"title":13921,"description":15215},"thinking/CommitLint实践与思考",[14039],"h2Jv78wChs9Y28XA6gfzXe0Ujm6e3UeMDoXmjFbkGAA",{"id":15223,"title":15224,"body":15225,"date":15321,"description":15322,"extension":260,"meta":15323,"navigation":331,"path":15324,"seo":15325,"stem":15326,"tags":15327,"__hash__":15328},"content/engineering/作用域.md","JavaScript的作用域",{"type":8,"value":15226,"toc":15316},[15227,15236,15239,15244,15266,15268,15275,15278,15300,15303,15306],[11,15228,15230,15231],{"id":15229},"作用域与词法环境","作用域与",[33,15232,15235],{"href":15233,"rel":15234},"https://zh.javascript.info/closure",[37],"词法环境",[7631,15237,15238],{"id":15238},"作用域",[112,15240,15241],{},[18,15242,15243],{},"作用域(Scope)是指程序源代码中定义变量或函数的区域，决定了它们的可被访问的范围",[18,15245,15246,15248,15249,15254,15255,15260,15261,6161,15263,15265],{},[9118,15247,15238],{},"是当前的执行上下文，",[33,15250,15253],{"href":15251,"rel":15252},"https://developer.mozilla.org/zh-CN/docs/Glossary/Value",[37],"值","和表达式在其中“可见”或可被访问。如果一个",[33,15256,15259],{"href":15257,"rel":15258},"https://developer.mozilla.org/zh-CN/docs/Glossary/Variable",[37],"变量","或表达式不在当前的作用域中，那么它是不可用的。作用域也可以堆叠成层次结构，子作用域可以访问父作用域，反过来则不行。\n",[22,15262,691],{},[22,15264,594],{}," 声明的变量属于块级作用域。",[7631,15267,15235],{"id":15235},[18,15269,15270,15271,15274],{},"在 JavaScript 中，每个运行的函数，代码块",[22,15272,15273],{},"{...}","以及整个脚本，都有一个被称为**词法环境（Lexical Environment）**的内部（隐藏）的关联对象。",[18,15276,15277],{},"词法环境对象由两部分组成：",[13302,15279,15280,15289],{},[53,15281,15282,15285,15286,15288],{},[9118,15283,15284],{},"环境记录（Environment Record）","—— 一个存储所有局部变量作为其属性（包括一些其他信息，例如",[22,15287,7421],{},"的值）的对象。",[53,15290,15291,15292,15295,15296,15299],{},"对",[9118,15293,15294],{},"外部词法环境","的引用，与外部代码相关联。\n一个“变量”只是",[9118,15297,15298],{},"环境记录","这个特殊的内部对象的一个属性。“获取或修改变量”意味着“获取或修改词法环境的一个属性”。",[7631,15301,15302],{"id":15302},"作用域链",[18,15304,15305],{},"当需要解析某个变量或函数时，解释器会首先在当前的词法环境中查找，如果没有找到，则会沿着外部环境引用一级级向上查找,直到找到该变量或函数，或者抵达了全局词法环境。这个查找过程就构成了作用域链(Scope Chain)。",[18,15307,15308,15309,15315],{},"因此，",[15310,15311,15314],"mark",{"className":15312},[15313],"hltr-orange","作用域确定了变量和函数的可被访问范围,而词法环境则是存储和解析它们的数据结构","。一个特定的作用域对应了一个词法环境。词法环境通过外部环境引用把内部作用域和外部作用域连接起来，形成了作用域链，从而实现了作用域的工作机制。",{"title":261,"searchDepth":309,"depth":309,"links":15317},[15318,15319,15320],{"id":15238,"depth":309,"text":15238},{"id":15235,"depth":309,"text":15235},{"id":15302,"depth":309,"text":15302},"2024-04-12","记录了我对作用域与词法环境的理解",{},"/engineering/javascript-scope",{"title":15224,"description":15322},"engineering/作用域",[8713],"TNCdknieZ0h79DeUSW3cSo3UeVFA8XtKj4zyb2oY93A",{"id":15330,"title":15331,"body":15332,"date":15590,"description":15591,"extension":260,"meta":15592,"navigation":331,"path":15593,"seo":15594,"stem":15595,"tags":15596,"__hash__":15597},"content/engineering/原型链.md","JavaScript的原型链",{"type":8,"value":15333,"toc":15578},[15334,15337,15340,15353,15356,15379,15386,15398,15405,15408,15422,15425,15437,15440,15461,15464,15470,15473,15476,15481,15488,15572],[11,15335,15331],{"id":15336},"javascript的原型链",[14,15338,15339],{"id":15339},"原型链与继承",[18,15341,15342,15347,15352],{},[33,15343,15346],{"href":15344,"rel":15345},"https://zh.javascript.info/prototype-inheritance",[37],"javascript.info",[33,15348,15351],{"href":15349,"rel":15350},"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain",[37],"MDN","优先参看MDN标准",[7631,15354,15355],{"id":15355},"原型与原型链",[18,15357,15358,15359,15362,15363,15365,15366,15368,15369,235,15372,15375,15376,15378],{},"JavaScript中每个对象都有隐藏属性 ",[22,15360,15361],{},"[[Prototype]]","指向另一个对象或",[22,15364,672],{},"。当访问对象的一个属性时，会先查找自身是否含有该属性，否则查找",[22,15367,15361],{},"对象是否含有，直到",[22,15370,15371],{},"Object.[[Prototype]]",[22,15373,15374],{},"Object","的原型对象指向",[22,15377,672],{},"\n被引用的对象称为原对象的原型，这样自下而上的查找机制构成了原型链\n如果原型对象拥有的属性或方法，会通过这种引用方式被对象继承",[7631,15380,15382,15383],{"id":15381},"关于__proto__","关于",[22,15384,15385],{},"__proto__",[18,15387,15388,6161,15391,15394,15395,15397],{},[22,15389,15390],{},"{ __proto__: ... }",[22,15392,15393],{},"Object.__proto__"," 不同\n前者可以为对象指定它的原型；但后者是浏览器对",[22,15396,15361],{},"属性访问器的实现，本质是该属性的setter和getter",[18,15399,15400,15401,15404],{},"现今该属性可以使用",[22,15402,15403],{},"Object.getPrototypeOf()、Object.setPrototypeOf()、Reflect.getPrototypeOf()、Reflect.setPrototypeOf()","进行访问和修改",[7631,15406,15407],{"id":15407},"继承",[50,15409,15410,15419],{},[53,15411,15412,15413,15415,15416,15418],{},"继承“方法”——JavaScript中没有“方法”，任何函数都可以作为属性定义在对象上，原型对象的方法也可在对象上调用，但",[22,15414,7421],{},"永远指向调用它的对象（即原对象调用方法时",[22,15417,7421],{},"指向原对象而非原型对象）。",[53,15420,15421],{},"继承属性——属性遮蔽：如果对象拥有某个属性，且其原型对象也拥有该属性（指同名属性），这时会采用对象的属性。",[14,15423,15424],{"id":15424},"重用及继承",[18,15426,15427,15428,15431,15432,15436],{},"需要注意的是，并不应该操作构造函数的",[22,15429,15430],{},"prototype","对原生代码进行覆写。这种行为可能常见于面试题或面向面试题的教程（如",[33,15433,15346],{"href":15434,"rel":15435},"https://zh.javascript.info/function-prototype",[37],"）\n同理，使用该方法对程序中已有构造函数进行功能拓展也不合理",[7631,15438,15439],{"id":15439},"构造函数",[18,15441,15442,15447,15448,15450,15451,15453,15454,15456,15457,15460],{},[33,15443,15446],{"href":15444,"rel":15445},"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain#%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0",[37],"该部分可参照MDN","以下解释仅为概念关系的描述\n构造函数的",[22,15449,15430],{},"指向原型对象，在使用",[22,15452,8255],{},"时自动为调用被构造的对象添加",[22,15455,15361],{},"，该属性指向原型对象。而对象的",[22,15458,15459],{},"constructor","指向构造函数",[18,15462,15463],{},"以上引用关系可以描述为",[18,15465,15466],{},[141,15467],{"alt":15468,"src":15469},"构造函数、prototype、实例与原型对象的关系","/img/t-proto.png",[18,15471,15472],{},"使用构造函数的目的在于实现继承，达成重用。通过类也可以实现重用",[7631,15474,15475],{"id":8111},"Class",[18,15477,13312,15478,15480],{},[22,15479,15475],{},"语法糖可以轻松完成原型的继承",[14,15482,15484],{"id":15483},"使用不同的方法来创建对象和改变原型链",[33,15485,15483],{"href":15486,"rel":15487},"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain#%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%B9%E6%B3%95%E6%9D%A5%E5%88%9B%E5%BB%BA%E5%AF%B9%E8%B1%A1%E5%92%8C%E6%94%B9%E5%8F%98%E5%8E%9F%E5%9E%8B%E9%93%BE",[37],[15489,15490,15491,15506],"table",{},[15492,15493,15494],"thead",{},[15495,15496,15497,15500,15503],"tr",{},[15498,15499],"th",{},[15498,15501,15502],{},"优点",[15498,15504,15505],{},"缺点",[15507,15508,15509,15524,15534,15547,15559],"tbody",{},[15495,15510,15511,15518,15521],{},[15512,15513,15514,15515],"td",{},"语法结构",[22,15516,15517],{},"{__proto__: ...}",[15512,15519,15520],{},"高效",[15512,15522,15523],{},"兼容问题（IE10）",[15495,15525,15526,15528,15531],{},[15512,15527,15439],{},[15512,15529,15530],{},"更加高效、标准",[15512,15532,15533],{},"需预先定义构造函数；可能会将不需要的方法添加给对象",[15495,15535,15536,15541,15544],{},[15512,15537,15538],{},[22,15539,15540],{},"Object.create()",[15512,15542,15543],{},"运行运行时优化对象",[15512,15545,15546],{},"兼容问题（IE8）",[15495,15548,15549,15553,15556],{},[15512,15550,15551],{},[22,15552,15475],{},[15512,15554,15555],{},"私有属性、可读、可维护",[15512,15557,15558],{},"私有属性性能问题；兼容问题",[15495,15560,15561,15566,15569],{},[15512,15562,15563],{},[22,15564,15565],{},"Object.setPrototypeOf(obj, anotherObj)",[15512,15567,15568],{},"标准、动态修改",[15512,15570,15571],{},"性能问题、兼容问题（IE8）",[15573,15574],"image-load-button",{"className":15575,"src":15577},[15576],"mt-4","/img/创建对象与修改原型.png",{"title":261,"searchDepth":309,"depth":309,"links":15579},[15580,15585,15589],{"id":15339,"depth":275,"text":15339,"children":15581},[15582,15583,15584],{"id":15355,"depth":309,"text":15355},{"id":15381,"depth":309,"text":15381},{"id":15407,"depth":309,"text":15407},{"id":15424,"depth":275,"text":15424,"children":15586},[15587,15588],{"id":15439,"depth":309,"text":15439},{"id":8111,"depth":309,"text":15475},{"id":15483,"depth":275,"text":15483},"2024-04-10","记录了我对原型链的理解",{},"/engineering/javascript-prototype-chain",{"title":15331,"description":15591},"engineering/原型链",[8713],"dRQ0h9NWu29K9l22D4TI5oLJNGkly2qfK_VX4waF_Ko",1776757929838]