在五一节之前和一网友讨论前端技术时,对方提到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注入二级路由展示的模块

转载于:https://www.cnblogs.com/cqhaibin/p/6823286.html

requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?相关推荐

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

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

  2. Vue vuex vue-router

    Vue vuex vue-router 文章目录 Vue vuex vue-router 1.Vuex的使用 2.Vue-router的使用 2.1.基本使用 2.3.路由的跳转 2.3.路由跳转携带 ...

  3. 基于Vue, Vuex 和 ElementUI 构建轻量单页Hexo主题Lite

    Hexo Theme Lite Keep Calm, Lite and Writing. light single page blog application theme, using Vue, Vu ...

  4. 详解 Vue Vuex 实践

    2019独角兽企业重金招聘Python工程师标准>>> 随着应用复杂度的增加,我们需要考虑如何进行应用的状态管理,将业务逻辑与界面交互相剥离,详细讨论参考笔者的2016-我的前端之路 ...

  5. 理解vuex -- vue的状态管理模式

    2019独角兽企业重金招聘Python工程师标准>>> vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管 ...

  6. vue vuex 挂载_vue.js,javascript_Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了!,vue.js,javascript - phpStudy...

    Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了! 代码如下 import 'babel-polyfill' import Vue from 'vue' import VueRouter fr ...

  7. vue vuex 大型项目demo示例

    1.vuex 动态模块配置 import Vue from 'vue' import Vuex from 'vuex' import store from '@/store'; // 使用Vuex插件 ...

  8. 记录一下使用vue/vuex+SSR框架遇到的bug

    项目框架:vue+vuex+vue-server-render 问题描述:页面中有个区块通过state.jkyl (JSON Object)来控制是否需要显示,页面未登录前jkyl的数据是为空的,待登 ...

  9. Vue Vuex的详细教程

    Vue Vuex的详细教程 Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变 ...

  10. Vue —— vuex

    vuex 是专门在Vue中实现集中式状态(数据)管理的一个Vue插件 1.安装vuex 执行npm i vuex@3 注意版本 vue2------vuex3;vue3------vuex4 2.引入 ...

最新文章

  1. linux ls 命令只显示目录和只显示文件
  2. 配置Vim的显示样式
  3. 树莓派python编程案例-树莓派Python编程指南.pdf
  4. 如何处理 android 方法总数超过 65536 . the number of method references in a .dex file exceed 64k
  5. pjtool用到的数据库----oracle范畴
  6. C++ const 引用 指针答疑
  7. ubuntu 系统相关
  8. 【选手分享】你想知道的比赛思路这里都有!速查收!
  9. 机器学习--组合分类方法之AdaBoost算法
  10. china-pub春季教材展,给力优惠,买二赠一
  11. fireworks切图
  12. 游戏和数学笔记—常拿起来看看
  13. linux版wps系统缺失字体,ubuntu wps 字体缺失的解决方法
  14. 计算机 word 节是什么,Word中的分节符是什么,如何使用?
  15. [转载]SAP生产工单结算的差异种类分析
  16. 如何判断一个数是不是整数
  17. 【Linux内核】Linux软中断处理机制-ksoftirqd
  18. MATLAB中能对三角函数降幂嘛,初中数学三角函数降幂公式
  19. 初识frameset
  20. iphone相册储存空间已满_iphone可用存储空间已满?教你快速回收存储空间

热门文章

  1. 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)
  2. java可视化界面视频_java中的可视化界面
  3. python读取fiddler_python3 使用Fiddler捕获的Raw信息带cookie使用GET或POST获取
  4. 无界面(webdriver.PhantomJS)访问有道
  5. mybatis传set参数
  6. 零基础学前端开发技术之第七章 浮动塌陷
  7. jsessionid
  8. 协议处理程序初始化失败_TCP协议、算法和原理
  9. nginx服务器的文件大小的限制解决方法
  10. 《leetcode》longest-substring-without-repeating