Skip to content

Commit 71ce60d

Browse files
committed
support filters in v-bind
1 parent 30f890c commit 71ce60d

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed

src/compiler/helpers.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/* @flow */
22

3+
import { parseFilters } from './parser/filter-parser'
4+
35
export function baseWarn (msg: string) {
46
console.error(`[Vue parser]: ${msg}`)
57
}
@@ -72,7 +74,7 @@ export function getBindingAttr (
7274
getAndRemoveAttr(el, ':' + name) ||
7375
getAndRemoveAttr(el, 'v-bind:' + name)
7476
if (dynamicValue != null) {
75-
return dynamicValue
77+
return parseFilters(dynamicValue)
7678
} else if (getStatic !== false) {
7779
const staticValue = getAndRemoveAttr(el, name)
7880
if (staticValue != null) {

src/compiler/parser/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import { decode } from 'he'
44
import { parseHTML } from './html-parser'
55
import { parseText } from './text-parser'
6+
import { parseFilters } from './filter-parser'
67
import { cached, no, camelize } from 'shared/util'
78
import { isIE, isServerRendering } from 'core/util/env'
89
import {
@@ -375,6 +376,7 @@ function processAttrs (el) {
375376
}
376377
if (bindRE.test(name)) { // v-bind
377378
name = name.replace(bindRE, '')
379+
value = parseFilters(value)
378380
if (modifiers && modifiers.prop) {
379381
isProp = true
380382
name = camelize(name)

test/unit/features/filter/filter.spec.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,31 @@ describe('Filters', () => {
2929
expect(vm.$el.textContent).toBe('IH')
3030
})
3131

32+
it('in v-bind', () => {
33+
const vm = new Vue({
34+
template: `
35+
<div
36+
v-bind:id="id | upper | reverse"
37+
:class="cls | reverse"
38+
:ref="ref | lower">
39+
</div>
40+
`,
41+
filters: {
42+
upper: v => v.toUpperCase(),
43+
reverse: v => v.split('').reverse().join(''),
44+
lower: v => v.toLowerCase()
45+
},
46+
data: {
47+
id: 'abc',
48+
cls: 'foo',
49+
ref: 'BAR'
50+
}
51+
}).$mount()
52+
expect(vm.$el.id).toBe('CBA')
53+
expect(vm.$el.className).toBe('oof')
54+
expect(vm.$refs.bar).toBe(vm.$el)
55+
})
56+
3257
it('arguments', () => {
3358
const vm = new Vue({
3459
template: `<div>{{ msg | add(a, 3) }}</div>`,

test/unit/modules/compiler/codegen.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ describe('codegen', () => {
3737
)
3838
})
3939

40+
it('generate filters', () => {
41+
assertCodegen(
42+
'<div :id="a | b | c">{{ d | e | f }}</div>',
43+
`with(this){return _h('div',{attrs:{"id":_f("c")(_f("b")(a))}},[_s(_f("f")(_f("e")(d)))])}`
44+
)
45+
})
46+
4047
it('generate v-for directive', () => {
4148
assertCodegen(
4249
'<li v-for="item in items" :key="item.uid"></li>',

0 commit comments

Comments
 (0)