基础环境搭建——如何在 Vue2 中集成KendoUI

前言


本文将会介绍如何将KendoUI集成到 Vue.js 中。
KendoUI 使用AMD框架,而 webpack 支持导入以AMD模式定义的模块。
示例中将会用到 vue-cliwebpacknode.js。本文不会对以上框架做过多的解释。
本文面向 即将 在项目中使用前端MVVM框架的团队。
请使用npm的阿里源 https://registry.npm.taobao.org 否则安装过程会非常慢
本文中,使用试用版的KendoUI来讲解。
如果你在正式环境中使用KendoUI,请购买正版授权。
请支持正版 KendoUI 组件

安装webpack 和 vue-cli


在你安装好Node.js之后,在控制台中运行(请自行添加sudo)

npm install webpack -g  
npm install vue-cli -g 

生成vue工程


在你的工作目录下执行以下命令:

vue init webpack vue-kendoui

根据提示,你需要作出如下选项:

根据提示生成 vue 示例工程

此命令将会自动生成一个webpack示例工程。

根据提示,你需要执行

npm install #安装依赖
npm run dev #以开发模式运行
npm run build #将你的组件打包

所以,你需要进入 vue-kendoui 目录,执行

npm install
进入工程目录,安装依赖

然后再执行:

npm run dev
启动开发服务器
启动开发服务器

即可启动开发服务器。

订制目录结构


vue-cli生成的 webpack 工程已经很好用了。它很贴心地为你分离了生产环境和开发环境。
即便如此,我们需要对其进行细小的定制,方便开发。
先看订制后的目录结构(略长)
订制后的目录结构与原结构稍有不同,描述如下:

  1. 新添加了 html 目录,这里可以存放所有的html。
  2. 添加了 src/modules 目录,这里应该存放所有的 模块(modules),包括KendoUI自带的模块和自己自定义的模块。
  3. 添加了 src/modules/vendor 目录,此处用于放置所有第三方模块。
  4. 添加了 src/modules/kendoUi 目录,根据 mvvm 原则,笔者认为KendoUI属于View层,所以需要将所有初始化控件的相关操作放到此目录下。
目录结构

订制开发脚本


KendoUI 基于 JQuery,并且其内部并没有以 AMD 的方式引入 JQuery, 所以我们需要在页面上注入 JQuery:

//文件:webpack.base.conf.js
var webpack = require("webpack");
.....
//在vue下面添加以下内容:
plugins:[
    new webpack.ProvidePlugin({
      $: "jquery",
      jQuery: "jquery",
      "window.jQuery": "jquery"
    })
  ]

然后需要在项目目录下安装jquery:

npm install jquery --save  #装的是jquery@3.1.1版本,然而KendoUI官方说已经兼容3.1.1版本,所以无需担心

如下图所示:

插入JQuery(可以参考行号)

接下来需要处理 JavaScript、KendoUI 自带的样式和图片了。

前文提到,KendoUI符合AMD规范,而 webpack (竟然)支持AMD规范包的引用,我们现在就可以直接引用 KendoUI 的 javascript 代码了。

我们可以使用别名(alias)来简化模块的引用:

    alias: {
      'vue$': 'vue/dist/vue.common.js',
      'src': path.resolve(__dirname, '../src'),
      'modules': path.resolve(__dirname, '../src/modules'),
      'assets': path.resolve(__dirname, '../src/assets'),
      'components': path.resolve(__dirname, '../src/components'),
      'kendoUi':  path.resolve('./src/modules/vendor/kendoUi/js'),
      'kendoUiStyles': path.resolve('./src/modules/vendor/kendoUi/styles')
    },
使用别名来简化开发

现在我们就可以在代码中引入KendoUI相关的东西啦

但是等等,我们先看一下 KendoUI 的源代码

KendoUI 内部依赖的引用方式(来自 kendo.DropDownList.js)

相信聪明的你已经看出来了,这样引用的话,webpack会报错:
找不到模块:kendo.list.min 和 kendo.mobile.scroller.min
假设我们有如下代码:

//文件:src/modules/kendoUi/kendoDropDownList.js
import 'kendoUiStyles/kendo.common.min.css'
import 'kendoUiStyles/kendo.bootstrap.min.css'
import kendoDropDownList from 'kendoUi/kendo.dropdownlist.min'
import $ from 'jquery'

function init(el){
  $(el).kendoDropDownList();
}

export default {
  init
}

引用该模块,编译之后,肯定会有如下的错误:

KendoUI 依赖引用报错

所以我们要让 webpack 去我们的指定位置查找KendoUI的依赖:

modulesDirectories:[
      path.join(__dirname, '../node_modules'),
      path.resolve('./src/modules/vendor/kendoUi/js'),
    ],
添加依赖路径

至此,一切工作正常了,现在可以开始我们的编码工作了。

开始编码-初始化一个kendoDropDownList吧

我们的目标是,将所有的KendoUI 包装成一个个的.Vue组件,
它们的交互方式是这样的:

  1. 通过vue.js的动态属性(dynamic props)将信息传递给组件
  2. 通过vue.js的自定义事件(custom events, v-on)从组件中带值。

首先,需要在 src/modules/kendoUi 目录中创建一个文件:

//文件名:kendoDropDownList.js
import 'kendoUiStyles/kendo.common.min.css'
import 'kendoUiStyles/kendo.bootstrap.min.css'
import kendoDropDownList from 'kendoUi/kendo.dropdownlist.min'
import $ from 'jquery'

function init(el){
  $(el).kendoDropDownList();
}

export default {
  init
}

这个文件允许我们将vue组件的element传进来,然后将其初始化为一个KendoUI控件。

然后,需要在src/components 目录中创建一个文件:

//文件名:kendoDropDownList.vue
<template>
  <div></div>
</template>

<script>

  //todo 要把dom和当前的kendoUi对象缓存起来,尽量减少dom的操作

  import kendoDropDownList from "modules/kendoUi/kendoDropDownList"
  function onMounted(){
    kendoDropDownList.init(this.$el);
  }
  export default {
    name: "kendoDropDownList",
    mounted: onMounted
  }
</script>

目录结构如下:

目录结构

然后我们就可以引用该组件了。

//文件:App.vue
<template>
  <div id="app">
    <!--![](./assets/logo.png)-->
    <!--<hello></hello>-->
    <drop-down-list></drop-down-list>
  </div>
</template>

<script>
  import Hello from './components/Hello'

  import dropDownList from "./components/kendoDropDownList.vue"

  export default {
    name: 'app',
    components: {
      Hello,
      dropDownList
    }
  }
</script>

现在,我们的组件就可以正常工作了。

已经被组件化的 KendoUI(不要在意 Tab 的标题)

至此,我们第一个用 vue.js 封装的 KendoUI 组件就已经完成了。

导航:

基础环境搭建
在 Vue2 中集成kendoDropDownList

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容