本代码已组件化,可以直接使用。

说明:本组件可以直接解析.vue文件,为了支持less语法解析,在组件中引入less.js,可在less官网下载。

组件代码

<template>
<div class="remote">
<component :is="currentView" v-bind="$props"/>
</div>
</template>
<script>
import Axios from 'axios';
import '@/utils/less.min'; export default {
props:{
url:{
type:String,
default(){
return null;
}
}
},
data(){
return {
resData:null,
cssId:null,
}
},
computed:{
currentView(){
if(!this.resData)return {template:"<div class='remoteInfo'>正在加载中。。。</div>"};
const tplData = this.resolveStr(this.resData);
let ponentObj = new Function(`return ${tplData.sctipts.slice(tplData.sctipts.indexOf('{'),tplData.sctipts.lastIndexOf('}')+1)}`)();
ponentObj.template = tplData.templates;
this.$el.setAttribute('class',`remote css${this.cssId}`);
if(!document.querySelector(`style[id=css${this.cssId}]`)){//防止重复创建
let cssStr = `
.css${this.cssId}{
${tplData.styles}
}
`;
this.resolveCss(cssStr);
}
return ponentObj;
}
},
watch:{
url(){
this.getData();
}
},
mounted(){
this.getData();
},
methods:{
getId() {
var d = new Date().getTime();
var uid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random()*16)%16 | 0;
d = Math.floor(d/16);
return (c=='x' ? r : (r&0x3|0x8)).toString(16);
});
return uid;
},
resolveCss(lessInput){
less.render(lessInput).then(function(output) {
let style = document.createElement("style");
style.setAttribute("type", "text/css");
style.setAttribute("id",'css' + this.cssId);
if(style.styleSheet)// IE
style.styleSheet.cssText = output.css;
else {// w3c
var cssText = document.createTextNode(output.css);
style.appendChild(cssText);
}
var heads = document.getElementsByTagName("head");
if(heads.length)
heads[0].appendChild(style);
else
document.documentElement.appendChild(style);
}.bind(this));
},
resolveStr(str){
return {
templates:str.match(/<template>([\s\S]*)<\/template>/)[1],
sctipts:str.match(/<script.*>([\s\S]*)<\/script>/)[1],
styles:str.match(/<style.*>([\s\S]*)<\/style>/)[1],
}
},
async getData(){
let remoteData = this.$store.getters.getRemoteByUrl(this.url);
if(remoteData){
this.resData = remoteData.resData;
this.cssId = remoteData.cssId;
}else{
const res = await Axios.get(this.$props.url);
this.cssId = this.getId();
this.resData = res.data;
this.$store.dispatch('doAction',{
event:'addRemote',
data:{url:this.url,cssId:this.cssId,resData:this.resData}
});
}
}
}
}
</script>

vue 异步加载远程组件(支持编译less语法)的更多相关文章

  1. Vue异步加载高德地图API

    项目中用到了高德地图的API以及UI组件库,因为是直接把引入script写在index.html中,项目打包后运行在服务器,用浏览器访问加载第一次时会非常慢,主要原因是加载高德地图相关的js(近一分钟 ...

  2. vue 循环加载动态组件以及传值

    今天遇到一个需求,某个页面是个动态页面,由多个子组件构成. 之前我们的做法是将N个需要的组件import进主页面,然后引用一下即可.但是现在遇到的问题是, 这个动态页面存在多个业务,有的业务需要某几个 ...

  3. vue数据加载等待组件

    关于loading组件的. loading.vue <template> <div class="loading"> <div class=" ...

  4. 使用 dva 如何配置异步加载路由组件

    来源:https://www.jianshu.com/p/69694013e36b----------------------------------------------------- 普通方式 ...

  5. Vue 组件异步加载(懒加载)

    一.vue的编译模式 (1)路由配置信息 //eg1: const MSite = resolve => require.ensure([], () =>resolve(require([ ...

  6. Vue中router路由异步加载组件-优化性能

    何时使用异步加载组件 当首页app.js文件太大时,可以拆分组件异步加载,如果app.js文件很小时,不建议使用异步加载组件,因为异步加载组件时每次都要发送一个HTTP请求,这样的代价远比首页一次性加 ...

  7. react异步加载组件

    1. 创建 asyncComponent 异步加载工具 import React from 'react' function asyncComponent(loadComponent){ class ...

  8. Vue 动态加载组件

    为什么要动态加载呢?而不是一次性加载呢? 一次性?你能保证你拿的内容不多,那从性能方面说还是OK的.否则,就该什么时候用,就什么时候取. 得出这想法,源于前几天上班赶产品的故事: A组件是父亲,B组件 ...

  9. React配合Webpack实现代码分割与异步加载

    这是Webpack+React系列配置过程记录的第四篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

随机推荐

  1. 学习笔记-jvm运行时数据区

    按照线程私有和共享区域来划分 线程私有 程序计数器 指向当前线程正在执行的字节码行号地址,如果是本地方法,值为undefined 虚拟机中唯一不会oom的区域 为什么会有程序计数器 - java天生多 ...

  2. 个人永久性免费-Excel催化剂功能第34波-提取中国身份证信息、农历日期转换相关功能

    这两天又被刷朋友圈,又来了一个自主研发红芯浏览器,国产啊国产,这是谁的梦.就算国产了,自主了,无底线的夸大吹嘘无道德,企业如是,国家如是,大清已亡!再牛B的技术落在天天删敏感信息.无法治.无安全感可言 ...

  3. 「Sqlserver」数据分析师有理由爱Sqlserver之九-无利益关系推荐Sqlserver书单

    在前面系列文章的讲述下,部分读者有兴趣进入Sqlserver的世界的话,笔者不太可能在自媒体的载体上给予全方位的带领,最合适的方式是通过系统的书籍来学习,此篇给大家梳理下笔者曾经看过的自觉不错值得推荐 ...

  4. 在工作中常用的Linux命令

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 之前写过一篇 < 在公司做的项目和自己在学校做 ...

  5. 简单分析ThreadPoolExecutor回收工作线程的原理

    最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多了. 不过,我倒是对线程池是如何回收工 ...

  6. sessionID是如何在客户端和服务器端传递的?

    sessionID是如何在客户端和服务器端传递的? 服务器初次创建session的时候后返回session到客服端(在返回头(response)中有setCookie),浏览器会把sessionnam ...

  7. visionpro和halcon这两款机器视觉软件区别

    很多朋友会问到visionpro和halcon这两款机器视觉软件,到底学哪个好呢,今天重码网就给大家讲一讲: 首先比较下两者的优缺点: halcon: 提供的图像算法要比Visionpro多,也就是说 ...

  8. 任何类型的数据都向String转型

    String从其定义上发现首字母大写,所以此为一个类,属于引用数据类型,但是此类属于系统的类. (1)String像普通变量一样直接通过复制的方式进行声明.字符串使用双引号括起来.两个字符串使用&qu ...

  9. RFC 2544 性能测试

    什么是RFC 2544?网络设备性能测试的一组指标,包括吞吐率.时延.丢包率.背靠背. * * * 吞吐率(Throughput). 定义:被测设备在不丢包的情况下,所能转发的最大数据流量.通常使用每 ...

  10. Android Studio项目/Flutter 案例中Gradle报错通用解决方案(包括Unable to tunnel through proxy问题)

    目录 Step 1:修改Gradle版本为本地版本 Step 2:修改classpath为Android Studio版本 Step 3:关闭代理 Step 1:修改Gradle版本为本地版本     ...