Browse Source
* feat($compiler): support to generate @render function for weex recycle-list Compile the template twice with different options for weex platform if the “recyclable” flag is passed. Generate both normal render function and “@render” function for recycle-list. Adjust function names and arguments in recycle-list compiler. * test(weex): add test cases for <recycle-list>dev
Hanks
7 years ago
committed by
Evan You
28 changed files with 588 additions and 30 deletions
@ -0,0 +1,33 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A', count: 1, source: 'http://whatever.com/x.png' }, |
||||
|
{ type: 'A', count: 2, source: 'http://whatever.com/y.png' }, |
||||
|
{ type: 'A', count: 3, source: 'http://whatever.com/z.png' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'image', |
||||
|
attr: { |
||||
|
resize: 'cover', |
||||
|
src: { |
||||
|
'@binding': 'item.source' |
||||
|
} |
||||
|
} |
||||
|
}, { |
||||
|
type: 'text', |
||||
|
attr: { |
||||
|
lines: '3', |
||||
|
count: { |
||||
|
'@binding': 'item.count' |
||||
|
} |
||||
|
} |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,23 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<image resize="cover" :src="item.source"> |
||||
|
<text lines="3" v-bind:count="item.count"></text> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A', count: 1, source: 'http://whatever.com/x.png' }, |
||||
|
{ type: 'A', count: 2, source: 'http://whatever.com/y.png' }, |
||||
|
{ type: 'A', count: 3, source: 'http://whatever.com/z.png' } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
@ -0,0 +1,37 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A', dynamic: 'decimal', two: '2', four: '4' }, |
||||
|
{ type: 'A', dynamic: 'binary', two: '10', four: '100' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'text', |
||||
|
attr: { |
||||
|
value: 'static' |
||||
|
} |
||||
|
}, { |
||||
|
type: 'text', |
||||
|
attr: { |
||||
|
value: { '@binding': 'item.dynamic' } |
||||
|
} |
||||
|
}, { |
||||
|
type: 'text', |
||||
|
attr: { |
||||
|
value: [ |
||||
|
'one ', |
||||
|
{ '@binding': 'item.two' }, |
||||
|
' three ', |
||||
|
{ '@binding': 'item.four' }, |
||||
|
' five' |
||||
|
] |
||||
|
} |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,23 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<text>static</text> |
||||
|
<text>{{item.dynamic}}</text> |
||||
|
<text>one {{item.two}} three {{ item.four }} five</text> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A', dynamic: 'decimal', two: '2', four: '4' }, |
||||
|
{ type: 'A', dynamic: 'binary', two: '10', four: '100' } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
@ -0,0 +1,34 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'image', |
||||
|
attr: { |
||||
|
'[[match]]': 'item.sourceA', |
||||
|
src: { '@binding': 'item.sourceA' } |
||||
|
} |
||||
|
}, { |
||||
|
type: 'image', |
||||
|
attr: { |
||||
|
'[[match]]': '!(item.sourceA) && (item.sourceB)', |
||||
|
src: { '@binding': 'item.sourceB' } |
||||
|
} |
||||
|
}, { |
||||
|
type: 'image', |
||||
|
attr: { |
||||
|
'[[match]]': '!(!(item.sourceA) && (item.sourceB))', |
||||
|
src: { '@binding': 'item.placeholder' } |
||||
|
} |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,23 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<image v-if="item.sourceA" :src="item.sourceA"></image> |
||||
|
<image v-else-if="item.sourceB" :src="item.sourceB"></image> |
||||
|
<image v-else :src="item.placeholder"></image> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
@ -0,0 +1,28 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'image', |
||||
|
attr: { |
||||
|
'[[match]]': 'item.source', |
||||
|
src: { '@binding': 'item.source' } |
||||
|
} |
||||
|
}, { |
||||
|
type: 'image', |
||||
|
attr: { |
||||
|
'[[match]]': '!(item.source)', |
||||
|
src: { '@binding': 'item.placeholder' } |
||||
|
} |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,22 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<image v-if="item.source" :src="item.source"></image> |
||||
|
<image v-else v-bind:src="item.placeholder"></image> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
@ -0,0 +1,46 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'div', |
||||
|
attr: { |
||||
|
'[[repeat]]': { |
||||
|
'@expression': 'item.list', |
||||
|
'@index': 'index', |
||||
|
'@alias': 'object' |
||||
|
} |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'text', |
||||
|
attr: { |
||||
|
value: { |
||||
|
'@binding': 'object.name' |
||||
|
} |
||||
|
} |
||||
|
}, { |
||||
|
type: 'text', |
||||
|
attr: { |
||||
|
'[[repeat]]': { |
||||
|
'@expression': 'object', |
||||
|
'@alias': 'v', |
||||
|
'@key': 'k', |
||||
|
'@index': 'i' |
||||
|
}, |
||||
|
value: { |
||||
|
'@binding': 'v' |
||||
|
} |
||||
|
} |
||||
|
}] |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,24 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<div v-for="(object, index) in item.list" :key="index"> |
||||
|
<text>{{object.name}}</text> |
||||
|
<text v-for="(v, k, i) in object" :key="k">{{v}}</text> |
||||
|
</div> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
@ -0,0 +1,32 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'div', |
||||
|
attr: { |
||||
|
'[[repeat]]': { |
||||
|
'@expression': 'item.list', |
||||
|
'@alias': 'panel' |
||||
|
} |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'text', |
||||
|
attr: { |
||||
|
value: { |
||||
|
'@binding': 'panel.label' |
||||
|
} |
||||
|
} |
||||
|
}] |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,23 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<div v-for="panel in item.list" :key="panel.id"> |
||||
|
<text>{{panel.label}}</text> |
||||
|
</div> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
@ -0,0 +1,28 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'image', |
||||
|
attr: { |
||||
|
'[[match]]': 'item.source', |
||||
|
src: { '@binding': 'item.source' } |
||||
|
} |
||||
|
}, { |
||||
|
type: 'text', |
||||
|
attr: { |
||||
|
'[[match]]': '!item.source', |
||||
|
value: 'Title' |
||||
|
} |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,22 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<image v-if="item.source" :src="item.source"></image> |
||||
|
<text v-if="!item.source">Title</text> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
@ -0,0 +1,36 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'text', |
||||
|
event: ['click', { |
||||
|
type: 'longpress', |
||||
|
params: [{ '@binding': 'item.key' }] |
||||
|
}] |
||||
|
}, { |
||||
|
type: 'text', |
||||
|
event: [{ |
||||
|
type: 'appear', |
||||
|
params: [ |
||||
|
{ '@binding': 'item.index' }, |
||||
|
{ '@binding': 'item.type' } |
||||
|
] |
||||
|
}], |
||||
|
attr: { value: 'Button' } |
||||
|
}, { |
||||
|
type: 'text', |
||||
|
event: [{ type: 'disappear' }], |
||||
|
attr: { value: 'Tips' } |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,28 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<text v-on:click="toggle()" @longpress="toggle(item.key)"></text> |
||||
|
<text @appear="onappear(item.index, 'static', item.type, $event)">Button</text> |
||||
|
<text @disappear="onappear(25, 'static')">Tips</text> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
hide () {}, |
||||
|
toggle () {}, |
||||
|
onappear () {} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
@ -0,0 +1,24 @@ |
|||||
|
({ |
||||
|
type: 'recycle-list', |
||||
|
attr: { |
||||
|
listData: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
], |
||||
|
templateKey: 'type', |
||||
|
alias: 'item' |
||||
|
}, |
||||
|
children: [{ |
||||
|
type: 'cell-slot', |
||||
|
attr: { templateType: 'A' }, |
||||
|
children: [{ |
||||
|
type: 'text', |
||||
|
event: ['click', 'longpress'], |
||||
|
attr: { value: 'A' } |
||||
|
}, { |
||||
|
type: 'text', |
||||
|
event: ['touchend'], |
||||
|
attr: { value: 'B' } |
||||
|
}] |
||||
|
}] |
||||
|
}) |
@ -0,0 +1,26 @@ |
|||||
|
<template> |
||||
|
<recycle-list :list-data="longList" template-key="type" alias="item"> |
||||
|
<cell-slot template-type="A"> |
||||
|
<text v-on:click="handler" @longpress="move">A</text> |
||||
|
<text @touchend="move">B</text> |
||||
|
</cell-slot> |
||||
|
</recycle-list> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
module.exports = { |
||||
|
data () { |
||||
|
return { |
||||
|
longList: [ |
||||
|
{ type: 'A' }, |
||||
|
{ type: 'A' } |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
handler () {}, |
||||
|
move () {} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
Loading…
Reference in new issue