<!--** * forked from:https://github.com/F-loat/mpvue-wxParse * * github地址: https://github.com/dcloudio/uParse * * for: uni-app框架下 富文本解析 * * 优化 by gaoyia@qq.com https://github.com/gaoyia/parse */--> <template> <!--基础元素--> <div class="wxParse" :class="className" :style="'user-select:' + userSelect"> <block v-for="(node, index) of nodes" :key="index" v-if="!loading"> <wxParseTemplate :node="node" /> </block> </div> </template> <script> import HtmlToJson from './libs/html2json'; import wxParseTemplate from './components/wxParseTemplate0'; export default { name: 'wxParse', props: { // user-select:none; userSelect: { type: String, default: 'text' //none |text| all | element }, imgOptions: { type: [Object, Boolean], default: function() { return { loop: false, indicator: 'number', longPressActions: false // longPressActions: { // itemList: ['发送给朋友', '保存图片', '收藏'], // success: function (res) { // console.log('选中了第' + (res.tapIndex + 1) + '个按钮'); // }, // fail: function (res) { // console.log(res.errMsg); // } // } // } } } }, loading: { type: Boolean, default: false }, className: { type: String, default: '' }, content: { type: String, default: '' }, noData: { type: String, default: '<div style="color: red;">数据不能为空</div>' }, startHandler: { type: Function, default () { return node => { node.attr.class = null; node.attr.style = null; }; } }, endHandler: { type: Function, default: null }, charsHandler: { type: Function, default: null }, imageProp: { type: Object, default () { return { mode: 'aspectFit', padding: 0, lazyLoad: false, domain: '' }; } } }, components: { wxParseTemplate }, data() { return { nodes: {}, imageUrls: [], wxParseWidth: { value: 0 } }; }, computed: {}, mounted() { this.setHtml() }, methods: { setHtml() { this.getWidth().then((data) => { this.wxParseWidth.value = data; }) let { content, noData, imageProp, startHandler, endHandler, charsHandler } = this; let parseData = content || noData; let customHandler = { start: startHandler, end: endHandler, chars: charsHandler }; let results = HtmlToJson(parseData, customHandler, imageProp, this); this.imageUrls = results.imageUrls; // this.nodes = results.nodes; this.nodes = []; results.nodes.forEach((item) => { setTimeout(() => { this.nodes.push(item) }, 0); }) }, getWidth() { return new Promise((res, rej) => { // #ifndef MP-ALIPAY || MP-BAIDU uni.createSelectorQuery() .in(this) .select('.wxParse') .fields({ size: true, scrollOffset: true }, data => { res(data.width); } ).exec(); // #endif // #ifdef MP-BAIDU const query = swan.createSelectorQuery(); query.select('.wxParse').boundingClientRect(); query.exec(obj => { const rect = obj[0] if (rect) { res(rect.width); } }); // #endif // #ifdef MP-ALIPAY my.createSelectorQuery() .select('.wxParse') .boundingClientRect().exec((ret) => { res(ret[0].width); }); // #endif }); }, navigate(href, $event, attr) { console.log(href, attr); this.$emit('navigate', href, $event); }, preview(src, $event) { if (!this.imageUrls.length || typeof this.imgOptions === 'boolean') { } else { uni.previewImage({ current: src, urls: this.imageUrls, loop: this.imgOptions.loop, indicator: this.imgOptions.indicator, longPressActions: this.imgOptions.longPressActions }); } this.$emit('preview', src, $event); }, removeImageUrl(src) { const { imageUrls } = this; imageUrls.splice(imageUrls.indexOf(src), 1); } }, // 父组件中提供 provide() { return { parseWidth: this.wxParseWidth, parseSelect: this.userSelect // 提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。 }; }, watch: { content(){ this.setHtml() } // content: { // handler: function(newVal, oldVal) { // if (newVal !== oldVal) { // // } // }, // deep: true // } } }; </script>