Skip to content

Commit d352b58

Browse files
authored
fix(plugin-jsx): v-model argument and modifier co-usage (#668)
1 parent 55bab7a commit d352b58

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

packages/babel-plugin-jsx/README-zh_CN.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,14 @@ const App = {
162162
163163
```jsx
164164
<input v-model={[val, ['modifier']]} />
165+
// 或者
166+
<input v-model_modifier={val} />
165167
```
166168
167169
```jsx
168170
<A v-model={[val, 'argument', ['modifier']]} />
171+
// 或者
172+
<input v-model:argument_modifier={val} />
169173
```
170174
171175
会编译成:

packages/babel-plugin-jsx/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,14 @@ const App = {
166166
167167
```jsx
168168
<input v-model={[val, ['modifier']]} />
169+
// Or
170+
<input v-model_modifier={val} />
169171
```
170172
171173
```jsx
172174
<A v-model={[val, 'argument', ['modifier']]} />
175+
// Or
176+
<input v-model:argument_modifier={val} />
173177
```
174178
175179
Will compile to:

packages/babel-plugin-jsx/src/parseDirectives.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const parseDirectives = (params: {
6767
.replace(/^\S/, (s: string) => s.toLowerCase());
6868

6969
if (directiveArgument) {
70-
args.push(t.stringLiteral(directiveArgument));
70+
args.push(t.stringLiteral(directiveArgument.split('_')[0]));
7171
}
7272

7373
const isVModels = directiveName === 'models';

packages/babel-plugin-jsx/test/v-model.test.tsx

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,48 @@ test('Named model', async () => {
286286
await wrapper.trigger('click');
287287
expect(wrapper.html()).toBe('<div>2</div>');
288288
});
289+
290+
test('named model and underscore modifier should work in custom component', async () => {
291+
const Child = defineComponent({
292+
emits: ['update:value'],
293+
props: {
294+
value: {
295+
type: Number,
296+
default: 0,
297+
},
298+
valueModifiers: {
299+
default: () => ({ double: false }),
300+
},
301+
},
302+
setup(props, { emit }) {
303+
const handleClick = () => {
304+
emit('update:value', 3);
305+
};
306+
return () => (
307+
<div onClick={handleClick}>
308+
{props.valueModifiers.double ? props.value * 2 : props.value}
309+
</div>
310+
);
311+
},
312+
});
313+
314+
const wrapper = mount(
315+
defineComponent({
316+
data() {
317+
return {
318+
foo: 1,
319+
};
320+
},
321+
render() {
322+
return <Child v-model:value_double={this.foo} />;
323+
},
324+
})
325+
);
326+
327+
expect(wrapper.html()).toBe('<div>2</div>');
328+
wrapper.vm.$data.foo += 1;
329+
await wrapper.vm.$nextTick();
330+
expect(wrapper.html()).toBe('<div>4</div>');
331+
await wrapper.trigger('click');
332+
expect(wrapper.html()).toBe('<div>6</div>');
333+
});

0 commit comments

Comments
 (0)