zoukankan      html  css  js  c++  java
  • Vue 自动加载vue文件,style怎么办

    书接上上会,因为当时也没想好怎么办,所以装聋作哑的忽略了Vue文件中的Style,Vue的做法我看着晕乎乎的,细想的话,无非就是自动填写到dom中,所担心的无非是命名冲突。

    在一个项目中(像我这种自娱自乐的项目中)加载的自定义组件是不会重名的(应该不会吧,反正就是让他不会的意思),那就每个Vue中加组件名做前缀,然后duang,写入dom。

    规规矩矩的放在head里,齐活了

    更新一下我那个牛逼的文件

    // vue插件引入
    Vue.use({
        // 插件初始化函数
        install: function(Vue, options) {
            Vue.CptsLoader = {
                isSaveTemplateToLocalStorage: false,
                ProjectVersion: "1.0.0.0",
                checkVersion: function() {
                    var ver = localStorage.getItem(window.location.href + 'ProjectVersion')
                    if(!ver || this.ProjectVersion !== ver) {
                        localStorage.clear()
                        localStorage.setItem(window.location.href + 'ProjectVersion', this.ProjectVersion)
                    }
                }
            }
            // 包装new Vue()
            Vue.create = function(options) {
                Vue.CptsLoader.checkVersion()
                // 加载options的components
                importCpts(options)
                var vm = new Vue(options)
                Vue.http.options.emulateJSON = true
                return vm
            }
            Vue.loadvue = function(options) {
                return loadVue(options)
            }
            //加载options的components
            importCpts = function(options) {
                //缓存components
                var cpts = options.components
                if(cpts !== null){ 
                    //判断存在components列表并且是数组
                    if(Array.isArray(cpts)) {                    
                        //建立一个缓存空对象
                        var tmpcpts = null
                        //循环加载每一项组件
                        cpts.forEach((cptname) => {
                            //加载Vue文件
                            var newCpt = loadVue(cptname)
        
                            if(newCpt) {
                                if(!tmpcpts)
                                    tmpcpts = {}
                                tmpcpts[newCpt.name] = newCpt
                            }
                        })
                        //回填到options
                        options.components = tmpcpts    
                    }
                }
            }            
        
            loadVue = function(name) {
                //生成路径
                var url = window.location.href + name + ".vue"
                //读取本地存储
                var content = Vue.CptsLoader.isSaveTemplateToLocalStorage ? localStorage.getItem(url) : null
                if(!content) {
                    RequestVue(url, (res) => {
                        content = res
                    })
                }
                //读取失败,返回空
                if(!content) return null
    
                Vue.CptsLoader.isSaveTemplateToLocalStorage && localStorage.setItem(url, content)
    
                //读取成功,解析
                
                //获取script
                var options = eval("(" + GetTagcontent('script', content) + ")")
                
                //嵌套调用加载子组件
                options && options.components && importCpts(options)
    
                var temp = GetTagcontent('template', content)
    
                //加载css
                var css = GetTagcontent('style',content)
                
                if(css.trim().length>0 && !document.getElementById(options.name + "-style")){
                    var newstyle = document.createElement('style')
                    newstyle.id = options.name + "-style"
                    newstyle.innerHTML =  css 
                    document.head.appendChild(newstyle)
                }
                
                //加载模板
                options.template = temp 
    
                return options
            }
            
            GetTagcontent = function(tag, content) {
                var reg = new RegExp("<" + tag + ">([\s\S]*)</" + tag + ">")
                if(reg.test(content)) {
                    return RegExp.$1
                }
                return ""
            }
    
            RequestVue = function(url, cb) {
                var request = new XMLHttpRequest()
                request.open('GET', url, false)
                request.send(null)
                request.status === 200 && cb(request.responseText)
            }
        }
    })
  • 相关阅读:
    ABC065D Built[最小生成树]
    loj2718 「NOI2018」归程[Kruskal重构树+最短路]
    BZOJ1821 部落划分[最小生成树]
    BZOJ4777 [Usaco2017 Open]Switch Grass[最小生成树+权值线段树套平衡树]
    CF888G Xor-MST[最小生成树+01trie]
    Atcoder CODE FESTIVAL 2016 Final G
    BZOJ4883 [Lydsy1705月赛]棋盘上的守卫[最小基环树森林]
    BZOJ3714 [PA2014]Kuglarz[最小生成树]
    BZOJ1601 [Usaco2008 Oct]灌水[最小生成树]
    CF892E Envy[最小生成树]
  • 原文地址:https://www.cnblogs.com/allofalan/p/9941853.html
Copyright © 2011-2022 走看看