Vue結合原生js實現自定義元件自動生成
就目前三主流資料驅動框架(vue,ng,react)而言,均具有建立自定義元件的api,但都是必須先做到事先寫好掛載點,這個掛載點可以是原有靜態元素標籤也可以是自定義模板;對於多種元件透過同一資料流生成的,如果事先在頁面上寫好掛載點(mounted),然後透過dom操作去動態新增,會遇到類似這樣一條錯誤提示資訊:Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.(…)。這又是為何呢,下一步該怎麼辦?
原因是任何dom操作的物件必須是符合W3C標準的元素,除非如下所述的,改寫生成html元素物件的原型(HTMLElement.prototype)並註冊自定義元素,從而實現動態生成自定義元件的效果。
不過,大家都明白使用資料驅動框架的初衷就是儘可能避免dom操作,而如下程式碼中還是有一些dom操作的,就目前認知水平而言,感覺這些必要的dom操作還是避免不了的。其它不多說了,直接看程式碼。。。
`
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": "男輔導班"
},
{
"key": "women",
"value": "女"
}
]
},
{
"keyname": "複選",
"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());
}
`
複製程式碼
為了保持程式碼的可維護性及易讀性,我將模板部分單獨放在fuhao-components.js的檔案裡邊,如下所示:
` var textTpl= '
';
var textareaTpl= '
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3549/viewspace-2807413/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Vue3.0實現原生高度可自定義選單元件vue3-menusVue元件
- Flutter 實現webview與原生元件組合滑動FlutterWebView元件
- Vue.js 桌面端自定義滾動條元件|vue美化滾動條VScrollVue.js元件
- QT實現可拖動自定義控制元件QT控制元件
- vue 自定義報警元件Vue元件
- 自定義Mybatis自動生成程式碼規則MyBatis
- Qt實現自定義控制元件QT控制元件
- 利用nodejs寫一個自動生成vue元件檔案的cliNodeJSVue元件
- generatorConfig自動生成實體類以及自定義生成註釋的方法
- vue自定義全域性元件(或自定義外掛)Vue元件
- Spring Boot 自動配置的原理、核心註解以及利用自動配置實現了自定義 Starter 元件Spring Boot元件
- vue自定義表單生成器,可根據json引數動態生成表單VueJSON
- Android自定義控制元件之自定義組合控制元件Android控制元件
- Laravel 實現自定義生成檔案命令Laravel
- 自定義Drawable:實現文字生成圖片
- 自定義DropDownList控制元件的實現控制元件
- 解放生產力,自動化生成vue元件文件Vue元件
- 使用VUE元件建立SpreadJS自定義單元格(二)Vue元件JS
- 使用VUE元件建立SpreadJS自定義單元格(一)Vue元件JS
- vue-自定義指令-實現提示功能Vue
- OpenAPI生成器中實現自定義模板API
- Vue + Element 自定義上傳封面元件Vue元件
- 結合 UI 框架實現可配置 Vue 表單元件淺析UI框架Vue元件
- Vue | 自定義指令和動態路由實現許可權控制Vue路由
- vue原生指令v-model實現自定義樣式の多選與單選Vue
- 基於Vue.js PC桌面端彈出框元件|vue自定義彈層元件|vue模態框Vue.js元件
- 怎麼利用AbstractQueuedSynchronizer實現自定義同步元件?元件
- 自定義TextBox控制元件的實現控制元件
- Android自定義組合控制元件之自定義屬性Android控制元件
- 前端 | 自定義元件 v-model:Vue 如何實現雙向繫結前端元件Vue
- Vue 結合 echarts 原生 html5 實現拖拽排版報表系統VueEchartsHTML
- 在Vue3中實現自定義指令Vue
- 論如何在手機端web前端實現自定義原生控制元件的樣式Web前端控制元件
- 基於 RecyclerView 實現的歌詞滾動自定義控制元件View控制元件
- 原生JS實現二級聯動JS
- 總結Vue第二天:自定義子元件、父子元件通訊、插槽Vue元件
- vue2 - element彈框自定義指令 實現拖動、縮放Vue
- 純js實現 vue 元件 與 vue 單檔案元件對比JSVue元件