成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手教你實現一個簡易的Vue組件在線編輯器

開發
vue-cli使用過vue的我想大家都知道,那么xxx.vue組件是怎么運行的呢?怎么把template,script,style渲染到頁面上的呢?今天我們手動寫了個簡易的Vue組件在線編輯器玩一玩。

 [[357690]]

vue-cli使用過vue的我想大家都知道,那么xxx.vue組件是怎么運行的呢?怎么把template,script,style渲染到頁面上的呢?今天我們手動寫了個簡易的Vue組件在線編輯器玩一玩。

話不多說先看一下效果


準備工作

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

編寫頁面

  1. <div id="app"
  2.        <textarea name="" id="" cols="30" rows="30" v-model="content" autofocus placeholder="請輸入vue模板"></textarea> 
  3.        <div class="btn-center"
  4.            <button @click="run">運行代碼</button> 
  5.            <button @click="reset">清除</button> 
  6.        </div> 
  7.    </div> 
  8.    <div id="result"></div> 
  9.    <script src="./node_modules/vue/dist/vue.js"></script> 
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. <template> 
  2.      
  3. </template> 
  4. <script> 
  5. export default { 
  6.      
  7. </script> 
  8. <style> 
  9.  
  10. </style> 

我們想到的是在拿到輸入的內容之后,我們希望獲取都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(`</${type}`); 
  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. <div id="app"
  2.     <textarea name="" id="" cols="30" rows="30" v-model="content" autofocus placeholder="請輸入vue模板"></textarea> 
  3.     <div class="btn-center"
  4.         <button @click="run">運行代碼</button> 
  5.         <button @click="reset">清除</button> 
  6.     </div> 
  7. </div> 
  8. <div id="result"></div> 
  9. <script src="./node_modules/vue/dist/vue.js"></script> 
  10. <script> 
  11.     new Vue({ 
  12.         el: "#app"
  13.         data() { 
  14.             return { 
  15.                 content: "" 
  16.             } 
  17.         }, 
  18.         methods: { 
  19.             getSource(type) { 
  20.                 const reg = new RegExp(`<${type}[^>]*>`); 
  21.                 let content = this.content; 
  22.                 let matches = content.match(reg); 
  23.                 if (matches) { 
  24.                     let start = content.indexOf(matches[0]) + matches[0].length; 
  25.                     let end = content.lastIndexOf(`</${type}`); 
  26.                     console.log(content.slice(start, end)); 
  27.                     return content.slice(start, end
  28.                 } 
  29.             }, 
  30.             run: function () { 
  31.                 let template = this.getSource("template"); 
  32.                 if (!template) return 
  33.                 let script = this.getSource("script"); 
  34.                 if (script) { 
  35.                     script = script.replace(/export default/, "return"); 
  36.                 } 
  37.                 let styleCss = this.getSource("style"); 
  38.                 let style = document.createElement("style"); 
  39.                 style.innerHTML = styleCss; 
  40.                 document.head.appendChild(style); 
  41.                 let obj = new Function(script)(); 
  42.                 obj.template = template; 
  43.                 let Profile = Vue.extend(obj); 
  44.                 new Profile().$mount("#result"
  45.             }, 
  46.             reset() { 
  47.                 this.content = '' 
  48.             } 
  49.         } 
  50.     }) 
  51. </script> 

 

責任編輯:姜華 來源: 前端簡報
相關推薦

2022-09-22 12:38:46

antd form組件代碼

2022-06-28 15:29:56

Python編程語言計時器

2020-12-02 12:29:24

Vue無限級聯樹形

2021-06-22 10:43:03

Webpack loader plugin

2022-08-26 08:01:38

DashWebJavaScrip

2023-04-26 12:46:43

DockerSpringKubernetes

2019-08-26 09:25:23

RedisJavaLinux

2021-11-10 11:40:42

數據加解密算法

2011-01-06 10:39:25

.NET程序打包

2009-11-09 14:57:37

WCF上傳文件

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-05-03 15:59:00

黑盒打印機

2021-08-31 10:02:10

KubernetesLinux集群

2018-11-22 09:17:21

消息推送系統

2016-11-01 09:46:04

2021-07-14 09:00:00

JavaFX開發應用

2022-07-22 12:45:39

GNU

2020-05-15 08:07:33

JWT登錄單點

2021-03-12 10:01:24

JavaScript 前端表單驗證
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人天堂网址 | 国产精品久久久久久久久久三级 | 91成人午夜性a一级毛片 | 波多野结衣一区二区三区 | 欧美群妇大交群中文字幕 | 国产一区二区三区在线看 | 久久国产欧美日韩精品 | 国产一区二区小视频 | 久久精品国产一区二区电影 | 日韩中文字幕在线观看 | 黄片毛片免费观看 | 日本不卡一区二区三区 | 91精品久久久久久久久久 | 中国一级特黄真人毛片 | 亚洲毛片 | www.99热.com | 欧美中文一区 | 成人国产午夜在线观看 | 欧美成人h版在线观看 | 日韩喷潮| av色站| 久艹av | 欧美亚洲第一区 | 欧美一区二不卡视频 | 日韩欧美国产精品 | 一级片毛片| 欧美一级黄色网 | 日本又色又爽又黄又高潮 | 欧美黑人国产人伦爽爽爽 | 亚洲综合精品 | 亚洲精品女人久久久 | 最近中文字幕免费 | 国产精品久久午夜夜伦鲁鲁 | 久久99精品久久久久久国产越南 | 久久久久国产 | 91久久久精品国产一区二区蜜臀 | 久久精品视频在线免费观看 | 毛片av免费看 | 亚洲成人精品一区二区 | 亚洲一区成人 | 日韩一区二区三区四区五区六区 |