构建: - 新增 tools/build.js:junction HBuilderX 工具链,CLI 构建 h5/mp-weixin - vue 指向补丁版 @dcloudio/uni-h5-vue(官方 npm vue 不导出 isInSSRComponentSetup) - 设 HX_APP_ROOT 避免退化成 H5 空壳产物;产物完整性校验 校验工具: - 新增 check-cloud-methods.js:acorn 解析云对象方法,比对 94 处调用点 - 新增 check-android-contract.js:Kotlin 侧云对象契约校验 - audit-project.js 修 downloadFile 误报(注释未剥离);tools/ 排除出扫描 - package.json 声明此前隐式依赖的 acorn 功能: - 补 uni-cms-articles.getPublishedArticles(安卓端依赖但此前不存在) - 修 u-parse <audio> 引用已移除组件导致 H5 构建失败
135 lines
2.7 KiB
Vue
135 lines
2.7 KiB
Vue
<template>
|
|
<view class="content" :style="{ color }">
|
|
<template v-for="(op, index) in content" :key="index">
|
|
<render-text
|
|
v-if="op.type === 'paragraph'"
|
|
:data="op.data"
|
|
:className="op.class"
|
|
:style="op.style"
|
|
></render-text>
|
|
<render-image
|
|
v-else-if="op.type === 'image' && Array.isArray(op.data) && op.data.length > 0"
|
|
:data="op.data[0]"
|
|
:className="op.class"
|
|
:style="op.style"
|
|
></render-image>
|
|
<render-list
|
|
v-else-if="op.type === 'list'"
|
|
:data="op.data"
|
|
:style="op.style"
|
|
></render-list>
|
|
<view
|
|
v-else-if="op.type === 'divider'"
|
|
class="divider"
|
|
></view>
|
|
<render-video
|
|
v-else-if="op.type === 'mediaVideo'"
|
|
:data="op.data"
|
|
></render-video>
|
|
<!-- <render-unlock-content
|
|
v-else-if="op.type === 'unlockContent'"
|
|
:adp-id="adConfig.adpId"
|
|
:watch-ad-unique-type="adConfig.watchAdUniqueType"
|
|
></render-unlock-content> -->
|
|
</template>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import {parseImageUrl} from "@/uni_modules/uni-cms-article/common/parse-image-url"
|
|
|
|
import text from './text.vue'
|
|
import image from './image.vue'
|
|
import video from './video.vue'
|
|
import list from './list.vue'
|
|
import unlockContent from './unlock-content.vue'
|
|
|
|
export default {
|
|
name: "render-article-detail",
|
|
props: {
|
|
content: {
|
|
type: Array,
|
|
default () {
|
|
return []
|
|
}
|
|
},
|
|
contentImages: {
|
|
type: Array,
|
|
default () {
|
|
return []
|
|
}
|
|
},
|
|
adConfig: {
|
|
type: Object,
|
|
default: {}
|
|
},
|
|
color: {
|
|
type: String,
|
|
default: "#333"
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
articleImages: []
|
|
}
|
|
},
|
|
components: {
|
|
renderUnlockContent: unlockContent,
|
|
renderText: text,
|
|
renderImage: image,
|
|
renderList: list,
|
|
renderVideo: video
|
|
},
|
|
mounted() {
|
|
this.initImage()
|
|
},
|
|
beforeUnmount () {
|
|
uni.$off('imagePreview', this.imagePreview)
|
|
},
|
|
methods: {
|
|
// 初始化图片
|
|
async initImage() {
|
|
// 获取所有图片
|
|
const parseImages = await parseImageUrl(this.contentImages)
|
|
|
|
if (parseImages != null) {
|
|
this.articleImages = parseImages.map(image => image.src)
|
|
}
|
|
|
|
// 监听图片预览
|
|
uni.$off('imagePreview', this.imagePreview)
|
|
uni.$on('imagePreview', this.imagePreview)
|
|
},
|
|
// 点击图片预览
|
|
imagePreview(src) {
|
|
if (src) {
|
|
uni.previewImage({
|
|
current: src.split('?')[0], // 当前显示图片的http链接
|
|
urls: this.articleImages // 需要预览的图片http链接列表
|
|
})
|
|
}
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.content {
|
|
line-height: 1.75;
|
|
font-size: 32rpx;
|
|
margin-top: 40rpx;
|
|
padding: 0 30rpx 80rpx;
|
|
word-break: break-word;
|
|
color: #333;
|
|
}
|
|
|
|
.divider {
|
|
height: 1px;
|
|
background: #d8d8d8;
|
|
width: 100%;
|
|
margin: 40rpx 0;
|
|
}
|
|
|
|
</style>
|
|
|