您好,登錄后才能下訂單哦!
這篇文章主要講解了“html頁面引入vue組件之http-vue-loader.js方法怎么用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“html頁面引入vue組件之http-vue-loader.js方法怎么用”吧!
首先這種方法不推薦,日常工作中也不會在html里面引入一個vue文件,只是為了有時候方便測試才會這么做
1.創(chuàng)建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.創(chuàng)建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文件,而不需要從頭開始創(chuàng)建一個新的vue項目,方便日常測試使用
httpVueLoader的其他組件載入方式可查看這里
主要是最近寫的項目涉及到,就順便記錄一下,
使用的概率不是很大啊畢竟現(xiàn)在大部分都是直接搭的項目組件正常方式使用組件即可
既然是單頁面使用,最簡單快捷的就是直接script引用了,這里我就直接把文件放出來自取好了,今天百度網(wǎng)盤有點(diǎn)卡分享不出來,文件又比較長,就放文章最末尾吧
<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頁面,當(dāng)然全寫一個html也行啊看個人喜好,這里因為項目需求兼容ie,所以寫的比較原始
var appVue = new Vue({ el: "#mainpage", components:{ 'test': httpVueLoader('../PCdemo/src/components/test.vue') }, data: function() { return { state:'1111' } } })
那么效果就完成了
組件官網(wǎng) 還提供了其他注冊引入方法,講的比較細(xì)致啊這里就不贅述了 有興趣可以自己去看看
(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方法怎么用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對html頁面引入vue組件之http-vue-loader.js方法怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。