中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

html頁面引入vue組件之http-vue-loader.js方法怎么用

發布時間:2023-04-26 15:39:27 來源:億速云 閱讀:151 作者:iii 欄目:開發技術

這篇文章主要講解了“html頁面引入vue組件之http-vue-loader.js方法怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“html頁面引入vue組件之http-vue-loader.js方法怎么用”吧!

    html頁面引入vue組件之http-vue-loader.js

    首先這種方法不推薦,日常工作中也不會在html里面引入一個vue文件,只是為了有時候方便測試才會這么做

    1.創建my-component.vue

    <template>
        <div class="hello">Hello {{who}}</div>
    </template>
     
    <script>
    module.exports = {
        data: function() {
            return {
                who: 'world'
            }
        }
    }
    </script>
     
    <style>
    .hello {
        background-color: #ffe;
    }
    </style>

    2.創建index.html

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="UTF-8">
        <!-- 引入樣式 -->
        <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel="external nofollow" >
        <!-- 先引入 Vue -->
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
        <!-- 引入 http-vue-loader -->
        <script src="https://unpkg.com/http-vue-loader"></script>
    </head>
    
    <body>
        <div id="app">
            <my-component></my-component>
        </div>
    </body>
    
    <!-- 引入組件庫 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script>
        // 使用httpVueLoader
        Vue.use(httpVueLoader);
        new Vue({
            el: '#app',
            data: function () {
                return { visible: false }
            },
            components: {
                // 將組建加入組建庫
                'my-component': 'url:./component/my-component.vue'
            }
        })
    </script>
    
    </html>

    這樣就可以直接在html頁面里面引用vue文件,而不需要從頭開始創建一個新的vue項目,方便日常測試使用

    httpVueLoader的其他組件載入方式可查看這里

    單頁面vue項目注冊使用組件(使用httpVueloader)

    主要是最近寫的項目涉及到,就順便記錄一下,

    使用的概率不是很大啊畢竟現在大部分都是直接搭的項目組件正常方式使用組件即可

    安裝并引入插件插件

    既然是單頁面使用,最簡單快捷的就是直接script引用了,這里我就直接把文件放出來自取好了,今天百度網盤有點卡分享不出來,文件又比較長,就放文章最末尾吧

    <script src="./lib/httpVueLoader.js" type="text/javascript" charset="utf-8"></script>

    準備組件

    隨便畫個組件反正也就測試用用

    <template>
        <div class="test">
            <p>{{name}}</p>
            <p>{{state}}</p>
        </div>
    </template>
     
    <script>
        module.exports = {
            name:'test',
            data(){
                return{
                    name:222
                }
            },
            props:{
                state:{
                    type:String
                }
            }
        }
    </script>
     
    <style>
    </style>

    引用

    引用方法有好幾種 這里我就拿我用的來舉例吧,直接上父組件代碼,首先是html頁面

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta name="renderer" content="webkit|ie-comp|ie-stand">
            <title></title>
            <link rel="stylesheet" type="text/css" href="PCdemo/src/js&css/mainPage.css" rel="external nofollow"  />
        </head>
        <body>
            <!-- 容器 -->
            <div id="mainpage">
              <p>這是父組件頁面</p>
             <!--組件測試 -->
                <test></test>
            </div>
     
     
            <!-- vue2.6.11 -->
            <script src="./lib/vue.js"></script>
            <!-- 組件測試 -->
    <script src="./lib/httpVueLoader.js" type="text/javascript" charset="utf-8"></script>
            <!-- 自定義js -->
            <script src="PCdemo/src/js&css/mainPage.js" type="text/javascript" charset="utf-8"></script>
        </body>
    </html>

    然后是js頁面,當然全寫一個html也行啊看個人喜好,這里因為項目需求兼容ie,所以寫的比較原始

    var appVue = new Vue({
        el: "#mainpage",
        components:{
            'test': httpVueLoader('../PCdemo/src/components/test.vue')
        },
        data: function() {
            return {
                state:'1111'
            }
        }
    })

    那么效果就完成了

    html頁面引入vue組件之http-vue-loader.js方法怎么用

    插件的其他注冊使用組件方法

    組件官網 還提供了其他注冊引入方法,講的比較細致啊這里就不贅述了 有興趣可以自己去看看

    插件js文件

    (function umd(root,factory){
    	if(typeof module==='object' && typeof exports === 'object' )
    		module.exports=factory()
    	else if(typeof define==='function' && define.amd)
    		define([],factory)
    	else
    		root.httpVueLoader=factory()
    })(this,function factory() {
    	'use strict';
     
    	var scopeIndex = 0;
     
    	StyleContext.prototype = {
     
    		withBase: function(callback) {
     
    			var tmpBaseElt;
    			if ( this.component.baseURI ) {
     
    				// firefox and chrome need the <base> to be set while inserting or modifying <style> in a document.
    				tmpBaseElt = document.createElement('base');
    				tmpBaseElt.href = this.component.baseURI;
     
    				var headElt = this.component.getHead();
    				headElt.insertBefore(tmpBaseElt, headElt.firstChild);
    			}
     
    			callback.call(this);
     
    			if ( tmpBaseElt )
    				this.component.getHead().removeChild(tmpBaseElt);
    		},
     
    		scopeStyles: function(styleElt, scopeName) {
     
    			function process() {
     
    				var sheet = styleElt.sheet;
    				var rules = sheet.cssRules;
     
    				for ( var i = 0; i < rules.length; ++i ) {
     
    					var rule = rules[i];
    					if ( rule.type !== 1 )
    						continue;
     
    					var scopedSelectors = [];
     
    					rule.selectorText.split(/\s*,\s*/).forEach(function(sel) {
     
    						scopedSelectors.push(scopeName+' '+sel);
    						var segments = sel.match(/([^ :]+)(.+)?/);
    						scopedSelectors.push(segments[1] + scopeName + (segments[2]||''));
    					});
     
    					var scopedRule = scopedSelectors.join(',') + rule.cssText.substr(rule.selectorText.length);
    					sheet.deleteRule(i);
    					sheet.insertRule(scopedRule, i);
    				}
    			}
     
    			try {
    				// firefox may fail sheet.cssRules with InvalidAccessError
    				process();
    			} catch (ex) {
     
    				if ( ex instanceof DOMException && ex.code === DOMException.INVALID_ACCESS_ERR ) {
     
    					styleElt.sheet.disabled = true;
    					styleElt.addEventListener('load', function onStyleLoaded() {
     
    						styleElt.removeEventListener('load', onStyleLoaded);
     
    						// firefox need this timeout otherwise we have to use document.importNode(style, true)
    						setTimeout(function() {
     
    							process();
    							styleElt.sheet.disabled = false;
    						});
    					});
    					return;
    				}
     
    				throw ex;
    			}
    		},
     
    		compile: function() {
     
    			var hasTemplate = this.template !== null;
     
    			var scoped = this.elt.hasAttribute('scoped');
     
    			if ( scoped ) {
     
    				// no template, no scopable style needed
    				if ( !hasTemplate )
    					return;
     
    				// firefox does not tolerate this attribute
    				this.elt.removeAttribute('scoped');
    			}
     
    			this.withBase(function() {
     
    				this.component.getHead().appendChild(this.elt);
    			});
     
    			if ( scoped )
    				this.scopeStyles(this.elt, '['+this.component.getScopeId()+']');
     
    			return Promise.resolve();
    		},
     
    		getContent: function() {
     
    			return this.elt.textContent;
    		},
     
    		setContent: function(content) {
     
    			this.withBase(function() {
     
    				this.elt.textContent = content;
    			});
    		}
    	};
     
    	function StyleContext(component, elt) {
     
    		this.component = component;
    		this.elt = elt;
    	}
     
     
    	ScriptContext.prototype = {
     
    		getContent: function() {
     
    			return this.elt.textContent;
    		},
     
    		setContent: function(content) {
     
    			this.elt.textContent = content;
    		},
     
    		compile: function(module) {
     
    			var childModuleRequire = function(childURL) {
     
    				return httpVueLoader.require(resolveURL(this.component.baseURI, childURL));
    			}.bind(this);
     
    			var childLoader = function(childURL, childName) {
     
    				return httpVueLoader(resolveURL(this.component.baseURI, childURL), childName);
    			}.bind(this);
     
    			try {
    				Function('exports', 'require', 'httpVueLoader', 'module', this.getContent()).call(this.module.exports, this.module.exports, childModuleRequire, childLoader, this.module);
    			} catch(ex) {
     
    				if ( !('lineNumber' in ex) ) {
     
    					return Promise.reject(ex);
    				}
    				var vueFileData = responseText.replace(/\r?\n/g, '\n');
    				var lineNumber = vueFileData.substr(0, vueFileData.indexOf(script)).split('\n').length + ex.lineNumber - 1;
    				throw new (ex.constructor)(ex.message, url, lineNumber);
    			}
     
    			return Promise.resolve(this.module.exports)
    			.then(httpVueLoader.scriptExportsHandler.bind(this))
    			.then(function(exports) {
     
    				this.module.exports = exports;
    			}.bind(this));
    		}
    	};
     
    	function ScriptContext(component, elt) {
     
    		this.component = component;
    		this.elt = elt;
    		this.module = { exports:{} };
    	}
     
     
    	TemplateContext.prototype = {
     
    		getContent: function() {
     
    			return this.elt.innerHTML;
    		},
     
    		setContent: function(content) {
     
    			this.elt.innerHTML = content;
    		},
     
    		getRootElt: function() {
     
    			var tplElt = this.elt.content || this.elt;
     
    			if ( 'firstElementChild' in tplElt )
    				return tplElt.firstElementChild;
     
    			for ( tplElt = tplElt.firstChild; tplElt !== null; tplElt = tplElt.nextSibling )
    				if ( tplElt.nodeType === Node.ELEMENT_NODE )
    					return tplElt;
     
    			return null;
    		},
     
    		compile: function() {
     
    			return Promise.resolve();
    		}
    	};
     
    	function TemplateContext(component, elt) {
     
    		this.component = component;
    		this.elt = elt;
    	}
     
     
     
    	Component.prototype = {
     
    		getHead: function() {
     
    			return document.head || document.getElementsByTagName('head')[0];
    		},
     
    		getScopeId: function() {
     
    			if ( this._scopeId === '' ) {
     
    				this._scopeId = 'data-s-' + (scopeIndex++).toString(36);
    				this.template.getRootElt().setAttribute(this._scopeId, '');
    			}
    			return this._scopeId;
    		},
     
    		load: function(componentURL) {
     
    			return httpVueLoader.httpRequest(componentURL)
    			.then(function(responseText) {
     
    				this.baseURI = componentURL.substr(0, componentURL.lastIndexOf('/')+1);
    				var doc = document.implementation.createHTMLDocument('');
     
    				// IE requires the <base> to come with <style>
    				doc.body.innerHTML = (this.baseURI ? '<base href="'+this.baseURI+'" rel="external nofollow" >' : '') + responseText;
     
    				for ( var it = doc.body.firstChild; it; it = it.nextSibling ) {
     
    					switch ( it.nodeName ) {
    						case 'TEMPLATE':
    							this.template = new TemplateContext(this, it);
    							break;
    						case 'SCRIPT':
    							this.script = new ScriptContext(this, it);
    							break;
    						case 'STYLE':
    							this.styles.push(new StyleContext(this, it));
    							break;
    					}
    				}
     
    				return this;
    			}.bind(this));
    		},
     
    		_normalizeSection: function(eltCx) {
     
    			var p;
     
    			if ( eltCx === null || !eltCx.elt.hasAttribute('src') ) {
     
    				p = Promise.resolve(null);
    			} else {
     
    				p = httpVueLoader.httpRequest(eltCx.elt.getAttribute('src'))
    				.then(function(content) {
     
    					eltCx.elt.removeAttribute('src');
    					return content;
    				});
    			}
     
    			return p
    			.then(function(content) {
     
    				if ( eltCx !== null && eltCx.elt.hasAttribute('lang') ) {
     
    					var lang = eltCx.elt.getAttribute('lang');
    					eltCx.elt.removeAttribute('lang');
    					return httpVueLoader.langProcessor[lang.toLowerCase()].call(this, content === null ? eltCx.getContent() : content);
    				}
    				return content;
    			}.bind(this))
    			.then(function(content) {
     
    				if ( content !== null )
    					eltCx.setContent(content);
    			});
    		},
     
    		normalize: function() {
     
    			return Promise.all(Array.prototype.concat(
    				this._normalizeSection(this.template),
    				this._normalizeSection(this.script),
    				this.styles.map(this._normalizeSection)
    			))
    			.then(function() {
     
    				return this;
    			}.bind(this));
    		},
     
    		compile: function() {
     
    			return Promise.all(Array.prototype.concat(
    				this.template && this.template.compile(),
    				this.script && this.script.compile(),
    				this.styles.map(function(style) { return style.compile(); })
    			))
    			.then(function() {
     
    				return this;
    			}.bind(this));
    		}
    	};
     
    	function Component(name) {
     
    		this.name = name;
    		this.template = null;
    		this.script = null;
    		this.styles = [];
    		this._scopeId = '';
    	}
     
    	function identity(value) {
     
    		return value;
    	}
     
    	function parseComponentURL(url) {
     
    		var comp = url.match(/(.*?)([^/]+?)\/?(\.vue)?(\?.*|#.*|$)/);
    		return {
    			name: comp[2],
    			url: comp[1] + comp[2] + (comp[3] === undefined ? '/index.vue' : comp[3]) + comp[4]
    		};
    	}
     
    	function resolveURL(baseURL, url) {
     
    		if (url.substr(0, 2) === './' || url.substr(0, 3) === '../') {
    			return baseURL + url;
    		}
    		return url;
    	}
     
     
    	httpVueLoader.load = function(url, name) {
     
    		return function() {
     
    			return new Component(name).load(url)
    			.then(function(component) {
     
    				return component.normalize();
    			})
    			.then(function(component) {
     
    				return component.compile();
    			})
    			.then(function(component) {
     
    				var exports = component.script !== null ? component.script.module.exports : {};
     
    				if ( component.template !== null )
    					exports.template = component.template.getContent();
     
    				if ( exports.name === undefined )
    					if ( component.name !== undefined )
    						exports.name = component.name;
     
    				exports._baseURI = component.baseURI;
     
    				return exports;
    			});
    		};
    	};
     
     
    	httpVueLoader.register = function(Vue, url) {
     
    		var comp = parseComponentURL(url);
    		Vue.component(comp.name, httpVueLoader.load(comp.url));
    	};
     
    	httpVueLoader.install = function(Vue) {
     
    		Vue.mixin({
     
    			beforeCreate: function () {
     
    				var components = this.$options.components;
     
    				for ( var componentName in components ) {
     
    					if ( typeof(components[componentName]) === 'string' && components[componentName].substr(0, 4) === 'url:' ) {
     
    						var comp = parseComponentURL(components[componentName].substr(4));
     
    						var componentURL = ('_baseURI' in this.$options) ? resolveURL(this.$options._baseURI, comp.url) : comp.url;
     
    						if ( isNaN(componentName) )
    							components[componentName] = httpVueLoader.load(componentURL, componentName);
    						else
    							components[componentName] = Vue.component(comp.name, httpVueLoader.load(componentURL, comp.name));
    					}
    				}
    			}
    		});
    	};
     
    	httpVueLoader.require = function(moduleName) {
     
    		return window[moduleName];
    	};
     
    	httpVueLoader.httpRequest = function(url) {
     
    		return new Promise(function(resolve, reject) {
     
    			var xhr = new XMLHttpRequest();
    			xhr.open('GET', url);
                		xhr.responseType = 'text';
     
    			xhr.onreadystatechange = function() {
     
    				if ( xhr.readyState === 4 ) {
     
    					if ( xhr.status >= 200 && xhr.status < 300 )
    						resolve(xhr.responseText);
    					else
    						reject(xhr.status);
    				}
    			};
     
    			xhr.send(null);
    		});
    	};
     
    	httpVueLoader.langProcessor = {
    		html: identity,
    		js: identity,
    		css: identity
    	};
     
    	httpVueLoader.scriptExportsHandler = identity;
     
    	function httpVueLoader(url, name) {
     
    		var comp = parseComponentURL(url);
    		return httpVueLoader.load(comp.url, name);
    	}
     
    	return httpVueLoader;
    });

    感謝各位的閱讀,以上就是“html頁面引入vue組件之http-vue-loader.js方法怎么用”的內容了,經過本文的學習后,相信大家對html頁面引入vue組件之http-vue-loader.js方法怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    综艺| 保康县| 绩溪县| 黄冈市| 静安区| 弥渡县| 松滋市| 娱乐| 德州市| 西城区| 沙坪坝区| 阿鲁科尔沁旗| 西藏| 鄂托克前旗| 英超| 朝阳县| 淮阳县| 易门县| 阿克| 五家渠市| 延吉市| 鄱阳县| 芜湖市| 砀山县| 云梦县| 浙江省| 珲春市| 赤峰市| 香港| 临洮县| 澄江县| 资源县| 东阳市| 尼勒克县| 灵山县| 沧州市| 金堂县| 抚松县| 南木林县| 辽阳县| 老河口市|