文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

手把手教你实现一个简易的Vue组件在线编辑器

2024-12-03 15:56

关注

vue-cli使用过vue的我想大家都知道,那么xxx.vue组件是怎么运行的呢?怎么把template,script,style渲染到页面上的呢?今天我们手动写了个简易的Vue组件在线编辑器玩一玩。

话不多说先看一下效果


准备工作

  1. 安装vuejs
  2. 新建xxx.html
  3. 新建xxx.css

编写页面

  1. "app"
  2.        name="" id="" cols="30" rows="30" v-model="content" autofocus placeholder="请输入vue模板"
  3.        "btn-center"
  4.            "run">运行代码 
  5.            "reset">清除 
  6.        
 
  •    
  •  
  •    "result">
  •  
  •    "./node_modules/vue/dist/vue.js"
  • textarea 元素为vue组件代码的编写部分,button为按钮区域
    1. textarea { 
    2.             display: block; 
    3.             width: 100%; 
    4.             min-height: 100px; 
    5.             max-height: 500px; 
    6.             padding: 8px; 
    7.             resize: auto; 
    8.  } 
    9.  
    10.  button { 
    11.             margin-top: 8px; 
    12.             display: inline-block; 
    13.             padding: 5px 16px; 
    14.             font-size: 14px; 
    15.             font-weight: 500; 
    16.             line-height: 20px; 
    17.             white-space: nowrap; 
    18.             vertical-align: middle; 
    19.             cursor: pointer; 
    20.             -webkit-user-select: none; 
    21.             -moz-user-select: none; 
    22.             -ms-user-select: none; 
    23.             user-select: none; 
    24.             border: 1px solid; 
    25.             border-radius: 6px; 
    26.             -webkit-appearance: none; 
    27.             -moz-appearance: none; 
    28.             appearance: none; 
    29.  .btn-center{ 
    30.            text-align: center; 
    31.  } 

    思路分解

    在xxx.vue中,我们写组件通常遵循一下模板

    1.  
    2.  
    3.  

    我们想到的是在拿到输入的内容之后,我们希望获取都tempalte,script,style中的内容,然后通过Vue.extend( options )方法挂载到页面的元素上即可。

    解析标签

    我们需要拿到内容包括下图红圈外的部分


    可以利用字符串的match方法获取到每一段的开始标签的下标,开始标签的长度以及结束标签的下标,然后通过slice方法截取获取到想要的内容。

    1. getSource(type){ 
    2.     const reg = new RegExp(`<${type}[^>]*>`); 
    3.     let content = this.content; 
    4.     let matches = content.match(reg); 
    5.     if(matches){ 
    6.       let start = content.indexOf(matches[0])+matches[0].length; 
    7.       let end = content.lastIndexOf(`
    8.       return content.slice(start,end
    9.     } 
    10.   }, 

    截取之后获取到的结果


    转化函数


    在vue官网中,data必须是一个函数,我们拿到的是一个字符串

    1. export default { 
    2.     data(){ 
    3.         return { 
    4.             msg:'hello world' 
    5.         } 
    6.     }, 
    7.     methods:{ 
    8.         run(){ 
    9.             console.log("你好"
    10.         } 
    11.     } 

    如何把一个字符串转化为可执行函数,可以参考如何让一个字符串执行?

    我们可以用new Function方法将字符串转化为可执行函数,我们需要的是

    1. data(){ 
    2.         return { 
    3.             msg:'hello world' 
    4.         } 
    5.     }, 
    6.     methods:{ 
    7.         run(){ 
    8.             console.log("你好"
    9.         } 
    10.     } 

    利用字符串的replace方法将export default 替换成return得到


    完成代码

    1. run:function(){ 
    2.  let template = this.getSource("template"); 
    3.  if(!template) return 
    4.  let script = this.getSource("script"); 
    5.  if(script){ 
    6.    script = script.replace(/export default/,"return"); 
    7.  } 
    8.  let obj = new Function(script)(); 
    9.  obj.template = template; 
    10.  let Profile = Vue.extend(obj); 
    11.  new Profile().$mount("#result"
    12. }, 

    处理样式

    通过正则解析拿到style样式之后,添加到head中即可

    1. let styleCss = this.getSource("style"); 
    2. let style = document.createElement("style"); 
    3. style.innerHTML = styleCss; 
    4. document.head.appendChild(style); 

    总结

    以上就是本文的全部内容了,只是简单地借助Vue.extend()方法实现的一个简单的Vue组件在线编辑器

    1. "app"
    2.     name="" id="" cols="30" rows="30" v-model="content" autofocus placeholder="请输入vue模板"
    3.     "btn-center"
    4.         "run">运行代码 
    5.         "reset">清除 
    6.     
     
  •  
  • "result"
  • "./node_modules/vue/dist/vue.js"
  •  
  •  

    来源:前端简报内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯