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

说明:本组件可以直接解析.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. 9.22考试 crf的视察 题解

    这道题当时第一反应就是一道典型的NOIP第一题的难度,绝对要A掉,不然分数一定会被拉开. 然后就开始分析,暴力是一开始想的是用二维树状数组打加上暴力枚举长度,然而这道题满足二分性质,所以时间复杂度就是 ...

  2. C语言中的函数与数学上的函数很类似

    函数,是C语言编程中一个很重要的概念,重要到个人认为可以与指针并驾齐驱.好多教材.老师.学习资源都会专门挑出一章来讲函数.我今天也来说说函数,只不过我是从数学课上的函数来引申到C语言中的函数. 先来说 ...

  3. Pygame安装问题

    1.首先使用如下命令: conda install -c https://conda.anaconda.org/quasiben pygame 测试报错: >>> import py ...

  4. Postgresql_fdw

    Postgresql_fdw 测试环境 Ubuntu 16.04 LTS云主机2台,主机名为pg1(192.168.0.34)和pg2(192.168.0.39). 安装postgresql 下面这个 ...

  5. 如何入门 MySQL

    如何入门MySQL 前言: 关于如何入门MySQL,后台有好多同学咨询我,可能部分读者刚开始学习MySQL,我前面发的文章对部分同学来说暂时接触不到.原本写技术文章的目的是记录自己的工作学习,没有考虑 ...

  6. .net学习笔记之访问数据库

    .net中访问数据库的两中方法 第一种是通过SqlHelper帮助类来访问数据库, 使用的是ADO.net技术. using System.Data; using System.Data.SqlCli ...

  7. 关于iphone手机上点击事件不起作用

    今天调试手机端H5页面的时候,发现一个很坑的问题,绑定的点击事件不起效果,安卓上都没问题,事件能正确触发,但是在iPhone没反应. 开始觉得是写法问题,后来发现,是由于iPhone上,点击的对象,必 ...

  8. 个人永久性免费-Excel催化剂功能第22波-Excel文件类型、密码批量修改,补齐PowerQuery短板

    Excel的多工作薄.多工作表批量合并功能,Excel用户很多这方面的使用场景,也促使了各大Excel各大插件们都在此功能上有所开发,体验程度不一,但总体能够满足大多数的应用场景,本人之前也开发个单独 ...

  9. html+css-->background-img(背景图的设置)

    背景图:(相关验证代码请查看代码,在验证时需将当前不需要验证的代码注释掉)    1.inherit:从父元素继承属性设置    2.background-repeat:平铺(在图片大小小于元素尺寸时 ...

  10. 准备开始,选好第一个C#的封装库

    如今C#做工业图像处理和开发,最多资料和例子的就是Emgu.不过现在人家开始商业收费了,对于我们这些小企业就不是很好了.这里,我要介绍和推荐的是另外一个也同样牛逼的C#封装Opnecv的库,叫做Ope ...