在五一节之前和一网友讨论前端技术时,对方提到vue、vue-route如果配合requirejs应用。当时的我没有想得很明白,也没能这位网友一个准确的回复,但我许诺于他五一研究后给他一个回复。本是一天的研究却被我搞成了研究了一周,这拖延症。。。

闲话少数,进入正题

一、示例代码说明

代码结构说明:

  1. modules(存放的为组件,主要是模板与Js对象分成两个文件来写)
    1. route:测试子路由的组件
    2. title:就是一个简单的显示文字的组件
  2. app.js:核心类,提供vue的创建、以前modules组件加载的方法等
  3. chart.js:模拟的一个业务模块
  4. index.html:页面文件
  5. layout.css:整体样式文件(测试require加入样式文件)
  6. main.js:requirejs的配置文件(也是入口文件)
    丑陋的效果图:

此示例没有样式,只是为了验证require如何加载一个vue组件,以子路由的动态注入的能力,示例代码下载

二、从.vue文件入手

一个.vue文件可以包含模板、Js类、样式(可以不要)等三块。但我们通过vue的官网可以知道,vue提供了compile对象方法,可以把模板编译成VNode。并且我们通过webpack打包后生成的文件可以看出模板与Js类是混淆在一起了。这也就说明vue的组件就是一个Js对象。如下图所示:

三、requirejs对vue、vuex和vue-route的引入

引入这三个都很容易,并将这三个注入到Vue对象也是相对简单的,难道的是需要解决动态注入向vue-route实例注入路由,以及vuex的动态加入一个数据模块的能力。好在这两点官网都给出了解决方案:

  • vue-route如何动态注入路由
    根据官网帮助文档说明,存在addRoutes方法,向路由实体动态注入路由
  • vuex模块动态注入
    也是根据官网帮助文档提示有registerModule方法实现。
  • 实现的部分代码:
    初始化Vue对象
apt.init = function(){
this.store = Object.create({
modules:{}
});
this.Vue.use(VueRouter);
this.Vue.use(Vuex);
this.router = new VueRouter();
this.store = new this.Vuex.Store(this.store);
}

首先提供一个init方法,对Vue对象进行一些初始化,也就是把Vuex、vue-route都注入到Vue对象中。在这里我把创建的vuex和vue-route的实例都放到this对象,方便后面提供给组件注册实使用。
创建Vue实例:

apt.createVue = function(){
this.vue = new this.Vue({
store: this.store,
router: this.router,
computed: {
childs: function(){
if(!this.$store.state.router) return null;
return this.$store.state.router.childs;
}
}
});
return this.vue;
}

只创建vue对象,没有进行mount。
为其他模块提供的上下文:

apt.createContext = function(){
return {
Vue: this.Vue,
router: this.router,
$vue: this.vue
};
}

四、如何通过require加载html和js方式的组件

从项目结构图中可以看出在modules文件夹中定义了两个组件,分别是:routet和title,而他们的模板则是一个html文件。以下是这类组件如何加载的代码:

apt.acquire = function(path){
var arrayPath;
if(!this.isArray(path)){
arrayPath = [path];
}else{
arrayPath = path;
}
var promise = this.dfd(function(dfd){
require(arrayPath,function(){
dfd.resolve(Array.prototype.slice.call(arguments));
},function(error){
dfd.reject(error);
});
}).promise();
return promise;
} apt.createComponent = function(componentName){
//可以重载,读取.vue的文件
var path = this.$modulePrefix + componentName,
html = 'text!' + path + '/index.html',
js = path + '/index.js',
self = this;
var promise = this.acquire([html,js]);
promise.done(function(result){
var obj = result[1], content = result[0];
obj.template = content;
obj.__path__ = path;
self.$components.push(obj);
});
return promise;
}

说明: acquire:提供通过require加载JS或者是html等文件的方法,并返回一个promise,这样就方便调用者使用。 createComponet:会根据调用传入的名称在modules文件夹中找出对应的js和html文件,然后调用acquire加载组件。

五、main.js是这样引用的

提供注册全局组件方法

apt.registerGlobalComponents = function(componentNames){
var gloadComponet = componentNames, self = this;
var promises = gloadComponet.map(function(data,index){
return self.createComponent(data);
});
var dfd = this.dfd();
$.when.apply(null, promises).done(function(){
var _router = [];
self.$components.forEach(function(data,index){
self.Vue.component(data.name, data);
_router.push({
path: '/' + data.name,
component: data
});
});
self.router.addRoutes(_router); //全局注册都注册为路由
dfd.resolve(_router);
});
return dfd.promise();
}

main.js中的引用

var _app = app.createApp();
_app.registerGlobalComponents(['title', 'route']).done(function(){
var vue = _app.createVue();
var cxt = app.getVue().createContext();
var r = {
state: {
childs: []
},
mutations: {
childs: function(state, data){
state.childs = data;
}
},
actions: {
childs: function(state, data){
state.commit('childs', data);
}
}
}
vue.$store.registerModule('router', r);
vue.$mount('#app');
});

说明:

  1. 创建App的一个实例;
  2. 注册全局的组件:title、route;
  3. 注册完成后创建vue实例,并且向实例的vuex注入二级路由展示的模块

requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?的更多相关文章

  1. vue vuex vue-rouert后台项目——权限路由(超详细简单版)

    项目地址:vue-simple-template共三个角色:adan barbara carrie 密码全是:123456 adan 拥有 最高权限A 他可以看到 red , yellow 和 blu ...

  2. vue+vuex 回退定位到初始位置

    先放出两张图(没错,你还在9012,做为一名资深设计师我唯一的技能点就是留白),简单说明下问题未做回退定位(从落地页回退,每次都回到A位置)想死啊有木有,每次都需要手动重新定位来选择,你大哥看到你做个 ...

  3. vuejs学习——vue+vuex+vue-router项目搭建(三)

    前言 vuejs学习——vue+vuex+vue-router项目搭建(一) vuejs学习——vue+vuex+vue-router项目搭建(二) 为什么用vuex:组件之间的作用域独立,而组件之间 ...

  4. vuejs学习——vue+vuex+vue-router项目搭建(二)

    前言 最近比较忙,所有第二章发布晚了,不好意思各位. vuejs学习——vue+vuex+vue-router项目搭建(一) 中我们搭建好了vue项目,我相信大家已经体验了vue其中的奥妙了,接下来我 ...

  5. vue+vuex构建单页应用

    基本 构建工具: webpack 语言: ES6 分号:行首分号规则(行尾不加分好, [ , ( , / , + , - 开头时在行首加分号) 配套设施: webpack 全家桶, vue 全家桶 项 ...

  6. vue+vuex初入门

    Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 解决问题: 传参的方法对于多层嵌 ...

  7. 我的音乐盒子(nodejs7 + koa2 + vue + vuex + vue-router)

    你们知道的,nodejs对jser来说,是个好东西,快快的,自从接触nodejs后,总想弄点东西. 这弄个啥了,一天打开百度音乐盒,哟,自己弄一个如何了,好啊好啊. 后台: nodejs 7 + ko ...

  8. use vue vuex vue-router, not use webpack

    vue,vuex,vue-router放在一起能做什么?不用webpack之类的打包工具使用他们是否可行?各位道友在初学vue时是否有这样的困惑.因为现代构建前端项目的一般模式是: 安装webapck ...

  9. [ABP开源项目]--vue+vuex+vue-router+EF的权限管理系统

    好久没写文字了,当然大家也不期待嘛,反正看代码就行了. 演示网站 首先说下这个项目吧. 如标题一样是基于VUE+.NET开发的框架,也是群友一直吼吼吼要一个vue版本的ABP框架. 我们先来看看首页吧 ...

  10. [Vue] vuex进行组件间通讯

    vue 组件之间数据传输(vuex) 初始化 store src/main.js import Vuex from "vuex"; Vue.use(Vuex); new Vue({ ...

随机推荐

  1. UOJ#416. 【APIO2018】铁人两项

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ416.html 前言 完了完了SB选手Tarjan写挂. 题解 考虑先Tarjan缩个点双建个圆方树. 然后发现,确定起点 ...

  2. Thread类和Runnable接口实现多线程--2019-4-18

    1.通过Thread实现 public class TestThread extends Thread{ public TestThread(String name) { super(name); } ...

  3. Emgucv使用中常用函数总结

    Emgucv常用函数总结: 读取图片 Mat SCr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.AnyColor); //根据路径创建指定的 ...

  4. 勾勾街:一个专业的苹果ios app 自助打包的网站,免越狱,免证书签名

    众所周知,苹果的APP开发是需要基于MAC环境的,而我们很多的开发者并没有这样的条件,如果单单为发布一款app就去买一台价格昂贵的MAC那成本就太高了! 就算你有一台MAC,也有能力自己开发出一款基于 ...

  5. Vue 记录 Cannot read property '_withTask' of undefined

    第二次遇到,年前偶尔代码中频繁出现过,因为没影响到交互,赶工期中,没有去深究. 今天又遇到了, 在事件触发后,脚本报错,终止了界面交互. 最后查找到这里的原因,检查并移除无效业务事件,错误消失了. ( ...

  6. SQLServer表、列备注管理

    在开发时,为了方便,在SQL SERVER库内对表名.列名进行备注,但在DB部署客户时,想一次清理上述备注值. 特编写如下 SQL,一次清除上述备注内容: declare @table nvarcha ...

  7. 如何解决PeopleSoft Process Scheduler发布问题

    常见PeopleSoft进程调度程序发布问题 此发布问题中遇到的一些常见错误是: 将HTTP响应转换为UCS2时出错 XML文档对象创建失败. 无法处理来自Report Repository的HTTP ...

  8. SpringMVC+Mybatis+MySQL8遇到的问题

    搭建SpringMVC+Mybatis+MySQL8过程中遇到的坑. 1.数据库驱动要使用新版本,我的和mysql保持一致. 查看mysql版本:MySQL\bin>mysql -V 配置对应版 ...

  9. 201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)

    实验十四  Swing图形界面组件 理论部分: 不使用布局管理器 有时候可能不想使用任何布局管理器,而只 是想把组件放在一个固定的位置上.下面是将一 个组件定位到某个绝对定位的步骤: 1)将布局管理器 ...

  10. 一些 NSArray 的基本操作代码例子

    一些 NSArray 的基本操作代码例子 数组可以说是软件开发人员每天都要面对的基本操作,下面就分享一些 NSArray 的基本操作代码例子供苹果开发初学者参考,每段代码第一行会以注释方式说明该段代码 ...