vue 后端返回富文本进行填空

在讲述填空之前先思考如何修改后端返回的富文本呢,我们可以通过让后端将动态修改的部分进行变量的动态插值{{xxx}},这样你将可以通过正则拿到/{{(.*?)}}/g进行替换即可

const data = ref({
  name: 'sun',
  sex: '男',
  age: '18'
})
// 例子(假设这是后端返回的富文本)
let html ='姓名:{{name}},性别:{{sex}},年龄{:{age}}等等......'
const newHtml = computed(() => {
  return html.replace(/{{(.*?)}}/g, (_, key) => `<span style="color: #2674EA;">${data.value[key.trim()]}</span>`)
})
// html 直接渲染
<div style="line-height: 1.5" v-html="newHtml"></div>
// 页面效果将是: 姓名:sun,性别:男,年龄:18等等......

值得注意的是我们虽然可以替换简单模板,但是不能替换相关组件,因为vue在渲染时只会当作字符串渲染,而v-html只会渲染并解析h5相关标签

// 会原样输出<el-input v-model="xxx" placeholder="请输入" />
const newHtml = computed(() => {
  return html.replace(/{{(.*?)}}/g, (_, key) => `<el-input v-model="${date.value[key.trim()]}" placeholder="请输入" />` )
})

 因此我们可以通过component进行组件渲染

<template v-for="(item, index) in replacedHtml" :key="item.key">
  <component :is="item.type" v-model="data[item.key]" />
  <span v-if="item.type === 'text'" v-html="item.content"></span>
</template>

富文本替换部分

let arr = [
  { type: 'el-input', key: 'name' },
  { type: 'text', key: 'sex' },
  { type: 'text', key: 'age' },
]
function generateComponent(item) {
  if (item.type === 'el-input') {
    return {
      type: 'el-input',
      key: item.key,
      value: data.value[item.key],
    }
  } else if (item.type === 'text') {
    return {
      type: 'text',
      key: item.key,
      content: data.value[item.key],
    }
  }
}
const replacedHtml = computed(() => {
  const reg = /{{(.*?)}}/g
  const result = []
  let match
  let lastIndex = 0
  let comIndex = 0
  while ((match = reg.exec(html)) !== null) {
    comIndex++
    if (match.index > lastIndex) {
      result.push({
        type: 'text',
        content: html.substring(lastIndex, match.index),
      })
    }
    result.push(generateComponent(arr[comIndex - 1]))
    lastIndex = match.index + match[0].length
  }
  if (lastIndex < html.length) {
    result.push({
      type: 'text',
      content: html.substring(lastIndex),
    })
  }
  return result
})

上述代码只是实现了将插值替换为对应文字或输入框并实现绑定,至于其他组件可以尝试通过component中的v-bind进行配置,对于复杂的来说还是前端数据写死处理相对简单

项目截图

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Write λ Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值