vue2+iview+require实现AMD模式下的组件化开发、按需加载
2017-12-21 20:21
295 查看
github地址:https://github.com/chuanzaizai/vue_iview_require
1、最近项目遇到的需求:不使用webpack, 采用老设计模式AMD,实现按需加载,组件化开发
2、主要技术栈: vue (https://cn.vuejs.org/v2/guide/)
iview (http://v1.iviewui.com/)
requirejs (http://requirejs.org/)
css样式采用less模块化,未在webpack中配置less-loader,借助less.js在客户端编译(此方法不可取,需优化)
3、设计思路:
(1)配置require,新建main.js
main.js中主要配置全局js的依赖项,vue的全局监听器,引入公用的header、nav组件
requirejs.config({ // baseUrl:'./', paths:{ text:'lib/text', jquery:'lib/jquery.min', less:'lib/less-1.6.3.min', vue:'lib/vue', iview:'lib/iview.min', vueresource:'lib/vue-resource-1.3.4.min', httpinterface: 'httpinterface', loading: 'loading' }, shim:{ vue: { exports:'Vue' }, iview: [ 'vue' ], vueresource: [ 'vue' ] } }) // 注册事件 require(['vue', 'iview', 'vueresource', 'loading'], function(Vue, iview, vueresource, loading) { Vue.use(iview); Vue.use(vueresource); // 全局监听器 Vue.http.interceptors.push(function (req, next) { // 设置全局token // let token = sessionStorage.getItem("token"); // let prefix = 'Bearer_'; // if(token) { // req.headers.set('Authorization', prefix + token); // } // 请求中,显示loading window.$loading.showLoading(); next(function (res) { // console.log(res); // 请求成功,关闭loading window.$loading.hideLoading(); // 这里也可处理全局错误方法 let resBody = JSON.parse(res.bodyText); if(res.status === 200 && resBody.success){ this.$Notice.destroy(); this.$Notice.success({ title: '提示', desc: '操作成功,么么哒!', duration: 2 }); }else{ let msg = ''; resBody.messages ? msg = resBody.messages : msg = '服务器罢工了,请稍后重试!'; this.$Notice.destroy(); // 先执行,并且每个接口都会执行一次,然后再取到接口数据 this.$Notice.error({ title: '提示', desc: msg, duration: 2 }); } }) }) }); // 全局header require(['./../components/header/header']); // 全局导航 require(['./../components/nav/nav']);
(2)如何定义一个公用的组件,以header为例
第一步:定义组件的dom结构,header.html
<!-- dom --> <div class="head-wrapper"> <h1>这里是头部</h1> </div>
第二步:定义组件的js(注册组件,绑定事件等)ps: 这里要借助require的插件text.js,关于text.js更多
/* * header控制器 */ define(['vue', 'text!./../../header/header.html'], function(Vue, headerTemplate){ Vue.component("my-header",{ template: headerTemplate, data() { return { } }, mounted() { }, methods:{ test() { } }, computed:{ } }); })
(3)开发首页index
第一步:定义html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>中央审批系统</title> <!-- css --> <link rel="stylesheet" type="text/css" href="../../assets/assets.css"> <link rel="stylesheet" type="text/css" href="../../assets/iview.css"> <!-- 服务环境下引入 --> <link rel="stylesheet/less" type="text/css" href="index.less" /> <!-- require --> <script src="../../js/lib/require.min.js" data-main="../../js/main.js"></script> </head> <body> <!-- index 根节点 --> <div id="index" v-cloak> <!-- header组件 --> <my-header></my-header> <!-- 导航栏组件 --> <my-nav></my-nav> <!-- 面包屑导航 --> <div class="bread-nav-wrapper"> <Breadcrumb> <Breadcrumb-item href="/"> <Icon type="ios-home-outline"></Icon> 首页 </Breadcrumb-item> <Breadcrumb-item href="/components/breadcrumb"> <Icon type="social-buffer-outline"></Icon> 第一个模块 </Breadcrumb-item> </Breadcrumb> </div> <!-- 内容 --> <div class="index-content content-wrapper"> <h2>姓名:{{name}}</h2> <i-table :columns="columns1" :data="data1"></i-table> <Page :total="100" show-total></Page> <!-- 测试组件 --> <Tabs value="name1"> <Tab-Pane label="标签一" name="name1">标签一的内容</Tab-Pane> <Tab-Pane label="标签二" name="name2">标签二的内容</Tab-Pane> <Tab-Pane label="标签三" name="name3">标签三的内容</Tab-Pane> </Tabs> <Slider v-model="value" range></Slider> <Input-number :max="10" :min="1" :value="1"></Input-number> <Date-Picker type="date" placeholder="选择日期" style="width: 200px" ></Date-Picker> </div> </div> <script type="text/javascript"> // 模块的js require(['./../components/index/index']); </script> </body> </html>
第二步:定义js
/* * index 控制器 */ require(['vue', 'less', 'iview', 'vueresource', 'httpinterface'], function(Vue, less, iview, vueresource, httpinterface){ // 实例化对象 new Vue({ el:'#index', data:{ name:'川仔仔', value: [20, 50], columns1: [ { title: '姓名', key: 'name' }, { title: '年龄', key: 'age' }, { title: '地址', key: 'address' } ], data1: [ { name: '王小明', age: 18, address: '北京市朝阳区芍药居' }, { name: '张小刚', age: 25, address: '北京市海淀区西二旗' }, { name: '李小红', age: 30, address: '上海市浦东新区世纪大道' }, { name: '周小伟', age: 26, address: '深圳市南山区深南大道' } ] }, mounted() { this.getIndex(); this.$Message.success('这是一条成功的提示'); console.log(this.$HTTPINTERFACE); }, methods:{ getIndex() { // this.$http.post('http://47.95.232.223:8089/auth/login', {}).then((res) => { // console.log(res); // }) } }, computed:{ }, components: { } }) })
(4)还可以使用ES6语法等,封装公用的方法,全局接口文件等
(5)最终效果图(ps: 红色框内为封装的公用组件)
相关文章推荐
- ASP.NET Web Froms开发模式中实现程序集的延迟加载
- 套接字模式—非阻塞模式开发(3)—— 客户端类实现
- 真正的创新必然是基于对市场的了解,对客户反馈的观察,开发出来的产品一定要适应市场,提出的模式一定要能解决现实的问题。而在这其中,技术只是一种实现手段。
- 两种SVN开发模式实现目录结构布局
- WinCE开发How to大集合之详解MSDN上推荐的分步加载流驱动实现启动提速
- 实用开发二:ajax实现页面无刷新加载另一个页面的内容
- 使用Dijit实现界面组件化开发
- 做了MVC模式一年,可不要把传统模式忘记呀!ashx配合aspx实现AJAX加载JSON数据
- COM 代理存根模式下COM组件的实现和加载
- 快速开发平台的两种实现模式(转载)
- Android腾讯微博客户端开发五:利用FootView实现ListView滑动动态加载实现分页
- 一起谈.NET技术,使用Dijit实现界面组件化开发
- 快速开发工具的两种实现模式
- 如何利用FDD模式实现项目的精确、快速开发
- Windwos SDK开发 --实现BUTTON按钮的加载图片
- 开发设计模式 -- Asp.net中实现观察者模式
- 《Orange’s 一个操作系统的实现》3.保护模式3----DOS加载.EXE过程
- 设计模式是软件的灵魂, 开发语言是多种实现的一种
- IPhone开发学习笔记:单例模式的实现
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。