Content.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <script lang="ts">
  2. import { ref, useTemplateRef } from 'vue'
  3. export default {
  4. name: 'Content',
  5. props:['jsonContent'],
  6. data: () => {
  7. return{
  8. rawHtml: null
  9. }
  10. },
  11. setup(props){
  12. return{
  13. props
  14. }
  15. },
  16. methods: {
  17. reloadContent(el: any, jsonContent : Array){
  18. if(jsonContent && jsonContent.length > 0){
  19. for(const contentItem of jsonContent){
  20. let itemEl = null
  21. switch(contentItem.type){
  22. case "text":
  23. let contentText = contentItem.text
  24. contentText = contentText.replace(/\n/g, "<br />");
  25. if(contentItem.bold){
  26. let bold = document.createElement("b")
  27. bold.insertAdjacentHTML("beforeend", contentText)
  28. el.append(bold)
  29. }else{
  30. el.insertAdjacentHTML("beforeend", contentText)
  31. }
  32. break
  33. case "paragraph":
  34. itemEl = document.createElement("p")
  35. el.append(itemEl)
  36. break
  37. case "heading":
  38. itemEl = document.createElement("h"+contentItem.level)
  39. el.append(itemEl)
  40. break
  41. case "list":
  42. itemEl = document.createElement("ul")
  43. el.append(itemEl)
  44. break
  45. case "list-item":
  46. itemEl = document.createElement("li")
  47. el.append(itemEl)
  48. break
  49. }
  50. if(contentItem.children && contentItem.children.length > 0){
  51. this.reloadContent(itemEl, contentItem.children)
  52. }
  53. }
  54. }
  55. },
  56. updateContent(){
  57. let div = document.createElement("div")
  58. this.reloadContent(div, this.props.jsonContent)
  59. this.rawHtml = div.innerHTML
  60. }
  61. },
  62. mounted () {
  63. this.updateContent()
  64. },
  65. updated(){
  66. this.updateContent()
  67. }
  68. }
  69. </script>
  70. <template >
  71. <div v-html="rawHtml"></div>
  72. </template>