fix(personalization): 修复按需加载工具勾选区脚本侧未解包 Ref 导致的崩溃

ToolsTab 的 isCategoryFullyDeferred/toggleDeferredTool/toggleDeferredCategory
在脚本侧直接访问 form.tool_loading_deferred,而 form 是 Drawer 经
storeToRefs + provide 传入的 Ref,脚本侧不会自动解包,得到 undefined
后调 .includes 即抛 TypeError。统一改为 unref 后读取并保留防御判断。

Co-authored-by: Astrion powered by Kimi-K3 <astrion-agent@users.noreply.github.com>
This commit is contained in:
JOJO 2026-09-10 20:06:50 +08:00
parent f78fd7442c
commit cd23bb36a6

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { inject } from 'vue'; import { inject, unref } from 'vue';
import FancyCheck from '@/components/common/FancyCheck.vue'; import FancyCheck from '@/components/common/FancyCheck.vue';
defineOptions({ name: 'ToolsTab' }); defineOptions({ name: 'ToolsTab' });
@ -18,17 +18,25 @@ const {
toolLoadingRegistry toolLoadingRegistry
} = ctx; } = ctx;
/**
* 当前勾选为延迟加载的工具名列表
* 注意form Drawer storeToRefs + provide 传入的 Ref脚本侧必须 unref 后再取属性
* 模板里会自动解包脚本里直接 form.xxx 会得到 undefined
*/
const deferredToolNames = (): string[] => {
const f: any = unref(form);
return Array.isArray(f?.tool_loading_deferred) ? f.tool_loading_deferred : [];
};
/** 类目内工具是否全部被勾选为延迟加载 */ /** 类目内工具是否全部被勾选为延迟加载 */
const isCategoryFullyDeferred = (cat: { tools: string[] }) => const isCategoryFullyDeferred = (cat: { tools: string[] }) =>
Array.isArray(cat.tools) && Array.isArray(cat.tools) &&
cat.tools.length > 0 && cat.tools.length > 0 &&
cat.tools.every((name: string) => form.tool_loading_deferred.includes(name)); cat.tools.every((name: string) => deferredToolNames().includes(name));
/** 勾选/取消单个延迟工具 */ /** 勾选/取消单个延迟工具 */
const toggleDeferredTool = (name: string, checked: boolean) => { const toggleDeferredTool = (name: string, checked: boolean) => {
const current = Array.isArray(form.tool_loading_deferred) const current = [...deferredToolNames()];
? [...form.tool_loading_deferred]
: [];
const idx = current.indexOf(name); const idx = current.indexOf(name);
if (checked && idx === -1) { if (checked && idx === -1) {
current.push(name); current.push(name);
@ -40,9 +48,7 @@ const toggleDeferredTool = (name: string, checked: boolean) => {
/** 勾选/取消整个类目(幂等,不动其他类目) */ /** 勾选/取消整个类目(幂等,不动其他类目) */
const toggleDeferredCategory = (cat: { tools: string[] }, checked: boolean) => { const toggleDeferredCategory = (cat: { tools: string[] }, checked: boolean) => {
const current = new Set<string>( const current = new Set<string>(deferredToolNames());
Array.isArray(form.tool_loading_deferred) ? form.tool_loading_deferred : []
);
for (const name of cat.tools || []) { for (const name of cat.tools || []) {
if (checked) { if (checked) {
current.add(name); current.add(name);