【Vue.js实现前后端分离架构中前端页面搭建】

九、Vue的事件处理

Vue的事件都是使用 v-on:事件类型 进行绑定。也可以使用@事件类型进行操作。其中事件类型和之前学习jQuery中事件名称是一样。

示例中都是以点击事件为例。

1. 直接操作属性值

代码示例中通过点击按钮对counter值加一。下面<p>中显示属性值。所以会出现点击按钮后下面数字在变化的效果

<template><div id="app"><button v-on:click="counter += 1">Add 1</button><p>The button above has been clicked {{ counter }} times.</p></div>
</template><script>export default {name: 'App',data() {return {counter: 0}}
}
</script>

也可以把上面的v-on:click换成@click。

2. 事件处理方法

Vue中事件也可以绑定给特定的方法进行处理。

@click取值是方法名称

methods是固定属性。里面定义了多有事件能绑定的方法。

jqk:function(event)中

jqk 是方法名。

event是方法形参,在js中方法形参名称随意。只要@click中使用没有参数的方法时,都会默认传递事件对象。如果方法中不使用事件对象,function里面就不需要写event了,在Vue中变量声明后必须使用

<template><div id="app"><button @click="jqk">click</button></div>
</template><script>export default {name: 'App',data(){return {field:"值"};},methods:{jqk:function (event) {// this是当前Vue对象alert(this.field);if(event){alert(event.target.tagName)}}}
}
</script>

3. 事件传参

事件传参只需要在调用方法时加上括号和要传递的参数就可以了。

注意:

字符串值必须有单引号。

没有单引号参数(field),调用data()中属性

方法中不需要使用事件对象时就不写$event。但是如果需要使用事件对象,必须手动传递事件对象,且必须叫做$event,$event是全局Vue对象原型(prototype)里面的属性。

<template><div id="app"><button @click="jqk('name',$event)">click</button><button @click="jqk(field,$event)">click</button></div>
</template><script>export default {name: 'App',data(){return {field:"值"};},methods:{jqk:function (name,event) {alert("name:"+name);if(event){alert(event.target.tagName)}}}
}
</script>

十、组件

组件:如果项目中多次用到类似效果,就可以把这个效果进行自定义组件。

新建项目后默认存在HelloWorld.vue就是一个组件。

import Helloworld .... 组件文件必须导入才能使用。其中Helloworld为自定义名称,通过这个名称就可以调用对应组件。如果import时直接写组件名(大小写相同)IDEA会提升生成组件的路径,所以一般习惯上都是把名称定义为组件文件名。

components: 组件文件只import是不能被使用的。必须在components中注册组件,注册后在<template>中就可以通过组件名直接引用组件了。在<template>中组件以标签形式存在,标签名为组件名。其中msg是在Helloworld中定义的props参数,表示需要传递给组件的数据。

1. 新建vue文件

在Vue中组件就是可复用的页面内容。以.vue文件形式存在。

在src/components中新建一个文件。名称任意。示例中叫做MyComponent.vue。

在Vue中组件的文件名多使用大驼峰。

{{jqk}} 获取组件传递参数的值

props:定义组件传递的参数名称和类型

<template><div><div>这是一个组件</div><div>{{jqk}}</div></div>
</template><script>export default {name: "MyComponent",props: {jqk: String}}
</script><style scoped></style>

2. 修改App.vue

<MyComponent>就是下面定义的组件名称。jqk是参数名

import 导入组件并设置名称为MyComponent

components 声明组件

<template><div id="app"><MyComponent jqk="这是传递的内容"/></div>
</template><script>import MyComponent from "@/components/MyComponent";export default {name: 'App',components:{MyComponent}
}
</script>

十一、路由

组件和页面的区别?

组件和页面文件中内容是完全相同,唯一区别是组件可能被多次使用,import时会给组件定义个名称,而页面文件可能只使用一次,import时就不需要定义名称。在项目中为了区分页面和组件,把组件放在components文件夹而页面放在pages(名称随意,一般多叫pages)文件夹下。

为什么使用路由?

在项目中创建了First.vue和Second.vue。如果按照组件方式进行操作这个两个页面中数据固定显示在App.vue中。但是我们知道正常项目都是通过不同的URL控制显示不同页面。在SPA项目中也是需要通过不同的URL在App.vue中显示不同的数据。

现在缺少一个可以通过URL控制哪个页面显示在App.vue中的功能/组件。路由就是做这件事情的。

什么是路由?

在Vue中路由就是控制显示哪个页面。通过路由显示的页面是显示在App.vue中的,这符合SPA,当更改URL后只改变App.vue页面中路由对应的部分的内容,也就是说通过路由显示时也是属于局部刷新效果。

在App.vue中通过<router-view/>显示路由内容。

简单一句话说明:通过识别URL显示页面的功能。

1. 安装路由依赖

在IDEA中的terminal面板运行命令。--save表示把添加的依赖写入到package.json。如果没有--save效果上也可以,但是加上可以更好的知道项目都使用了哪些组件。

使用terminal时也需要注意下,命令是否在当前项目的根路径下。

运行成功后会在package.json中多了router相关依赖。

2. 新建两个页面

在src下新建了page文件夹。在文件夹下新建了两个.vue的页面

页面内容也只是写了字符串first。另一个页面first换成second,其他都相同。

此时这两个页面是无法访问的。

<template><div>first</div>
</template>
<script>export default {name: "First"}
</script>
<style scoped>
</style>

3. 修改main.js

import Vue from 'vue'
import App from './App.vue'
// 导入路由依赖。安装了vue-router组件后系统带有的依赖。
import VueRouter from 'vue-router'
// 导入两个页面
import First from "@/pages/First";
import Second from "@/pages/Second";Vue.config.productionTip = false;
// 使用路由
Vue.use(VueRouter);
// 创建路由对象。new VueRouter为上面import设置的名称
// 路由对象名称,必须是router。其他命名都无法提供路由表功能,页面抛出异常:
// TypeError: Cannot read property 'matched' of undefined
const router = new VueRouter({// 没有history,访问URL会有#mode:"history",routes:[{path:"/first",component:First},{path:"/second",component:Second}]
});new Vue({// 使用router对象router,render: h => h(App),
}).$mount('#app')

4. 修改App.vue

必须要有<router-view/> 否则无法显示路由控制的页面。

<template><div id="app"><router-view/><MyComponent jqk="这是传递的内容"/></div>
</template>

5 优化结构

把main.js中和路由相关的内容放到一个单独的js文件中。这样维护更好。

5.1 编写index.js文件

在src下新建router文件夹,在文件夹中新建index.js。

注意文件的第一行和最后一行。

// 必须有这个导入,否则使用路由报错
import Vue from 'vue'
// 导入路由依赖
import VueRouter from 'vue-router'
// 导入两个页面
import First from "@/pages/First";
import Second from "@/pages/Second";// 使用路由
Vue.use(VueRouter);
// 创建路由对象。new VueRouter为上面import设置的名称
const router = new VueRouter({// 没有history,访问URL会有#mode:"history",routes:[{path:"/first",component:First},{path:"/second",component:Second}]
});
// 必须有这个导出,否则main.js无法获取router对象
export default router

5.2 修改main.js

引入router下index.js文件。

import Vue from 'vue'
import App from './App.vue'
// Vue中index.js是默认js文件名。下面引用时省略了index
import router from "@/router";
Vue.config.productionTip = falsenew Vue({router,render: h => h(App),
}).$mount('#app')

十二、发起网络请求和跨域处理

Vue中使用axios进行网络请求。使用起来和jQuery中$.get和$.post功能类似。

给定服务端控制器代码。可以接收name和age参数,设置到Map中并返回。

一定要注意:控制器上有跨域注解。前后端分离都是跨域请求。且端口不能是8080端口。

@RestController
@CrossOrigin
public class DemoController {@RequestMapping("/demo")public Map<String,Object> demo(String name ,Integer age){Map<String,Object> result = new HashMap<>();result.put("name",name);result.put("age",age);return result;}
}

1. 安装依赖

2. get请求

<template><div>发起请求</div>
</template><script>import axios from "axios"export default {name: "axios",
// 页面加载事件。mounted() {axios.get("http://localhost:8081/demo?name=bjsxt&age=12").then(res => {console.log(res.data);}).catch(error => {console.log(error);})}}
</script><style scoped></style>

3. post方式

下面演示了使用POST获取值后把name显示在页面的过程。

注意:

POST也支持URL重写方式传参。通过?和&传参数。

如果使用下面这种方式传参必须要结合querystring使用。

<template><div>发起请求获取到的结果。{{name}}</div>
</template><script>import axios from "axios"import qstring from "querystring"export default {name: "axios",data() {return {name: ""};},mounted() {axios.post("http://localhost:8081/demo", qstring.stringify({name: "张三",age: 12})).then(res => {console.log(res.data.name);this.name = res.data.name;}).catch(error => {console.log(error);})}}
</script><style scoped></style>

4. axios全局设置

如果使用上面的方式,将需要在每个页面中都导入axios。

也可以全局绑定axios。

4.1 修改main.js

Vue.prototype.$jqk=axios 中

Vue 全局Vue对象

prototype 原型。设置全局属性。

$jqk 随意设置的名称。

axios 依赖对象名

import Vue from 'vue'
import App from './App.vue'
// Vue中index.js是默认js文件名。下面引用时省略了index
import router from "@/router";
import axios from "axios"
import qstring from "querystring"Vue.prototype.$axios = axios
Vue.prototype.$qstring=qstring
Vue.config.productionTip = falsenew Vue({router,render: h => h(App),
}).$mount('#app')

4.2 页面中写法

在任何页面中都可以直接使用this.$jqk进行设置。

<template><div>这是首页。所有内容都显示在这个页面中。SPA<br/>姓名:{{name}}, 年龄:{{age}}</div></template><script>export default {data() {return {name:"",age:0};},mounted() {this.$axios.post("http://localhost:8081/demo",this.$qstring.stringify({name:"北京尚学堂",age:15})).then(response => {this.name = response.data.name;this.age = response.data.age}).catch(error => {console.log(error)})}}
</script>

十三、请求代理

在Vue中发起网络请求时URL都使用完整URL,可以把公共URL提出,提出后发起网络请求时URL只写路径部分。省略协议、ip、端口。

如果没有请求代码每次在浏览器开发者工具看见真实请求服务器地址,这样话就把服务器暴露给客户端了。使用代理后只能看见代理前请求,保护真实服务器地址。

在项目根路径(不是src)下新建vue.config.js。名称固定

这个配置文件操作完成后必须重启

发起请求时可以使用/api/xxx 的形式

在开发者工具看见的请求

vue click事件_Vue.js---实现前后端分离架构中前端页面搭建(二)相关推荐

  1. vue 新建的页面如何访问_Vue.js—实现前后端分离架构中前端页面搭建(四)(完)...

    [Vue.js实现前后端分离架构中前端页面搭建] 二十.实现服务端登录业务 前提:已经有单机版Eureka,端口8761.启动开Eureka 1. 新建父项目 新建backend_parent. 为了 ...

  2. 大型医院云HIS系统:采用前后端分离架构,前端由Angular语言、JavaScript开发;后端使用Java语言开发 融合B/S版电子病历系统

    一套医院云his系统源码 采用前后端分离架构,前端由Angular语言.JavaScript开发:后端使用Java语言开发.融合B/S版电子病历系统,支持电子病历四级,HIS与电子病历系统均拥有自主知 ...

  3. 前后端分离架构中的接口安全(上篇)

    互联网发展至今,已由传统的前后端统一架构演变为如今的前后端分离架构,最初的前端网页大多由JSP.ASP.PHP等动态网页技术生成,前后端十分耦合,也不利于扩展.现在的前端分支很多,如:Web前端.An ...

  4. Nginx+Vue.js+Tornado前后端分离架构环境实践(1)

    基于Python构建前后端分离服务架构实践,其中Web服务为Nginx,前端采用VUE组件,后端Web服务采用Tornado,数据库使用文档型MongoDB,服务协议主要为restfull. 1. N ...

  5. vue 虚拟主机_Vue实现简单前后端分离(虚拟主机也可用)

    我们提到前后端分离,第一想到的应该是跨域问题!之前的项目跨域问题我都是在Vue端解决,部署上线后通过nginx进行反向代理. 这种方法有个小坑,大家可以尝试下使用Apache搭建后端api,然后使用N ...

  6. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十三║Vue实战:Vuex 其实很简单

    前言 哈喽大家周五好,马上又是一个周末了,下周就是中秋了,下下周就是国庆啦,这里先祝福大家一个比一个假日嗨皮啦~~转眼我们的专题已经写了第 23 篇了,好几次都坚持不下去想要中断,不过每当看到群里的交 ...

  7. Node.js + Express + Springboot实现前后端分离架构

    2019独角兽企业重金招聘Python工程师标准>>> 架构说明 前后端分离架构,很多团队都是通过"代理转发"浏览器发往后端的rest请求来解决跨域问题,可以用n ...

  8. 基于VUE只是作为模版引擎的前后端分离

    首先请原谅本文标题取的有点大,但并非为了哗众取宠.本文取这个标题主要有3个原因,这也是写作本文的初衷: (1)目前国内几乎搜索不到全面讲解如何搭建前后端分离框架的文章,讲前后端分离框架思想的就更少了, ...

  9. 前后端分离架构一直没机会实战?1周完成Vue+Core WebApi移动商城实战(含源码)!...

    疫情让企业受到重创! 就业形势更加严峻! 前后端分离架构成了当下最高频的招聘需求 还没实战过前后端分离? 花3分钟阅读本文, 带你全面了解前后端分离,轻松面试拿高薪! Web发展至今技术非常成熟,主流 ...

最新文章

  1. [分享]毕业了【其实不想毕业】
  2. 自动化测试:Selenium webdriver 学习笔记-C#版(四)
  3. 在tensorflow中的网格图问题--np.mgrid()
  4. 经典面试题(51):以下代码将输出的结果是什么?
  5. split用法与图像预处理
  6. java药品管理系统源代码,基于jsp的药品管理系统-JavaEE实现药品管理系统 - java项目源码...
  7. python酷q机器人_酷Q机器人实时热点Python源码
  8. 项目开发中DEV、QAS、PRD是什么意思
  9. pr如何跳到关键帧_PR制作短视频(二):30分钟制作一个短视频
  10. 2021-06-11
  11. [零基础深度学习环境配置一]基于python 3.7+anaconda 3+cuda 11.1+cuDNN v8.1.1+win10+TITAN XP
  12. CCF201809-4 再卖菜(100分)
  13. web端的兼容性测试
  14. 写给安徽合肥高三的你——少年不惧岁月长,敢挽桑弓射玉衡
  15. 定时任务Alarm的深入理解
  16. 最好用的房屋租赁软件(租赁行业)
  17. JAVA三年经验面试题总结
  18. Tensorflow安装方法 (一)【 使用国内镜像下载】
  19. ORACLE 库缓存
  20. NovelAI二次元绘画体验

热门文章

  1. IplImage* cvmat* mat 释放
  2. 支撑数千家天猫商家CRM业务,数云高弹性数据库如何做
  3. 美军开发远程人脸识别系统,实现1公里内目标识别
  4. 机器学习从业人员到底做什么?
  5. 【2018开年知识盛会】15位大咖直播分享,全方位解析NoSQL数据库
  6. 微软云打印将直接与 OneDrive 集成;全球 90 多家组织敦促苹果放弃引入”儿童安全”功能计划……...
  7. Storm精华问答 | storm与Hadoop区别?
  8. K8S精华问答 | Kubernetes用的是Docker的容器?
  9. 使用云原生buildpacks将你的代码转换成Docker Image | 技术头条
  10. 虚拟化精华问答 | 虚拟化的关键技术有哪些?