成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Vue & Bootstrap 結(jié)合學(xué)習(xí)筆記(一)

hyuan / 742人閱讀

摘要:項(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)目搭建

基本的項(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

相關(guān)文章

  • Vue &amp; Bootstrap 結(jié)合學(xué)習(xí)筆記

    摘要:項(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...

    魏憲會(huì) 評(píng)論0 收藏0
  • Vue &amp; Bootstrap 結(jié)合學(xué)習(xí)筆記(二)

    摘要:具名插槽適用于具有一定結(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)插槽,具名插槽,插槽作用...

    Shonim 評(píng)論0 收藏0
  • Vue &amp; Bootstrap 結(jié)合學(xué)習(xí)筆記(二)

    摘要:具名插槽適用于具有一定結(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)插槽,具名插槽,插槽作用...

    Karrdy 評(píng)論0 收藏0
  • 前端資源系列(4)-前端學(xué)習(xí)資源分享&amp;前端面試資源匯總

    摘要:特意對(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ì)不定期更...

    princekin 評(píng)論0 收藏0
  • Vue.js資源分享

    摘要:中文官網(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...

    vpants 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<