最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue結(jié)合原生js實現(xiàn)自定義組件自動生成示例

 更新時間:2017年01月21日 15:30:37   作者:frankly-26  
這篇文章主要介紹了Vue結(jié)合原生js實現(xiàn)自定義組件自動生成示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

就目前三大前端主流數(shù)據(jù)驅(qū)動框架(vue,ng,react)而言,均具有創(chuàng)建自定義組件的api,但都是必須先做到事先寫好掛載點,這個掛載點可以是原有靜態(tài)元素標(biāo)簽也可以是自定義模板;對于多種組件通過同一數(shù)據(jù)流生成的,如果事先在頁面上寫好掛載點(mounted),然后通過dom操作去動態(tài)添加,會遇到類似這樣一條錯誤提示信息:Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.(…)。這又是為何呢,下一步該怎么辦?

原因是任何dom操作的對象必須是符合W3C標(biāo)準(zhǔn)的元素,除非如下所述的,改寫生成html元素對象的原型(HTMLElement.prototype)并注冊自定義元素,從而實現(xiàn)動態(tài)生成自定義組件的效果。

不過,大家都明白使用數(shù)據(jù)驅(qū)動框架的初衷就是盡可能避免dom操作,而如下代碼中還是有一些dom操作的,就目前認(rèn)知水平而言,感覺這些必要的dom操作還是避免不了的。其它不多說了,直接看代碼。。。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="Content-type" content="text/html,charset=utf-8"/>
  <meta http-equiv="X-UA-Compatible" content="IE-edge">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <link href="css/mui.min.css" rel="stylesheet">
  <link href="css/app.css" rel="stylesheet">
  <script src="js/vue.js" type="text/javascript"></script>
</head>
<body>
<div id="main" class="mui-content">
</div>
</body>
<script src="js/fuhao-components.js" type="text/javascript"></script>

<script>

  var jsonData = [
    {
      "keyname": "姓名鄂然失色而熱重重中之重重中之重雜志的熱熱",
      "type": "text",
      "key": "name11"
    }, {
      "value": "姓名鄂之重雜志的熱熱",
      "key": "name11"
    }, {
      "keyname": "姓名鄂然失色而熱熱熱熱是重中之重重中之重重中之重雜志的熱熱",
    },
    {
      "keyname": "姓名鄂然失色而熱熱熱熱是重中之重重中之重重中之重雜志的熱熱",
      "type": "textarea",
      "key": "name"
    },
    {
      "keyname": "性別",
      "type": "radio",
      "key": "sex",
      "values": [
        {
          "key": "man",
          "value": "男輔導(dǎo)班"
        },
        {
          "key": "women",
          "value": "女"
        }
      ]
    },
    {
      "keyname": "復(fù)選",
      "type": "checkbox",
      "key": "checkbox",
      "values": [
        {
          "key": "man",
          "value": "男"
        },
        {
          "key": "women",
          "value": "女"
        }
      ]
    },
    {
      "keyname": "類型",
      "type": "select",
      "key": "type1",
      "values": [
        {
          "key": "type1",
          "value": "類型1"
        },
        {
          "key": "type2",
          "value": "類型2"
        },
        {
          "key": "type3",
          "value": "類型3"
        },
        {
          "key": "type4",
          "value": "類型4"
        }
      ]
    },
    {
      "keyname": "定位",
      "type": "gps",
      "key": "btn",
      "value": "地圖獲取定位"
    },
    {
      "keyname": "拍照",
      "type": "photo",
      "key": "btn",
      "value": "拍照"
    }
  ];
  (function () {
    AnalyJson(jsonData);
  })();
  function AnalyJson(data) {
    if ('id' in data) {
      arguments.callee(data.values);
    } else {
      if ('name' in data) {
        htmlname = data.name;
        CreateInputViewer(data.name);
        arguments.callee(data.values);
      } else {
        if ('type' in data) {
          CreateInputViewer(data);
        } else {
          for (var p in data) {
            CreateInputViewer(data[p]);
          }
        }
      }
    }
  }
  function CreateInputViewer(data) {
    switch (data.type) {
      case 'text': {
        fh_C(data, 'c-input-text' + '-' + data.key, 'fhInputText', textTpl);
        break;
      }
      case 'textarea': {
        fh_C(data, 'c-textarea' + '-' + data.key, 'fhInputTextarea', textareaTpl);
        break;
      }
      case 'radio': {
        fh_C(data, 'c-input-radio' + '-' + data.key, 'fhInputTextarea', radioTpl);
        break;
      }
      case 'checkbox': {
        fh_C(data, 'c-input-checkbox' + '-' + data.key, 'fhInputCheckbox', checkboxTpl);
        break;
      }
      case 'select': {
        fh_C(data, 'c-select' + '-' + data.key, 'fhSelect', selectTpl);
        break;
      }
      case 'photo': {
        fh_C(data, 'c-photo' + '-' + data.key, 'fhPhoto', photoTpl);
        break;
      }
      case 'gps': {
        fh_C(data, 'c-gps' + '-' + data.key, 'fhGPS', gpsTpl);
        break;
      }
      default: {
        fh_C(data, 'c-default' + '-' + data.key, 'fhInputDefault', defaultTpl);
        break;
      }

    }
  }
  function fh_C(d, c, cn, tpl) {
    console.log(d);
    Vue.component(c, {
      template: tpl,
//       props:['key','keyname','values','value'],
      data: function () {
        return d
      }
    });
    new Vue({
      el: '.mui-content',
      components: {
        cn: cn
      },
    });
    var MyElementProto = Object.create(HTMLElement.prototype);
    MyElementProto.createdCallback = function () {
      this.innerHTML = tpl
    };
    var MyComponent = document.registerElement(c, {prototype: MyElementProto});
    document.querySelector('.mui-content').appendChild(new MyComponent());
  }
</script>
</html>

為了保持代碼的可維護(hù)性及易讀性,我將模板部分單獨放在fuhao-components.js的文件里邊,如下所示:

var textTpl='';
<div class="mui-content-padded">
  <input :type="type" :name="key" :placeholder="keyname" >
</div>
  
var textareaTpl= '';
<div class="mui-content-padded ">
  <textarea rows="5" :placeholder="keyname"> 
  </textarea>
</div>
  
var radioTpl= '';
<form class="mui-input-group mui-content-padded">
    <div class="mui-input-row mui-radio mui-left"v-for="value in values">
      <label>{{value.key}}</label>
      <input :name="key" :type="type" :value="key">
    </div>
</form>
var checkboxTpl= '';
<form class="mui-input-group mui-content-padded">
    <div class="mui-input-row mui-checkbox mui-left"v-for="value in values">
      <label>{{value.key}}</label>
      <input :name="key" :type="type" :value="key">
    </div>
</form>
var selectTpl= '';
  <div class="mui-content-padded">
  <h5 class="mui-content-padded" v-text="keyname"></h5>
    <select class="mui-btn mui-btn-block " :name="key">
      <option value="key" v-text="value.key" v-for="value in values">{{value.key}}</option>
    </select>
  </div>

var photoTpl= '';
<div class="mui-content-padded">
  <span v-text="keyname"></span>
  <button :name="key" onclick="takePhoto(this.name)" class="mui-btn mui-btn-primary">拍照</button> 
  <img :id="key" height="70" width="100" class="img-rounded">
</div>
  
var gpsTpl='';
<div class="mui-content col-xs-12">
  <button class="mui-btn mui-btn-primary" :id="key" onclick="takeLocation(this.id)">
  獲取定位
  </button>
</div>
  
var defaultTpl= '';
<div class="mui-content-padded " v-if="key">
  <ul class="mui-table-view">
    <li class="mui-table-view-cell mui-media">
      <span class="fuhaoKey" v-text="key"></span>
      <span class="fuhaoValue" v-text="value"></span>
    </li>
  </ul >
</div>

最終渲染效果如下:

鑒于vue結(jié)合dom操作動態(tài)生成自定義組件,控制臺會報一定的錯誤這一點bug還在努力修復(fù)中,可能需要更加深入地了解vue數(shù)據(jù)綁定及傳遞機制與js動態(tài)注冊自定義組件的深入領(lǐng)會,繼續(xù)努力中。。。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • VUE Error: getaddrinfo ENOTFOUND localhost

    VUE Error: getaddrinfo ENOTFOUND localhost

    這篇文章主要介紹了VUE Error: getaddrinfo ENOTFOUND localhost,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • vue3+ts代理的使用

    vue3+ts代理的使用

    本文主要介紹了vue3+ts代理的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • vue2.0中vue-cli實現(xiàn)全選、單選計算總價格的實例代碼

    vue2.0中vue-cli實現(xiàn)全選、單選計算總價格的實例代碼

    本篇文章主要介紹了vue2.0中vue-cli實現(xiàn)全選、單選計算總價格的實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • element table組件內(nèi)容換行的實現(xiàn)方案

    element table組件內(nèi)容換行的實現(xiàn)方案

    這篇文章主要介紹了element table組件內(nèi)容換行的實現(xiàn)方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 從零開始用webpack構(gòu)建一個vue3.0項目工程的實現(xiàn)

    從零開始用webpack構(gòu)建一個vue3.0項目工程的實現(xiàn)

    這篇文章主要介紹了從零開始用webpack構(gòu)建一個vue3.0項目工程的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • webpack4打包vue前端多頁面項目

    webpack4打包vue前端多頁面項目

    這篇文章主要介紹了webpack4打包vue前端多頁面項目的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • vue?+?ele?實現(xiàn)下拉選擇框和下拉多選選擇框處理方案

    vue?+?ele?實現(xiàn)下拉選擇框和下拉多選選擇框處理方案

    這篇文章主要介紹了vue?+?ele?實現(xiàn)下拉選擇框和下拉多選選擇框處理方案,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 詳解Vuejs2.0之異步跨域請求

    詳解Vuejs2.0之異步跨域請求

    這篇文章主要介紹了詳解Vuejs2.0之異步跨域請求,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • vue單頁面SEO優(yōu)化的實現(xiàn)

    vue單頁面SEO優(yōu)化的實現(xiàn)

    本文主要介紹了vue單頁面SEO優(yōu)化的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • vue.config.js里面的devserver如何配置

    vue.config.js里面的devserver如何配置

    本文介紹了vue.config.js中devServer的常見配置方式,包括基本配置、代理配置、熱模塊替換、靜態(tài)資源服務(wù)、HTTPS配置、多代理配置以及其他配置項,幫助開發(fā)者根據(jù)項目需求進(jìn)行定制
    2025-01-01

最新評論

筠连县| 方山县| 海门市| 大姚县| 石泉县| 临高县| 临朐县| 西城区| 胶州市| 商丘市| 南昌市| 河北区| 屏南县| 旬邑县| 海城市| 重庆市| 溧阳市| 华池县| 农安县| 嘉祥县| 兴山县| 沈阳市| 遂平县| 青浦区| 河东区| 印江| 静宁县| 库尔勒市| 板桥市| 兰坪| 云阳县| 杂多县| 当雄县| 茌平县| 鄂托克前旗| 会理县| 长泰县| 新绛县| 瓮安县| 桃源县| 来宾市|