Vue中安全渲染富媒体需区分数据可信度:可信结构化数据可解构使用,UGC须DOMPurify清洗,第三方嵌入用iframe/SDK;props强约束类型与格式,禁用v-html直渲,优先语义化标签与事件抽象,复杂场景用作用域插槽移交渲染权。
Vue 中通过 Props 传递富媒体内容(如 HTML 字符串、图片 URL、视频链接等)并安全渲染,关键在于明确区分“结构化数据”与“可执行内容”,避免直接 v-html 渲染不可信来源,同时保留语义和交互能力。这不是单纯传个字符串就能解决的问题,而是涉及数据建模、校验、沙箱控制和渲染策略的组合实践。
富媒体不是“一段 HTML 就完事”。先分类再处理:
<iframe> 或最新 SDK 加载,禁止拼接 HTML 字符串子组件不能无条件接收任何字符串。用对象式 props 做强约束:
type: String + validator 检查是否以 https:// 开头且扩展名在 ['.jpg', '.png', '.webp'] 中type: String,且只接受已知平台格式(如 https://www.youtube.com/embed/xxx)htmlContent: { type: Object, required: true },约定为预处理后的安全 AST 或纯文本+标记数组(如 { text: '加粗', bold: true })default: () => ({}) 或空字符串,防止 undefined 导致模板报错即使 props 校验通过,也不应无脑 v-html。更安全的做法是:
<img :src="props.coverUrl" :> 替代 v-html 插入 img 标签<video :src="props.videoSrc" controls> 或封装 <YouTubePlayer :video-id="props.ytId" />
this.safeHtml = DOMPurify.sanitize(props.rawHtml),再 v-html="safeHtml"
$emit('action', { type: 'share', payload: ... }),由父组件决定跳转或调 API当富媒体结构复杂、变化频繁时,props 会迅速臃肿。此时用作用域插槽更可控:
<slot name="media" :item="item"></slot> 让父组件决定如何渲染 media 区域