f18e7565创建于 2024年10月18日历史提交
<template>
    <div class="rich-text" :style="style_container">
        <div :style="style_img_container">
            <div class="rich-text-content" :innerHTML="safe_content"></div>
        </div>
    </div>
</template>
<script lang="ts" setup>
import { common_img_computer, common_styles_computer } from '@/utils';
// 引入dompurify模块 安全地清理HTML内容,确保插入到DOM中的内容不会导致XSS攻击。
import DOMPurify from 'dompurify';
/**
 * @description: 富文本(渲染)
 * @param value{Object} 传过来的数据,用于数据渲染
 */
const props = defineProps({
    value: {
        type: Object,
        default: () => ({}),
    },
});
const style_container = ref('');
const style_img_container = ref('');
const content = ref('');
watch(
    props.value,
    (newVal, oldValue) => {
        const new_content = newVal?.content || {};
        const new_style = newVal?.style || {};
        content.value = new_content.html;
        style_container.value = common_styles_computer(new_style.common_style);
        style_img_container.value = common_img_computer(new_style.common_style);
    },
    { immediate: true, deep: true }
);
// 计算
const safe_content = computed(() => DOMPurify.sanitize(content.value));
</script>
<style lang="scss" scoped>
.rich-text-content {
    white-space: normal;
    word-break: break-all;
    * {
        max-width: 100%;
    }
}
</style>