大家一起进步,感谢大家的支持和关注
vue 语法
前言
vue就是一个前端框架
,借用这个框架可以快速的搭建好看的前端网站。
1.知识储备
- 有点html 基础
- 有点javascript基础
- 有点css基础
2.vue快速上手
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<style>
h1 {
color: green;
}
</style>
</head>
<body>
<!-- 2.指定区域,该区域的内容希望由vue.js来接管。 -->
<div id="app">
<div>
<h1>欢迎学习Vue2.js</h1>
<div>我叫{{name}},年龄{{age}}</div>
<input type="button" value="点我" v-on:click="clickMe">
</div>
</div>
<script>
// 3.创建Vue对象,并关联指定HTML区域。
var app = new Vue({
el: '#app',
data: {
name: '蜡笔小新',
age: 18
},
methods: {
clickMe: function () {
// 获取值this.name
// 修改值this.name = "xx"
this.name = "xxx";
this.age = 24;
}
}
})
</script>
</body>
</html>
效果
2.1 插值表达式
{{ }}
里面可以是字符串,可以是表达式,可以是变量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<style>
#app1 {
border: solid 1px crimson;
margin-top: 30px;
margin-left: 30%;
margin-right: 30%;
}
.btn {
float: left;
}
</style>
<body>
<div id="app">
<div id="app1">
<div>
<ul>
<li>{{"xxx"}}</li>
<li>{{ 1 + 1 + 10 }}</li>
<li>{{ 1 === 2 ? name : name1}}</li>
</ul>
<ul>
<li>{{ condition ? name : "xxx"}}</li>
</ul>
<div>我叫{{name}},我喜欢{{hobby}},邮箱:{{dataInfo.email}}</div>
</div>
<input type="button" class="btn" value="点我" v-on:click="clickMe">
</div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
name: '蜡笔',
name1: '小新',
hobby: 'game',
dataInfo: {
id: 1,
email: "xxx.com"
},
condition: false,
},
methods: {
clickMe: function () {
this.name = "蜡笔小新";
this.condition = true;
this.dataInfo.email = "xxx@example.com";
}
}
})
</script>
</body>
</html>
2.2 单向绑定v-bind
v-bind:
简写:
JS修改->HTML修改
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<style>
.ig {
border: 3px solid red;
}
</style>
</head>
<body>
<div id="app">
<img src='xx.png' class='c1' />
<img alt="" v-bind:src="imageUrl" v-bind:class="cls">
</div>
<script>
var app = new Vue({
el: '#app',
data: {
imageUrl: 'https://img-baofun.zhhainiao.com/pcwallpaper_ugc/static/ec61d1aba1464bcfcdc34e5949c76dd5.jpeg?x-oss-process=image%2fresize%2cm_lfit%2cw_3840%2ch_2160',
cls: "ig",
}
})
</script>
</body>
</html>
2.3 双向绑定v-model
一般用于在交互的表中中使用,例如:input、select、textarea等。【双向绑定】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<style>
#app{
border: 2px solid gainsboro;
height: 150px;
width: 300px;
margin:30px 40%;
}
</style>
</head>
<body>
<div id="app" >
<div>
用户名:<input type="text" v-model="user">
</div>
<div>
密码:<input type="password" v-model="pwd">
</div>
<input type="button" value="登录" v-on:click="clickMe"/>
<input type="button" value="重置" v-on:click="resetForm"/>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
user: "",
pwd: "",
},
methods: {
clickMe: function () {
alert(this.user, this.pwd)
},
resetForm: function () {
this.user = "";
this.pwd = "";
}
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<form action="">
<div>
用户名:<input type="text" v-model="user">
</div>
<div>
密码:<input type="password" v-model="pwd">
</div>
<div>
性别:
<input type="radio" v-model="sex" value="1">男
<input type="radio" v-model="sex" value="2">女
</div>
<div>
爱好:
<input type="checkbox" v-model="hobby" value="11">篮球
<input type="checkbox" v-model="hobby" value="22">足球
<input type="checkbox" v-model="hobby" value="33">评判求
</div>
<div>
城市:
<select v-model="city">
<option value="sh">上海</option>
<option value="bj">北京</option>
<option value="sz">深圳</option>
</select>
</div>
<div>
擅长领域:
<select v-model="company" multiple>
<option value="11">技术</option>
<option value="22">销售</option>
<option value="33">运营</option>
</select>
</div>
<div>
其他:<textarea v-model="more"></textarea>
</div>
<button type="button" v-on:click="clickMe">提交</button>
</form>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
user: "",
pwd: "",
sex: "2",
hobby: ["22"],
city: "sz",
company: ["22", "33"],
more: '...'
},
methods: {
clickMe: function () {
console.log(this.user, this.pwd, this.sex, this.hobby, this.city, this.company, this.more);
},
}
})
</script>
</body>
</html>
2.4 循环v-for
用户数据进行循环并展示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<style>
</style>
</head>
<body>
<div id="app">
<ul>
<li v-for="(item,idx) in dataList">{{idx}}----{{ item }}</li>
</ul>
<ul>
<li v-for="(item,idx) in cityList">{{item.id}} - {{ item.text}}</li>
</ul>
<ul>
<li v-for="(item,idx) in cityList">
<span v-for="(v,k) in item">{{k}} {{v}}</span>
</li>
</ul>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
dataList: ["lol", "绝地求生", "云顶", "黎明杀机"],
cityList: [
{id: 11, text: "上海"},
{id: 12, text: "北京"},
{id: 13, text: "深圳"},
]
}
})
</script>
</body>
</html>
2.5 事件绑定v-on
v-on:
简写@
常见事件
v-on:click
v-on:dblclick
v-on:mouseover
v-on:mouseout
v-on:change
v-on:focus
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-on:click="clickMe">点击</li>
<li @click="clickMe">点击</li>
<li v-on:dblclick="doSomething('双击')">双击</li>
<li v-on:mouseover="doSomething('进入')" v-on:mouseout="doSomething('离开')">进入&离开</li>
</ul>
</div>
<script>
var app = new Vue({
el: '#app',
data: {},
methods: {
clickMe: function () {
alert("点击了")
},
doSomething: function (msg) {
console.log(msg);
}
}
})
</script>
</body>
</html>
2.6 v-if 条件判断
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<a style="float: right ;margin-right: 20px;color: crimson" v-if="isLogin">
{{user}}
</a>
<a v-else> 游客 </a>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
isLogin: true,
user: "蜡笔小新"
}
})
</script>
</body>
</html>
2.7 v-show 显示和隐藏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<style>
label {
width: 60px;
display: inline-block;
text-align: right;
margin-right: 8px;
}
.form{
margin-top: 30px;
margin-left: 35%;
border: silver 1px solid;
width: 300px;
height: 150px;
}
.btn > input{
margin-left: 8px;
}
</style>
</head>
<body>
<div id="app">
<div class="form">
<div v-show="isSms">
<p>
<label>手机号</label>
<input type="text" placeholder="手机号">
</p>
<p>
<label>验证码</label>
<input type="text" placeholder="验证码">
</p>
</div>
<div v-show="!isSms">
<p>
<label>用户名</label>
<input type="text" placeholder="用户名">
</p>
<p>
<label>密码</label>
<input type="password" placeholder="密码">
</p>
</div>
<div class = "btn">
<input type="button" value="密码登录" @click="isSms=false"/>
<input type="button" value="短信登录" @click="isSms=true"/>
</div>
</div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
isSms: false,
}
})
</script>
</body>
</html>
由此可以看见v-show 和v-if 的区别
2.8 用户登录
发axios请求
,这个其实就是个ajax,服务端我们可以用python的flask框架搭建一个。
前后端交互用axios
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
axios({
method: "post", //post请求
url: '/login/',
params: { //携带的查询参数
token:"0201e010230103100103",
id:"xxxx"
},
data: { //请求体参数
name:"蜡笔小新",
pwd:"123"
},
headers: { //请求数据类型json格式
"Content-Type": "application/json"
}
}).then(function (res) { //必须传一个参数
// 成功后返回数据
alert("ok")
// 数据统一放在res.data
console.log(res.data);
}).catch(function (error) {
// 失败后的数据
alert("error")
console.log(error);
})
</script>
server.py
前端login.html
2.9 数据的增删改查
框架代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<style>
.penal {
border: 1px solid #dddddd;
margin: 20px 0 0 0;
padding: 10px;
border-bottom: 0;
background-color: #d9d9d9;
}
.table {
width: 100%;
border-collapse: collapse;
border-spacing: 0;
}
td, th {
padding: 8px;
vertical-align: top;
border: 1px solid #ddd;
text-align: left;
}
</style>
</head>
<body>
<div id="app">
<button @click="addBtn">新增</button>
<h3 class="penal">数据列表</h3>
<table class="table">
<thead>
<tr>
<td>序号</td>
<td>姓名</td>
<td>年龄</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr v-for="(item,id) in dataList">
<td>{{id}}</td>
<td>{{item.name}}</td>
<td>{{item.age}}</td>
<td>
<button @click="getBtn">查看</button>
<button @click="updateBtn">修改</button>
<button @click="delBtn">删除</button>
</td>
</tr>
</tbody>
</table>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
dataList: [
{"name": "蜡笔", "age": 18},
{"name": "小新", "age": 24},
]
},
methods: {
addBtn: function () {
alert("xxx")
},
getBtn: function () {
alert("xxx")
},
updateBtn: function () {
alert("xxx")
},
delBtn: function () {
alert("xxx")
},
},
})
</script>
</body>
</html>
实现
逻辑代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<style>
.penal {
border: 1px solid #dddddd;
margin: 20px 0 0 0;
padding: 10px;
border-bottom: 0;
background-color: #d9d9d9;
}
.table {
width: 100%;
border-collapse: collapse;
border-spacing: 0;
}
td, th {
padding: 8px;
vertical-align: top;
border: 1px solid #ddd;
text-align: left;
}
</style>
</head>
<body>
<div id="app">
<div>
<h3 v-if="flag===undefined">新建表单</h3>
<h3 v-else >编辑表单</h3>
<div>
<div>
<label>姓名</label>
<input type="text" v-model="userInfo.name">
</div>
<div>
<label>年龄</label>
<input type="text" v-model="userInfo.age">
<input type="button" :value="title" @click="addBtn">
</div>
</div>
</div>
<h3 class="penal" style="text-align: left">数据管理</h3>
<table class="table">
<thead>
<tr>
<td>序号</td>
<td>姓名</td>
<td>年龄</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr v-for="(item,idx) in dataList">
<td>{{idx+1}}</td>
<td>{{item.name}}</td>
<td>{{item.age}}</td>
<td>
<button @click="getBtn(idx)">查看</button>
<button @click="updateBtn(idx)">修改</button>
<button @click="delBtn(idx)">删除</button>
</td>
</tr>
</tbody>
</table>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
title: "新增",
flag: undefined,
userInfo: {
name: "",
age: "",
},
dataList: [
{"name": "蜡笔", "age": 18},
{"name": "小新", "age": 24},
]
},
methods: {
addBtn: function () {
// 在列表最后加一行数据,只需要在dataList添加一个数据
// 界面交互双向绑定
// 获取界面数据,赋值保存到列表
// 清空表单
if (this.flag === undefined) {
// 新增逻辑
let row = {"name": this.userInfo.name, "age": this.userInfo.age};
this.dataList.push(row);
} else {
// 编辑逻辑
this.dataList[this.flag].name = this.userInfo.name;
this.dataList[this.flag].age = this.userInfo.age;
}
this.userInfo.name = "";
this.userInfo.age = "";
this.flag = undefined
this.title = "新增"
},
getBtn: function (idx) {
// 取到行索引id,打印到页面
alert(idx)
},
updateBtn: function (idx) {
// 拿到行索引 点击--新建变保存
// 取出对应的数据到表单
// 修改表单 获取表单的结果
// 保存到该行
this.title = "保存";
this.flag = idx//用此来判断是编辑还是新增
let {name, age} = this.dataList[idx];
this.userInfo.name = name;
this.userInfo.age = age;
// 数据后面还是走的新增的逻辑
// 去新增界面修改
},
delBtn: function (idx) {
// 拿到行索引,删除该行
this.dataList.splice(idx, 1);
},
},
})
</script>
</body>
</html>
3.vue组件化
3.1 局部组件
先编写局部组件,然后注册,后面引用注册的组件名。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h1> 当前页面 </h1>
{{title}}
<h1> 引入子组件 </h1>
<Home></Home>
<ixxx></ixxx>
<ixxx></ixxx>
<Home></Home>
</div>
<script>
//创建子组件
const Home = {
data:function() {
return {
msg: 'hello world'
}
},
template: `
<div>
<h1>{{msg}}</h1>
<input type="text" v-model="msg"/>
<input type="button" @click="showMeg" value="点我呀">
</div>
`,
methods: {
showMeg: function () {
alert(this.msg);
}
}
}
//创建子组件
const Index = {
// 组件中的data是一个方法,并返回值(与Vue对象创建不同)
data:function() {
return {
dataList: [
{"id": 1, "title": "1234"},
{"id": 2, "title": "4567"},
]
}
},
template: `
<div>
<h1>数据列表</h1>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>标题</th>
</tr>
</thead>
<tbody>
<tr v-for="item in dataList">
<td>{{item.id}}</td>
<td>{{item.title}}</td>
</tr>
</tbody>
</table>
</div>
`
}
var app = new Vue({
el: '#app',
data: {
title: "欢迎来到智能系统",
},
//注册组件到全局
components: {
Home,
ixxx: Index
},
methods: {}
})
</script>
</body>
</html>
3.2全局组件
和局部组件不同之处,创建组件不加const,默认是var,不用注册,直接引用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h1>当前页面</h1>
{{title}}
<h1> 引入子组件 </h1>
<Home></Home>
</div>
<script>
//创建子组件
Vue.component('Home', {
data: function () {
return {
msg: '哈哈哈哈哈'
}
},
template: `
<div>
<h1>{{ msg }}</h1>
<input type="text" v-model="msg"/>
<input type="button" @click="showMeg" value="点我呀">
</div>
`,
methods: {
showMeg: function () {
alert(this.msg);
}
}
});
var app = new Vue({
el: '#app',
data: {
title: "xx系统",
},
methods: {}
})
</script>
</body>
</html>
4. vue-router路由组件
vue +
vue-router
组件 可以实现 SPA(single Page Application),即:单页面应用。
单页面应用,简而言之就是项目只有一个页面。
一个页面如何呈现多种界面的效果呢?
- 基于vue开发多个组件
- 在页面上 vue-router 用来管理这些组件,用户点击某个按钮,就显示特定的组件(数据基于Ajax或axios获取)。
- 下载到本地,后续引入到文件,注意先引入vue3
vue3下载地址
vue-router官方地址
vue-router下载地址
小结
基础就到这里了,后面利用脚手架工具写代码,安装包的时候就像python一样简单,感谢大家的关注和支持。
``