前言

  本文记录Vue2.x + Element-UI + TypeScript语法入门实例

  为什么要用TypeScript?

  1、TypeScript是JavaScript的超集,利用es6语法,实现对js的面向对象编程思想;

  2、TypeScript会像强类型语言一样,可以避免出现不可预期的运行时bug;

  Vue官网:https://cn.vuejs.org/

  Element-UI官网:https://element.eleme.cn/#/zh-CN

  Vue对TypeScript的支持:https://cn.vuejs.org/v2/guide/typescript.html

  TypeScript的学习可以看回我们之前的《typescript》系列:https://www.cnblogs.com/huanzi-qch/category/1509796.html

  vue+typescript整合,推荐阅读这篇文章:https://segmentfault.com/a/1190000011744210

  安装、启动

  vue项目需要node环境,开始安装之前,先安装node环境,安装node环境看之前的博客:TypeScript环境安装,以及配置idea开发环境

  装好node环境之后,先安装Vue CLI手脚架,通过手脚架来快速创建项目

npm install -g @vue/cli

  装好之后使用命令查看版本号,确认一下

vue --version

  装好了手脚架,然后就可以通过手脚架快速创建portal门户项目

  PS:element-ui现在还不支持Vue3,所以我们现在Vue2就可以了,选择自定义安装把配置项全都勾上,或者可以先选择默认安装

vue create portal 

  后续再在package.json里面指定依赖包,直接使用IDE(或者手敲命令也一样),运行安装命令下载依赖包

  package.json依赖配置

  "dependencies": {
"core-js": "^3.6.5",
"register-service-worker": "^1.7.1",
"vue": "^2.6.11",
"vue-class-component": "^7.2.3",
"vue-property-decorator": "^8.4.2",
"vue-router": "^3.2.0",
"vuex": "^3.4.0",
"axios": "0.21.0",
"element-ui": "^2.13.2",
"js-cookie": "2.2.1"
},

  在src的同级目录下面,创建vue.config.js配置文件,配置端口等

module.exports = {
publicPath: './',
outputDir: 'dist',
assetsDir: 'static',
lintOnSave: true,
productionSourceMap: false,
devServer: {
port: '10010',
open: false,
overlay: {
warnings: false,
errors: true
},
proxy: {
'/auth': {
target: 'http://localhost:10086',
secure: false,
changeOrigin: true,
pathRewrite: {
'^/auth': '/'
}
},
'/api': {
target: 'http://localhost:10086',
secure: false,
changeOrigin: true,
pathRewrite: {
'^/api': '/'
}
}
}
}
}

  使用idea打开项目,配置config,即可在idea运行vue项目

  或者也可以手动输入命令启动项目(vue-cli-service serve),或者在package.json文件中运行脚本

  启动成功

  项目结构

  Vue Router

  Vue Router官网:https://router.vuejs.org/zh/

  路由配置

import Vue from 'vue'
import VueRouter, { RouteConfig } from 'vue-router' Vue.use(VueRouter); /* 公用模块菜单路由 */
const commonRoutes: Array<RouteConfig> = [
{
path: '/',
name: 'Home',
meta: { title: '主页' },
component: () => import( '@/views/Home.vue')
},
{
path: '/404',
name: '404',
meta: { title: '404' },
component: () => import('@/views/common/404.vue')
},
{ path: '*', redirect: '/404'}
]; /* test模块菜单路由 */
const testRoutes: Array<RouteConfig> = [
{
path: '/test',
name: 'Test',
meta: { title: 'demo测试' },
component: () => import( '@/views/test/Test.vue')
}
]; const router = new VueRouter({
base:"/",
mode: 'hash',//history hash
routes:commonRoutes.concat(testRoutes)
}); router.beforeEach(async(to, from, next) => {
console.log("跳转开始,目标:"+to.path);
document.title = `${to.meta.title}`; //跳转页面
next();
}); router.afterEach(() => {
console.log("跳转结束"); }); export default router

  路由跳转、页面接参

/**
* 工具类
*/
export default class CommonUtil { /**
* 从url中获取参数
* 实例:http://xxxxx/index?id=1&name=张三
* getQueryVariable("id")//1
* getQueryVariable("name")//张三
*/
public static getQueryVariable(variable:string): string {
let vars = window.location.search.substring(1).split("&");
for (let i = 0; i < vars.length; i++) {
let pair = vars[i].split("=");
if (pair[0] === variable) {
return pair[1];
}
}
return "";
};
}
import CommonUtil from  "@/utils/commonUtil"

//跳转 params 是路由的一部分,必须要有。query 是拼接在url后面的参数,没有也没关系
this.$router.push({name:'Home',
params: {id:'001'},
query: {id:'001'}
}); //接参
let id = this.$route.params.id;
//如果为空,尝试从url中获取参数
if(!id){
id = CommonUtil.getQueryVariable("id");
}

  或者直接在浏览器上输入path路径,即可跳转页面

  Vuex

  Vuex官网:https://vuex.vuejs.org/zh/

  vuex配置

import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex); /*
约定,组件不允许直接变更属于 store 实例的 state,而应执行 action 来分发 (dispatch) 事件通知 store 去改变
*/
export default new Vuex.Store({
state: {
},
getters:{
},
mutations: {
},
actions: {
},
modules: {
}
})

  项目入口

  App.vue

<!-- 这里是项目路口,配置<router-view/>即可 -->
<template>
<div id="app">
<router-view/>
</div>
</template> <script lang="ts"> </script> <style lang="less">
html,body{
margin: 0 !important;
padding: 0 !important;
}
</style>

  main.ts

import Vue from 'vue'
import App from './App.vue'
import './registerServiceWorker'
import router from './router'
import store from './store'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
// @ts-ignore
import locale from 'element-ui/lib/locale/lang/zh-CN' Vue.use(ElementUI, { locale }); Vue.config.productionTip = false; new Vue({
router,
store,
render: h => h(App)
}).$mount('#app');

  TypeScript语法

  Vue对TypeScript的支持:https://cn.vuejs.org/v2/guide/typescript.html

  vue+typescript整合,推荐阅读这篇文章:https://segmentfault.com/a/1190000011744210

  在使用typescript语法的过程中,我们使用官方维护的 vue-class-component 装饰器,这里是它的文档:https://class-component.vuejs.org/

  这个就是它一个简单的写法

<template>
<div>
简单页面
</div>
</template> <script lang="ts">
import { Component, Vue } from 'vue-property-decorator'; @Component
export default class Home extends Vue { }
</script> <style scoped> </style>

  完整测试例子

  接下来介绍具体的使用,里面包含了常用的:data 数据、生命周期钩子函数、methods 普通方法、computed 获取/设置计算属性、watch 监听、props 组件数据传递

  HelloWorld组件

<template>
<div class="hello">
<h1>{{ msg }}</h1>
</div>
</template> <script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'; @Component
export default class HelloWorld extends Vue { //props 组件数据传递
@Prop({ type: String,default: 'default value' }) private msg!: string;
}
</script> <style scoped lang="less"> </style>

  Test.vue测试页面

<template>
<div style="padding: 20px;">
<el-row>
<el-col :span="12">
<div style="padding: 20px;">
<el-divider content-position="left">数据绑定测试</el-divider>
<el-row>
<el-input placeholder="请输入新msg内容" v-model="msg" clearable></el-input>
<p>直接绑定data数据:{{msg}}</p>
<p>普通方法获取data数据:{{getMsg()}}</p>
<p>computed的get方法获取data数据:{{computedTest}}</p>
<el-button type="primary" plain @click="buttonClick">调用computed的set方法修改data数据</el-button>
</el-row> <el-divider content-position="left">引用HelloWorld组件测试</el-divider>
<el-row>
<HelloWorld :msg="msg"/>
</el-row> <el-divider content-position="left">if-else条件渲染测试</el-divider>
<el-row>
<p style="color: green" v-if="flag">if条件渲染:true</p>
<p style="color: red" v-else="flag">if条件渲染:false</p>
<el-button type="primary" plain @click="flag=!flag">if条件渲染取反</el-button>
</el-row>
</div>
</el-col>
<el-col :span="12">
<div style="padding: 20px;"> <el-divider content-position="left">for循环-数组渲染测试</el-divider>
<el-row>
<p v-for="(item,index) in items">
序号:{{index}},编号:{{item.id}},姓名:{{item.name}}
</p>
<el-button type="primary" plain @click="items.push({id:'0000',name:'new item'})">新增记录</el-button>
</el-row> <el-divider content-position="left">for循环-对象渲染测试</el-divider>
<el-row>
<p v-for="(value,key,index) in itemsByObj">
序号:{{index}},{{key}}:{{value}}
</p>
</el-row> </div>
</el-col>
</el-row>
</div>
</template> <script lang="ts">
import { Component, Emit, Watch, Prop, Vue } from 'vue-property-decorator';
import HelloWorld from '@/components/HelloWorld.vue'; @Component({
components: {
HelloWorld,
},
})
export default class Test extends Vue {
//data 数据
private msg:string = "test测试";
private flag:boolean = true;
private items:any = [
{id:1001,name:"张三"},
{id:1002,name:"李四"},
{id:1002,name:"王五"},
];
private itemsByObj:object = {
id:1001,
name:"huanzi-qch",
age:18,
email:"huanzi-qch@qq.com",
phone:"12345678900",
}; //生命周期钩子函数
created(){
console.log("created");
};
mounted(){
console.log("mounted");
}; //methods 普通方法
@Emit()
getMsg(): string{
return this.msg;
}
@Emit()
buttonClick(): void{
this.computedTest = 'test测试0001';
} //computed 获取/设置计算属性
get computedTest(): string{
return this.msg;
}
set computedTest(newMsg:string){
this.msg = newMsg;
} //watch 监听
@Watch('msg')
onMsgChanged(newVal: string, oldVal: string) {
this.$message.info("msg值发生改变,旧值:" + oldVal + ",新值:" + newVal);
}
}
</script> <style scoped> </style>

  

  效果演示

  环境配置文件

  配置文件的key,要以VUE_APP_开头

  读取

<template>
<div>
{{adminUrl}}
</div>
</template> <script lang="ts">
import { Component, Vue } from 'vue-property-decorator'; @Component
export default class Home extends Vue {
//读取环境配置值
private adminUrl:string = process.env.VUE_APP_ADMIN_URL;
}
</script> <style scoped> </style>

  打包、部署

  vue.conifg.js中指定好打包路径

    publicPath: './',
outputDir: 'dist',
assetsDir: 'static',

  同时,路由配置那里要注意,模式要改成mode: 'hash'

const router = new VueRouter({
base:"/",
mode: 'hash',//history hash
routes:commonRoutes.concat(testRoutes,adminRoutes)
});

  直接运行打包脚本,或者手动输入命令

  打包成功

  复制dist文件夹到Tomcat容器,把Tomcat运行起来

  访问:http://172.16.35.52:10086/dist/,即可跳转到我们配置的 / 路径页面

  

  在此路径基础上就可以访问我们配置的路由路径了,如:http://172.16.35.52:10086/dist/#/test

  后记

  Vue项目入门实例就暂时记录到这,后续再继续更新

Vue项目入门实例的更多相关文章

  1. Vue(1) : Vue项目入门

    1.先安装nodejs环境 查看官文 2.切换到国内源 npm install -g cnpm –registry=https://registry.npm.taobao.org 执行成功后,执行如下 ...

  2. 使用vue脚手架快速创建vue项目(入门)

    1.安装环境 为了方便,以下操作大多数中命令行中运行,window可以用cmd,powershell,gitbash等. 安装node.js 打开它的官网,或者中文网站,然后直接下载就可以了,然后跟安 ...

  3. 建立spring项目入门实例

    建立maven项目 打开pop.xml文件 添加springframework所依赖的包 <!-- https://mvnrepository.com/artifact/org.springfr ...

  4. Vue.js2.0从入门到放弃---入门实例

    最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...

  5. 转-Vue.js2.0从入门到放弃---入门实例(一)

    http://blog.csdn.net/u013182762/article/details/53021374 标签: Vue.jsVue.js 2.0Vue.js入门实例Vue.js 2.0教程 ...

  6. vue 快速入门 系列 —— 使用 vue-cli 3 搭建一个项目(下)

    其他章节请看: vue 快速入门 系列 使用 vue-cli 3 搭建一个项目(下) 上篇 我们已经成功引入 element-ui.axios.mock.iconfont.nprogress,本篇继续 ...

  7. vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)

    前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...

  8. vue.js学习之入门实例

    之前一直看过vue.js官网api,但是很少实践,这里抽出时间谢了个入门级的demo,记录下一些知识点,防止后续踩坑,牵扯到的的知识点:vue.vue-cli.vue-router.webpack等. ...

  9. Vue项目中GraphQL入门学习与应用

    1.GraphQL是什么,能干什么? 正如官网所说,GraphQL是一种用于API查询的语言.Facebook 的移动应用从 2012 年就开始使用 GraphQL.GraphQL 规范于 2015 ...

随机推荐

  1. Linux 串口工具 lsz lrz 移植

    //之前写的,刚才不小心误删了,所以重新再发出来. 1 下载源码包 首先下载最新版的lrzsz,地址:https://ohse.de/uwe/software/lrzsz.html.下面以 0.12. ...

  2. C语言中最常用的标准库函数

    标准头文件包括: <asset.h>      <ctype.h>       <errno.h>       <float.h> <limits ...

  3. Keil ARm新建项目

    一.新建一个工程 选好芯片后确认,完成创建 二.新建一个文件 保存为后缀名为*.c的文件 三.把文件添加进项目里面 四.测试 发现有警告 五.给项目添加特定的文件,去除警告或错误 现在保存项目的文件夹 ...

  4. Python 自动化测试全攻略:五种自动化测试模型实战详解

    随着移动互联网的发展,软件研发模型逐步完善,软件交付质量越来越受到软件公司的重视,软件测试技术特别是自动化测试技术开始在软件系统研发过程中发挥着越来越重要的作用. 与传统的手工测试技术相比,自动化测试 ...

  5. rxjs入门3之项目中ajax函数封装

    项目中ajax函数封装 ⽹页应⽤主要数据源有两个:⼀个是⽹页中的DOM事件,另⼀个就是通过AJAX获得的服务器资源.我们已经知道fromEvent这个操作符可以根据DOM事件产⽣Observable对 ...

  6. Vue 学习 二 路由详解

    1 roter-link 和roter-view组件 2路由配置 a.动态路由 b.嵌套路由 c.别名路由 d.命名路由 3 Js操作路由 4 重定向和别名 1为路由默认绑定 2 使用组件 根据 路由 ...

  7. java 图片相似度算法

     利用直方图原理实现图像内容相似度比较  ,作为笔记记录在随笔中.   public class PhotoDigest {     public static void main(String[]  ...

  8. JS关闭chorme页面

    百度到的很多答案都失效了,这是收集一位博主的(https://www.jianshu.com/p/9dc2752194b8),目前可以使用. 代价是打开一个空白页面,能实现无提示关闭当前页面.不需要是 ...

  9. 网络编程—【自己动手】用C语言写一个基于服务器和客户端(TCP)!

    如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字). socket(套接字):简单来讲,socket就是用于描述IP地 ...

  10. 扫描仪扫描文件处理-富士通ix500参数

    纸张太薄不要扫,非常容易卡纸 当纸张薄的时候,每次不要放入太多,很容易因为层叠纸张压力导致滚动拉动单张力度过大,从而卡纸 卡纸第一时间叩开"滚轮盖" 去掉"自动跳过空白页 ...