From f8c2df7c09a25f1cfbf5b1694215e05a84c8c470 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Sat, 8 Apr 2023 12:55:36 +0200 Subject: [PATCH 1/3] feat: support `v-model` for `
` and `` --- .../__snapshots__/vModel.spec.ts.snap | 32 +++++++++++++++++ .../__tests__/transforms/vModel.spec.ts | 16 +++++++++ packages/compiler-dom/src/runtimeHelpers.ts | 4 +++ .../compiler-dom/src/transforms/vModel.ts | 10 +++++- .../compiler-ssr/__tests__/ssrElement.spec.ts | 20 +++++++++++ .../compiler-ssr/src/transforms/ssrVModel.ts | 2 ++ packages/runtime-dom/src/directives/vModel.ts | 36 +++++++++++++++++++ packages/runtime-dom/src/index.ts | 2 ++ 8 files changed, 121 insertions(+), 1 deletion(-) diff --git a/packages/compiler-dom/__tests__/transforms/__snapshots__/vModel.spec.ts.snap b/packages/compiler-dom/__tests__/transforms/__snapshots__/vModel.spec.ts.snap index d2c9aaa785f..039d259b564 100644 --- a/packages/compiler-dom/__tests__/transforms/__snapshots__/vModel.spec.ts.snap +++ b/packages/compiler-dom/__tests__/transforms/__snapshots__/vModel.spec.ts.snap @@ -127,6 +127,38 @@ return function render(_ctx, _cache) { }" `; +exports[`compiler: transform v-model > simple expression for details 1`] = ` +"const _Vue = Vue + +return function render(_ctx, _cache) { + with (_ctx) { + const { vModelDetails: _vModelDetails, withDirectives: _withDirectives, openBlock: _openBlock, createElementBlock: _createElementBlock } = _Vue + + return _withDirectives((_openBlock(), _createElementBlock(\\"details\\", { + \\"onUpdate:modelValue\\": $event => ((model) = $event) + }, null, 8 /* PROPS */, [\\"onUpdate:modelValue\\"])), [ + [_vModelDetails, model] + ]) + } +}" +`; + +exports[`compiler: transform v-model > simple expression for dialog 1`] = ` +"const _Vue = Vue + +return function render(_ctx, _cache) { + with (_ctx) { + const { vModelDialog: _vModelDialog, withDirectives: _withDirectives, openBlock: _openBlock, createElementBlock: _createElementBlock } = _Vue + + return _withDirectives((_openBlock(), _createElementBlock(\\"dialog\\", { + \\"onUpdate:modelValue\\": $event => ((model) = $event) + }, null, 8 /* PROPS */, [\\"onUpdate:modelValue\\"])), [ + [_vModelDialog, model] + ]) + } +}" +`; + exports[`compiler: transform v-model > simple expression for input (checkbox) 1`] = ` "const _Vue = Vue diff --git a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts index dce8f09b02c..2e43546bc89 100644 --- a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts @@ -9,6 +9,8 @@ import { transformElement } from '../../../compiler-core/src/transforms/transfor import { DOMErrorCodes } from '../../src/errors' import { V_MODEL_CHECKBOX, + V_MODEL_DETAILS, + V_MODEL_DIALOG, V_MODEL_DYNAMIC, V_MODEL_RADIO, V_MODEL_SELECT, @@ -83,6 +85,20 @@ describe('compiler: transform v-model', () => { expect(generate(root).code).toMatchSnapshot() }) + test('simple expression for details', () => { + const root = transformWithModel('
') + + expect(root.helpers).toContain(V_MODEL_DETAILS) + expect(generate(root).code).toMatchSnapshot() + }) + + test('simple expression for dialog', () => { + const root = transformWithModel('') + + expect(root.helpers).toContain(V_MODEL_DIALOG) + expect(generate(root).code).toMatchSnapshot() + }) + test('simple expression for textarea', () => { const root = transformWithModel('