摘要:項(xiàng)目介紹旨在通過(guò)項(xiàng)目的形式同時(shí)學(xué)習(xí)和,實(shí)現(xiàn)一個(gè)在線配置頁(yè)面的功能。通過(guò)封裝好的組件樣式提供界面需要的組件,通過(guò)實(shí)現(xiàn)組件狀態(tài)更改及頁(yè)面渲染。
本文是不才在學(xué)習(xí)Vue和Bootstrap過(guò)程中遇到問(wèn)題解決的一些思路,主要描述了項(xiàng)目搭建,組件封裝、獲取、編輯、更新的一步步實(shí)現(xiàn),一些解決方案也沒(méi)找到正確的官方API,還請(qǐng)大拿們多多提點(diǎn)。項(xiàng)目介紹
旨在通過(guò)項(xiàng)目的形式同時(shí)學(xué)習(xí)Vue和Bootstrap,實(shí)現(xiàn)一個(gè)在線配置頁(yè)面的功能。通過(guò)Bootstrap封裝好的組件樣式提供界面需要的組件,通過(guò)Vue實(shí)現(xiàn)組件狀態(tài)更改及頁(yè)面渲染。
項(xiàng)目地址https://github.com/shixia226/bootstrap-vue-designer
項(xiàng)目設(shè)計(jì)
組件模塊區(qū)
提供可用于拖拽到編輯區(qū)的所有組件,分類(lèi)別展示
該功能與本學(xué)習(xí)目的關(guān)聯(lián)不強(qiáng),且其主要拖拽功能比較花時(shí)間,暫且擱置
頁(yè)面編輯區(qū)
提供所有已添加到頁(yè)面的組件的編輯預(yù)覽,并提供組件增,刪,排版,選中功能
增,刪,排版功能可以與模板區(qū)的拖拽功能結(jié)合,同樣暫時(shí)擱置
組件配置區(qū)
提供具體組件內(nèi)部狀態(tài)查看及更改功能
基本的項(xiàng)目搭建,創(chuàng)建index.html, index.js配置好webpack
Vue Demo
module.exports = { entry: "./index.js", output: { filename: "index.js" }, module: { rules: [{ test: /^[^.]+.scss$/, use: [ "style-loader", "css-loader", "sass-loader" ] }, { test: /(.js|.vue)$/, exclude: /(node_modules|bower_components)(?!.*webpack-dev-server)/, loader: "babel-loader", query: { "presets": ["env"] } }] } };
Bootstrap樣式引入
Vue框架引入
運(yùn)行
//node webpack-dev-server --port=9926 //Browser http://localhost:9926/第一個(gè)組件Badage Bootstrap官網(wǎng)例子:
9
組件分析
badge-light 樣式可以替換成badge-primary等,可以設(shè)置成屬性變量用于選擇哪個(gè)顏色;
badge-pill 樣式有和無(wú)表現(xiàn)是不一樣的,可以設(shè)置屬性變量用于控制要不該樣式;
9 文本內(nèi)容作為最終的展示內(nèi)容,可以設(shè)置成屬性變量;
組件名取 widget-badge.
Vue組件封裝Vue.component("widget-badge", {
template: `{{text}}`,
props: ["theme", "pill", "text"]
});
組件展示
html
js
new Vue({ el: ".app" })組件配置
以上步驟后刷新瀏覽器應(yīng)該是可以看到組件效果了,但該組件的所有屬性都是在標(biāo)簽內(nèi)寫(xiě)死的,無(wú)法在編輯頁(yè)面動(dòng)態(tài)設(shè)置
動(dòng)態(tài)屬性vue 中 props 屬性是不允許動(dòng)態(tài)更改的,一般都只能更改 data 中的屬性值,所以需要把 props 中的所有可變屬性拷貝一份到 data 中,且命名上不能相同,所以在此先規(guī)定 data 中的所有屬性都以字母"v"開(kāi)頭;
每個(gè)可變屬性加一個(gè)編輯項(xiàng),對(duì)應(yīng)屬性名name="vpropA", 取值為當(dāng)前屬性值:value="vpropsA",所有的編輯項(xiàng)全部定義屬性 editor 上。
沒(méi)找到對(duì)應(yīng)獲取editor屬性值的API,但通過(guò)分析vue對(duì)象發(fā)現(xiàn)可以通過(guò)vue實(shí)例vm.$options.editor獲取到該定義值,暫且先就這么用著。
組件封裝更改如下:
Vue.component("widget-badge", {
template: `{{vtext}}`,
props: ["theme", "pill", "text"],
editor: `
`,
data() {
return {
vtheme: this.theme || "secondary",
vpill: this.pill,
vtext: this.text || "Badge"
}
}
});
屬性配置面板
點(diǎn)擊不同的組件要展示對(duì)應(yīng)的(不同的)配置面板
根據(jù)點(diǎn)擊元素獲取所屬vue組件vue本來(lái)就是通過(guò)狀態(tài)更新的方式更改dom的,所以很少有dom相關(guān)的api,又只得分析vue實(shí)例里的數(shù)據(jù),發(fā)現(xiàn)$children好像就是直接下級(jí)組件的一個(gè)集合,且$children每一項(xiàng)里都又一個(gè)$el的屬性對(duì)應(yīng)到實(shí)際DOM元素
function getVueCmp(vm, elem) { let pelems = [], $root = vm.$el; while (elem !== $root) { pelems.push(elem); elem = elem.parentNode; } return getVueCmpByPelem(vm, pelems); } function getVueCmpByPelem(vm, pelems) { let $children = vm.$children; if ($children) { for (let i = 0, len = $children.length; i < len; i++) { let vcmp = $children[i], $el = vcmp.$el, idx = pelems.indexOf($el); if (idx !== -1) { pelems.length = idx; return getVueCmpByPelem(vcmp, pelems); } } } return vm; }增加點(diǎn)擊事件
獲取組件實(shí)時(shí)數(shù)據(jù)
根據(jù)前面的數(shù)據(jù)命名規(guī)則直接遍歷$data中所有以字母"v"開(kāi)頭的屬性
function getVueCmpData(vcmp) { if (!vcmp) return {}; let $data = vcmp.$data, data = {}; let names = Object.getOwnPropertyNames($data); for (let i = 0, len = names.length; i < len; i++) { let name = names[i]; if (name.charAt(0) === "v") { data[name.substr(1)] = $data[name]; } } return data; }數(shù)據(jù)更新
在vue根節(jié)點(diǎn)上設(shè)置全局監(jiān)聽(tīng)事件,然后在屬性值中定義$emit方法觸發(fā)該監(jiān)聽(tīng)事件
根節(jié)點(diǎn)設(shè)置監(jiān)聽(tīng)事件,并將監(jiān)聽(tīng)結(jié)果反饋到當(dāng)前選中的組件上
created() { this.$on("changeppt", function(name, value) { if (vcmp) { let names = name.split("."), data = vcmp, len = names.length - 1; for (let i = 0; i < len; i++) { data = data[names[i]]; } data[names[len]] = value; } }) }
封裝編輯器的輸入框?yàn)榻M件如下:
Vue.component("editor-text", { template: ``, props: ["name", "value"], data() { return { vvalue: this.value } } })
更改編輯器配置如下
{ ... /* editor: ` `, */ editor: `vue最終初始化更改如下`, ... }
new Vue({ el: ".app", data: { pptCmp: undefined }, watch: { pptCmp(vcmp) { new Vue({ el: ".ppt", template: "" + (vcmp ? vcmp.$options.editor || "" : "") + "", data() { return getVueCmpData(vcmp, true); }, created() { this.$on("changeppt", function(name, value) { if (vcmp) { let names = name.split("."), data = vcmp, len = names.length - 1; for (let i = 0; i < len; i++) { data = data[names[i]]; } data[names[len]] = value; } }) } }) } }, methods: { showPpt: function(evt) { let elem = evt.target; if (!document.querySelector(".ppt").contains(elem)) { let vcmp = getVueCmp(this, elem); if (vcmp === this.$root) { vcmp = null; } this.pptCmp = vcmp; } } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95544.html
摘要:項(xiàng)目介紹旨在通過(guò)項(xiàng)目的形式同時(shí)學(xué)習(xí)和,實(shí)現(xiàn)一個(gè)在線配置頁(yè)面的功能。通過(guò)封裝好的組件樣式提供界面需要的組件,通過(guò)實(shí)現(xiàn)組件狀態(tài)更改及頁(yè)面渲染。 本文是不才在學(xué)習(xí)Vue和Bootstrap過(guò)程中遇到問(wèn)題解決的一些思路,主要描述了項(xiàng)目搭建,組件封裝、獲取、編輯、更新的一步步實(shí)現(xiàn),一些解決方案也沒(méi)找到正確的官方API,還請(qǐng)大拿們多多提點(diǎn)。 項(xiàng)目介紹 旨在通過(guò)項(xiàng)目的形式同時(shí)學(xué)習(xí)Vue和Bootst...
摘要:具名插槽適用于具有一定結(jié)構(gòu)且有多處不固定內(nèi)容的組件此時(shí)在定義組件時(shí)其實(shí)就是預(yù)留了多個(gè)空缺位置且分別命名如果只有一個(gè)當(dāng)然也可以采用具名插槽,但肯定不如默認(rèn)插槽,只會(huì)徒增配置成本。然后在使用時(shí)將內(nèi)容分成多塊分別命名成預(yù)留空缺位置的名字。 本文主要描述不才在學(xué)習(xí)Vue和Bootstrap中遇到的關(guān)于插槽的問(wèn)題及解決方案 插槽理解 vue官網(wǎng)和很多熱心朋友又很多關(guān)于默認(rèn)插槽,具名插槽,插槽作用...
摘要:具名插槽適用于具有一定結(jié)構(gòu)且有多處不固定內(nèi)容的組件此時(shí)在定義組件時(shí)其實(shí)就是預(yù)留了多個(gè)空缺位置且分別命名如果只有一個(gè)當(dāng)然也可以采用具名插槽,但肯定不如默認(rèn)插槽,只會(huì)徒增配置成本。然后在使用時(shí)將內(nèi)容分成多塊分別命名成預(yù)留空缺位置的名字。 本文主要描述不才在學(xué)習(xí)Vue和Bootstrap中遇到的關(guān)于插槽的問(wèn)題及解決方案 插槽理解 vue官網(wǎng)和很多熱心朋友又很多關(guān)于默認(rèn)插槽,具名插槽,插槽作用...
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒(méi)想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
摘要:中文官網(wǎng)英文官網(wǎng)組織發(fā)出一個(gè)問(wèn)題之后,不要暫時(shí)的離開(kāi)電腦,如果沒(méi)有把握先不要提問(wèn)。珍惜每一次提問(wèn),感恩每一次反饋,每個(gè)人工作還是業(yè)余之外抽出的時(shí)間有限,充分準(zhǔn)備好應(yīng)有的資源之后再發(fā)問(wèn),有利于問(wèn)題能夠高效質(zhì)量地得到解決。 Vue.js資源分享 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/maid...
閱讀 1178·2021-09-10 10:51
閱讀 909·2019-08-30 15:53
閱讀 2735·2019-08-30 12:50
閱讀 986·2019-08-30 11:07
閱讀 1998·2019-08-30 10:50
閱讀 3607·2019-08-29 18:47
閱讀 1319·2019-08-29 18:44
閱讀 1607·2019-08-29 17:01