1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| <template>
| <uni-rich-text v-on="$listeners">
| <div ref="content">
| <v-uni-resize-sensor
| ref="sensor"
| @resize="_updateView()"
| />
| </div>
| </uni-rich-text>
| </template>
| <script>
| import parseHtml from './html-parser'
| import parseNodes from './nodes-parser'
|
| export default {
| name: 'RichText',
| props: {
| nodes: {
| type: [Array, String],
| default: function () {
| return []
| }
| }
| },
| watch: {
| nodes (value) {
| this._renderNodes(value)
| }
| },
| mounted () {
| this._renderNodes(this.nodes)
| },
| methods: {
| _renderNodes (nodes) {
| let scopeId = ''
| let $vm = this
| while ($vm) {
| !scopeId && (scopeId = $vm.$options._scopeId)
| $vm = $vm.$parent
| }
|
| const hasItemClick = !!this.$listeners.itemclick
|
| if (!this._isMounted) {
| return
| }
| if (typeof nodes === 'string') {
| nodes = parseHtml(nodes)
| }
| const nodeList = parseNodes(nodes, document.createDocumentFragment(), scopeId, hasItemClick && this.triggerItemClick)
| nodeList.appendChild(this.$refs.sensor.$el)
| const content = this.$refs.content
| content.innerHTML = ''
| content.appendChild(nodeList)
| },
| _updateView () {
| window.dispatchEvent(new CustomEvent('updateview'))
| },
| triggerItemClick (e, detail = {}) {
| this.$trigger('itemclick', e, detail)
| }
| }
| }
| </script>
| <style></style>
|
|