当展现页面时,用户发起请求 http://localhost:8090/vue/findAll,获取所有的user数据.
通过Vue.js 要求在页面中展现数据, 以表格的形式展现.
为每行数据添加 修改/删除的按钮
在一个新的DIV中 编辑3个文本框 name/age/sex 通过提交按钮实现新增.
如果用户点击修改按钮,则在全新的DIV中 回显数据.
用户修改完成数据之后,通过提交按钮 实现数据的修改.
当用户点击删除按钮时,要求实现数据的删除操作.
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>案例练习title>
head>
<body>
<div id="app">
<div align="center">
<h3>用户新增h3>
姓名: <input type="text" />
年龄: <input type="text" />
性别: <input type="text" />
<button>新增button>
div>
<hr />
<div align="center">
<h3>用户修改h3>
<p>
编号: <input type="text" disabled/>
姓名: <input type="text" />
p>
<p>
年龄: <input type="text" />
性别: <input type="text" />
p>
<p>
<button>修改button>
p>
div>
<hr />
<div>
<table border="1px" align="center" width="80%">
<tr align="center">
<th colspan="5"><h3>用户列表h3>th>
tr>
<tr align="center">
<th>编号th>
<th>姓名th>
<th>年龄th>
<th>性别th>
<th>操作th>
tr>
<tr align="center" v-for="user in userList">
<th v-text="user.id">th>
<th v-text="user.name">th>
<th v-text="user.age">th>
<th v-text="user.sex">th>
<th width="20%">
<button>修改button>
<button>删除button>
th>
tr>
table>
div>
div>
<script src="../js/vue.js">script>
<script src="../js/axios.js">script>
<script>
//3.定义axios请求的前缀
axios.defaults.baseURL = "http://localhost:8090/vue"
const app = new Vue({
el: "#app",
data: {
//1.定义用户数据
userList: []
},
methods: {
getUserList(){
axios.get("/findAll")
.then(promise => {
//console.log(promise.data)
this.userList = promise.data
//console.log(this.userList)
})
}
},
//利用生命周期函数触发ajax
created(){
//alert("生命周期函数")
this.getUserList()
}
})
script>
body>
html>
@RestController
@CrossOrigin
@RequestMapping("/vue")
public class VueController {
@Autowired
private UserService userService;
/**
* 需求: 查询所有的用户数据
* URL: http://localhost:8090/vue/findAll
* 参数: null
* 返回值: List<User>
*/
@GetMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
}
<div align="center">
<h3>用户新增h3>
姓名: <input type="text" v-model="addUser.name"/>
年龄: <input type="text" v-model="addUser.age"/>
性别: <input type="text" v-model="addUser.sex"/>
<button @click="addUserBtn">新增button>
div>
封装新增数据
准备修改的DIV 其中包含4部分数据. name/age/sex where id!!!
当用户点击修改按钮时,应该实现数据的回显.
当用户已经修改完成之后,需要点击提交按钮时 应该发起ajax请求实现数据修改操作.
注意事项:
在vue.js中看到了INPUT框, 则表示双向数据绑定. 必须在data中定义属性.
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>案例练习title>
head>
<body>
<div id="app">
<div align="center">
<h3>用户新增h3>
<p>
姓名:<input type="text" v-model="addUser.name" />
年龄:<input type="text" v-model="addUser.age" />
性别:<input type="tetx" v-model="addUser.sex"/>
p>
<button @click="addUserBtn">新增button>
div>
<div align="center">
<h3>用户修改h3>
<p>
编号:<input type="text" disabled v-model="updateUser.id"/>
姓名:<input type="text" v-model="updateUser.name"/>
p>
<p>
年龄:<input type="text" v-model="updateUser.age"/>
性别:<input type="text" v-model="updateUser.sex"/>
p>
<button @click="updateBtn">提交button>
div>
<div id="">
<table border="1px" width="80%" align="center">
<tr><th colspan="5"><h3>用户列表h3>th>tr>
<tr align="center">
<th>编号th>
<th>姓名th>
<th>年龄th>
<th>性别th>
<th>操作th>
tr>
<tr align="center" v-for="user in userList">
<th v-text="user.id" v-model="updateUser.id">th>
<th v-text="user.name"v-model="updateUser.name">th>
<th v-text="user.age" v-model="updateUser.age">th>
<th v-text="user.sex" v-model="updateUser.sex">th>
<th width="20%">
<button @click="updateUserBtn(user)">修改button>
<button @click="deleteUserBtn(user)">删除button>
th>
tr>
table>
div>
div>
<script src="../js/vue.js" >script>
<script src="../js/axios.js" >script>
<script>
//3.配置基本请求路径
axios.defaults.baseURL = "http://localhost:8090/vue"
const app = new Vue({
el:"#app",
data:{
//1.定义用户数据
userList: [],
//封装新增数据
addUser:{
id:' ',
name:' ',
age: ' ',
sex:' '
},
//封装修改数据
updateUser:{
id:' ',
name:' ',
age: ' ',
sex:' '
}
},
methods:{
//获取用户信息
getUserList(){
//alert("查询数据")
axios.get("/findAll")
.then(promise => {
//console.log(promise.data)
this.userList = promise.data
console.log(this.userList)
})
},
//实现数据新增
addUserBtn(){
axios.post("/saveUser",this.addUser)
.then(promise => {
//获取服务器返回值
let msg = promise.data
//弹出框操作
alert(msg)
//将列表数据刷新
this.getUserList()
//新增之后清空
this.addUser = {}
})
},
deleteUserBtn(user){
/* 问题:用户点击删除,如何获取数据 */
// 回答:传递循环遍历的数据即可
console.log(user)
axios.delete("/deleteUserById?id="+user.id)
.then(promise =>{
//弹出提示信息
alert(promise.data)
//刷新列表信息
this.getUserList()
})
},
//修改数据
updateUserBtn(user){
//实现数据的回显,将user传递给data属性
/* axios.get("/findUserById?id="+user.id)
.then(promise =>{
this.updateUser = promise.data
}) */
this.updateUser = user
},
// updateBtn(){
// axios.put("/updateUser",this.updateUser)
// .then(promise =>{
// alert(promise.data)
// //刷新列表信息
// this.getUserList()
// //如果操作成功,清空
// this.updateUser={}
// })
// },
async updateBtn(){
let{data: result}
= await axios.put("/updateUser",this.updateUser)
alert(result)
this.getUserList()
this.updateUser={}
}
},
//利用生命周期函数触发ajax
created() {
//alert("生命周期")
this.getUserList()
}
})
script>
body>
html>
ES6以后推出的新的代码规范,目的简化现有axios ajax请求的代码结构.提高用户的开发效率.
关键字用法:
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>简化操作title>
head>
<body>
<h1>简化操作语法h1>
<script src="../js/axios.js">script>
<script >
//1.定义请求的前缀 好处:只需要写后缀
axios.defaults.baseURL = "http://localhost:8090/vue"
/* //2.axios查询调用
axios.get("/findAll").then(promise => {
console.log(promise.data)
}) */
//2.定义函数
async function findAll(){
//解构赋值操作
let {data : result,status : status}
= await axios.get("/findAll")
console.log(result,status)
console.log(status)
}
//3.调用函数
findAll()
script>
body>
html>
async - await 是axios为了简化then()的一种全新的语法. 语法如此.
该用法只能用到Ajax请求中
说明: 传统的页面开发,会将大量的HTML/CSS/JS进行引入,但是引入之后结构混乱 不便于管理. 开发维护时 成本较高.
组件化思想:
在VUE中 可以将一个组件,看作是一个页面. 在其中可以引入独立的样式/JS/HTML 进行单独的管理.
组件可以进行复用.
关键字: 组件–页面 (html/css/js)
核心知识点: 组件化的思想体现了"分治思想"
补充知识: 为了保证组件化 相互之间互不干扰,则应该在组件内部 单独定义html/js/css.
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title>
head>
<body>
<div id="app">
<add-num-com>add-num-com>
<add-num-com>add-num-com>
<add-num-com>add-num-com>
div>
<template id="numTem">
<div >
<h1>我是一个组件h1>
获取数值:{{num}}
div>
template>
<script src="../js/vue.js">script>、
<script>
/**
* 1.组件的定义
* 参数:
* 1.组件名称
* 2.组件实体内容
*/
//1.组件的定义
Vue.component("addNumCom",{
//属性
data(){
return{
//自定义属性
num:100
}
},
//页面标记
template:"#numTem"
})
// 实例化vue对象
const app = new Vue({
el:"#app"
})
script>
body>
html>
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>局部组件定义title>
head>
<body>
<div id="app">
<msg-com>msg-com>
<msg-com>msg-com>
div>
<div id="app2">
<msg-com>msg-com>
<msg-com>msg-com>
div>
<template id="msgTem">
<div>
<h3>我是一个局部组件h3>
div>
template>
<script src="../js/vue.js">script>
<script>
let msgCom = {
template: "#msgTem"
}
//定义局部组件 只对当前vue对象有效
const app = new Vue({
el: "#app",
components: {
//key: value
msgCom: msgCom
}
})
const app2 = new Vue({
el: "#app2",
})
script>
body>
html>
答:
答:
1.template标签是组件中定义html标记的模板、
2.template必须有根标签div
3.template标签最好定义在body标签内部,写法方便、
使用注意事项:
1.组件的使用必须在vue对象渲染的区域中使用
2.组件有全局的/有局部的。注意事项
3.在html标签中使用组件时注意大小写问题,如果是驼峰规则,则使用“-”连接
4.组件必须先定义再使用
说明: 用户发起一个请求,在互联网中经过多个站点的跳转.最终获取服务器端的数据. 把互联网中网络的链路称之为路由. (网络用语)
VUE中的路由: 根据用户的请求URL地址,展现特定的组件(页面)信息. (控制用户程序跳转过程)
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>路由入门案例title>
head>
<body>
<template id="homeTem">
<div>
<h1>这里是系统首页h1>
div>
template>
<template id="welcome">
<div>
<h2>这是欢迎页面h2>
div>
template>
<div id="app">
<div>
<h1>实现路由案例h1>
<router-link to="/home">主页router-link>
<router-link to="/welcome">欢迎router-link>
<router-view>router-view>
div>
div>
<script src="../js/vue.js">script>
<script src="../js/vue-router.js">script>
<script type="text/javascript">
<!-- 4.封装路由对象 -->
let HomeCom = {
template: "#homeTem"
}
let Welcome = {
template: "#welcome"
}
let router = new VueRouter({
//routes 定义请求与组件的映射关系
routes:[
{path:"/home",component:HomeCom},
{path:"/welcome",component:Welcome}
]
})
// 5.实现路由对象的绑定
const app = new Vue({
el:"#app",
//router: router
router
})
script>
body>
html>
DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>路由嵌套title>
head>
<body>
<div id="app">
<h1>动物园h1>
<router-link to="/tiger">老虎router-link>
<router-link to="/lion">狮子router-link>
<router-view>router-view>
div>
<template id = "tigerTem">
<div>
<h1>一只凶猛的大猫h1>
<img src="img/1.jpg" >
div>
template>
<template id = "lionTem">
<div>
<h1>狮子王辛巴h1>
<img src="img/2.jpg" >
<h3>
<router-link to="/lion/one">原配router-link>
<router-link to="/lion/two">小妾router-link>
<router-view>router-view>
h3>
div>
template>
<template id="oneTem">
<div>
<h1>原配 老大h1>
<img src="img/2.1.jpg" >
div>
template>
<template id="twoTem">
<div>
<h1>小妾 老二h1>
<img src="img/2.3.jpg" >
div>
template>
<script src="../js/vue.js" >script>
<script src="../js/vue-router.js" >script>
<script>
let tigerCom={
template:"#tigerTem"
}
let lionCom={
template:"#lionTem"
}
let oneCom = {
template:"#oneTem"
}
let twoCom = {
template:"#twoTem"
}
/**
* 1.如果需要在App根标签中跳转,则写到routes根目录下
* 2.如果需要进行父子嵌套,则应该使用children属性
* 3.如果使用children属性,则在自身的router-view展现数据
*
*/
let router = new VueRouter({
routes : [
{path:"/",redirect:"lion"},
{path: "/tiger" , component: tigerCom},
{path: "/lion",component: lionCom,
children : [
{path: "/lion/one",component:oneCom},
{path: "/lion/two",component:twoCom}
]},
]
})
const app = new Vue({
el:"#app",
router
})
script>
body>
html>
说明:用户请求服务器时:由服务器将请求转给另一台服务器的过程.叫做转发
说明: 用户请求服务器时,服务器由于特殊原因告知用户应该访问服务器B,之后用户再次发起请求访问服务器B. 这个过程称之为重定向