From d7038a7d1879b99f34e25a5cdd59506ae89f7030 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 9 Feb 2025 11:21:46 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E4=BC=98=E5=8C=96FormRender?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=EF=BC=8C=E5=A2=9E=E5=BC=BAv-model=E5=92=8Cv-?= =?UTF-8?q?show=E6=94=AF=E6=8C=81=EF=BC=8C=E6=94=B9=E8=BF=9B=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=BB=91=E5=AE=9A=E9=80=BB=E8=BE=91=EF=BC=9B=E5=9C=A8?= =?UTF-8?q?TheMovieDbView=E4=B8=AD=E6=B7=BB=E5=8A=A0=E5=84=BF=E7=AB=A5?= =?UTF-8?q?=E7=B1=BB=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/render/FormRender.vue | 32 ++++++++++++++++++++++----- src/views/discover/TheMovieDbView.vue | 1 + 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/components/render/FormRender.vue b/src/components/render/FormRender.vue index 6a623a65..fa745a8e 100644 --- a/src/components/render/FormRender.vue +++ b/src/components/render/FormRender.vue @@ -23,22 +23,44 @@ const parseProps = (rawProps: Record, model: Record) = parsedProps['onUpdate:value'] = (newValue: any) => { model[value] = newValue } - } else if (key === 'model') { + } else if (['model', 'v-model'].includes(key)) { // 处理 v-model parsedProps['modelValue'] = model[value] parsedProps['onUpdate:modelValue'] = (newValue: any) => { model[value] = newValue } - } else if (key.startsWith('model:')) { + } else if (['show', 'v-show'].includes(key)) { + // 处理 v-show,实现显示隐藏 + const expression = value.startsWith('{{') && value.endsWith('}}') ? value.slice(2, -2).trim() : value + const isVisible = new Function('model', `with(model) { return ${expression} }`)(model) + // 动态设置 style.display + if (!parsedProps.style) { + parsedProps.style = {} + } + parsedProps.style.display = isVisible ? '' : 'none' + } else if (key.startsWith('model:') || key.startsWith('v-model:')) { // 处理 v-model: - const propName = key.replace('model:', '') + const propName = key.split(':')[1] parsedProps[propName] = model[value] parsedProps[`onUpdate:${propName}`] = (newValue: any) => { model[value] = newValue } + } else if (key.startsWith('on')) { + // 处理事件监听 + const eventName = key.replace('on', '').toLowerCase() + parsedProps[eventName] = (event: any) => model[value](event) } else { - // 普通属性直接赋值 - parsedProps[key] = typeof value === 'string' && value in model ? model[value] : value + // 如果是表达式,需要绑定 + if (typeof value === 'string' && value.startsWith('{{') && value.endsWith('}}')) { + const expression = value.slice(2, -2).trim() + parsedProps[key] = new Function('model', `with(model) { return ${expression} }`)(model) + } else if (typeof value === 'string' && value in model) { + // 如果是数据模型的属性,直接绑定 + parsedProps[key] = model[value] + } else { + // 其他情况直接赋值 + parsedProps[key] = value + } } } diff --git a/src/views/discover/TheMovieDbView.vue b/src/views/discover/TheMovieDbView.vue index af356395..02f689df 100644 --- a/src/views/discover/TheMovieDbView.vue +++ b/src/views/discover/TheMovieDbView.vue @@ -41,6 +41,7 @@ const tmdbGenreDict = { '28': '动作', '12': '冒险', '16': '动画', + '10762': '儿童', '35': '喜剧', '80': '犯罪', '99': '纪录片',