表单指令
表单指令: v-model="变量" 变量值与表单标签的value相关
v-model可以实现数据的双向绑定:v-model绑定的变量值可以影响表单标签的值,
反过来单标签的值也可以影响变量的值
v-model="变量" 变量与value有关,data里面放的是变量的默认初始值
普通:变量就代表value值
单选框:当前选中的单选框中的value值
单一复选框:变量为布尔,代表是否选中
多复选框:变量为数组,存放选中的选项value
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>表单指令title>
head>
<body>
<div id="app">
<form action="">
<input type="text" name="usr" id="usr" placeholder="请输入账号" v-model="v1">
<input type="text" v-model="v1">
{{ v1 }}
<hr>
男:<input type="radio" name="sex" value="male" v-model="v2">
女:<input type="radio" name="sex" value="female" v-model="v2">
{{ v2 }}
<hr>
卖身契:同意 <input type="checkbox" name="agree" v-model="v3">
{{ v3 }}
<hr>
爱好:<br>
男:<input type="checkbox" name="hobbies" value="male" v-model="v4">
女:<input type="checkbox" name="hobbies" value="female" v-model="v4">
哇塞:<input type="checkbox" name="hobbies" value="other" v-model="v4">
{{ v4 }}
<hr>
<button type="submit">提交button>
form>
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
v1: '123',
v2: 'male',
v3: false,
v4: ['male', 'female']
}
})
script>
html>
条件指令
v-show="布尔变量" 隐藏时,采用display:none进行渲染
v-if="布尔变量" 隐藏时,不再页面中渲染(保证不渲染的数据泄露)
----------------------------------------------------------
v-if | v-else-if | v-else
斗篷指令
[v-cloak] { display: none; }
避免页面闪烁
<style type="text/css">
[v-cloak] { display: none; }
style>
<div id="app" v-cloak>
{{ msg }}
div>
<script src="js/vue.min.js">script>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
msg: "message"
}
})
script>
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>title>
<style>
[v-cloak] { display: none; }
.box {
width: 200px;
height: 200px;
}
.r {background-color: red}
.b {background-color: blue}
.g {background-color: green}
.active {
background-color: deeppink;
}
style>
head>
<body>
<div id="app" v-cloak>
<div class="box r" v-show="is_show">div>
<div class="box b" v-if="is_show">div>
<hr>
<div class="wrap">
<div>
<button @click="page='r_page'" :class="{active: page === 'r_page'}">红button>
<button @click="page='b_page'" :class="{active: page === 'b_page'}">蓝button>
<button @click="page='g_page'" :class="{active: page === 'g_page'}">绿button>
div>
<div class="box r" v-if="page === 'r_page'">div>
<div class="box b" v-else-if="page === 'b_page'">div>
<div class="box g" v-else>div>
div>
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
is_show: false,
page: 'r_page'
}
})
script>
html>
循环指令
v-for="ele in string | array | obj"
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>循环指令title>
head>
<body>
<div id="app">
<span>{{ info }}span>
<hr>
<i v-for="c in info">{{ c }} i>
<hr>
<i v-for="(c, i) in info">{{i}}:{{c}}<br>i> c表示值,i表示索引 0:g
<hr>
<div v-for="e in stus">{{ e }}div>
<hr>
<div v-for="(e, i) in stus">{{ i }}:{{ e }}div> 0:Bob
<hr>
<div v-for="v in people">{{ v }}div> 字典的V
<hr>
<div v-for="(v, k, i) in people">{{ i }} - {{ k }}:{{ v }}div> 0 - name:猴子
<hr>
<div v-for="tea in teas"> 索引为1的不加|
<span v-for="(v, k, i) in tea"><span v-if="i !== 0"> | span>{{ k }}:{{ v }}span> name:jason | age:73 | sex:男
div>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
info: 'good good study',
stus: ['Bob', 'Tom', 'Jerry'],
people: {
name: '猴子',
age: 36.7,
sex: '女',
},
teas: [
{
name: 'jason',
age: 73,
sex: '男',
},
{
name: 'egon',
age: 74,
sex: '男',
},
{
name: 'owen',
age: 17.5,
sex: '男',
}
]
}
})
script>
html>
todolist案例
数组的操作
将comment添加到msgs数组中:unshift push 首尾增 | shift pop 首尾删
msgs.push(comment);
数组操作最全方法:splice(begin_index, count, ...args)
从哪一位开始,操作多少位,操作成什么
前台数据库
前台数据库
localStorage: 永久存储
sessionStorage:临时存储(所属页面标签被关闭后,清空)
存
localStorage.n1 = 10;
sessionStorage.n2 = 20;
取
console.log(localStorage.n1);
console.log(sessionStorage.n2);
数组等类型需要先序列化成JSON
localStorage.arr = JSON.stringify([1, 2, 3]); 数组 存
console.log(JSON.parse(localStorage.arr)); 数组 取
清空数据库
localStorage.clear();
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>todo list 案例title>
<style>
/*鼠标放到上面,字体会变成红色*/
li:hover {
color: red;
cursor: pointer;
}
style>
head>
<body>
<div id="app">
<input type="text" v-model="comment">
<button type="button" @click="send_msg">留言button>
<ul>
<li v-for="(msg, i) in msgs" @click="delete_msg(i)">{{ msg }}li>
ul>
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
comment: '',
msgs: localStorage.msgs ? JSON.parse(localStorage.msgs) : [],
},//三元表达,如果数据库中有msg,从数据库中取值,如果没有值,就返回空
methods: {
send_msg() {
// 将comment添加到msgs数组中:unshift push 首尾增 | shift pop 首尾删
// this.msgs.push(this.comment);
// 数组操作最全方法:splice(begin_index, count, ...args)
// 从哪一位开始,操作多少位,操作为什么
// this.msgs.splice(0, 2);
if (!this.comment) {
alert('请输入内容');
return false; //留言不能为空
}
this.msgs.push(this.comment);
this.comment = ''; //留完言,清空input框
localStorage.msgs = JSON.stringify(this.msgs);//同步数据库
},
delete_msg(index) {
this.msgs.splice(index, 1); //从给的索引的位置开始,操作一位,操作为空
localStorage.msgs = JSON.stringify(this.msgs); //同步数据库
}
}
})
script>
<script>
// 前台数据库
// localStorage: 永久存储
// sessionStorage:临时存储(所属页面标签被关闭后,清空)
// 存
// localStorage.n1 = 10;
// sessionStorage.n2 = 20;
// 取
// console.log(localStorage.n1);
// console.log(sessionStorage.n2);
// 数组等类型需要先序列化成JSON
// localStorage.arr = JSON.stringify([1, 2, 3]); 数组 存
// console.log(JSON.parse(localStorage.arr)); 数组 取
// 清空数据库
// localStorage.clear();
script>
html>
分隔符成员
修改插值表示式符号
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>title>
head>
<body>
<div id="app">
{{ msg }}
[{ msg }]
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
msg: 'message'
},
delimiters: ['[{', '}]'], // 修改插值表达式符号
})
script>
html>
过滤器
{ { num | f1 } }
{ { a, b | f2(30, 40) | f3 } }
filters: {
// 传入所有要过滤的条件,返回值就是过滤的结果
f1 (num) {
console.log(num);
return num * 10;
1、在filters成员中定义过滤器方法
2、可以对多个值进行过滤,过滤时还可以额外传入辅助参数
3、过滤的结果可以再进行下一次过滤(过滤的串联)
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>过滤器title>
head>
<body>
<div id="app">
<p>{{ num | f1 }}p>
<p>{{ a, b | f2(30, 40) | f3 }}p>
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
num: 10,
a: 10,
b: 20,
},
filters: {
// 传入所有要过滤的条件,返回值就是过滤的结果
f1 (num) {
console.log(num);
return num * 10;
},
f2 (a, b, c, d) {
console.log(a, b, c, d);
return a + b + c + d;
},
f3 (num) {
return num * num;
}
}
})
script>
html>
计算属性成员
1、computed:计算属性可以声明 方法属性(方法属性一定不能在data中重复声明)
2、方法属性 必须在页面中渲染,才会启用绑定的方法,方法属性的值就是绑定方法的返回值
3、绑定的方法中出现的所有变量都会被监听,任何一个变化发生值更新都会重新出发绑定方法,从而更新方法属性的值
一般用来解决的问题:一个变量值依赖于多个变量
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>title>
head>
<body>
<div id="app">
<input type="number" min="0" max="100" v-model="n1">
+
<input type="number" min="0" max="100" v-model="n2">
=
<button>{{ result }}button>
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
n1: '',
n2: '',
// result: 0, 不能在data中重复声明
},
/**
* 总结:
* 1、computed计算属性可以声明 方法属性(方法属性一定不能在data中重复声明)
* 2、方法属性 必须在页面中渲染,才会启用绑定的方法,方法属性的值就是绑定方法的返回值
* 3、绑定的方法中出现的所有变量都会被监听,任何一个变化发生值更新都会重新出发绑定方法,从而更新方法属性的值
*
* 一般用来解决的问题:一个变量值依赖于多个变量
*/
computed: {
result () {
console.log('被调用了');
n1 = +this.n1;
n2 = +this.n2;
return n1 + n2;
}
}
})
script>
html>
监听属性
watch:
1、监听的属性需要在data中声明,监听方法不需要返回值
2、监听的方法名就是监听的属性名,该属性值发生更新时就会回调监听方法
3、监听方法有两个回调参数:当前值,上一次值
{ { $data } }
{ "full_name": "", "first_name": "未知", "last_name": "未知" }
解决的问题:多个变量值依赖于一个变量值
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>title>
head>
<body>
<div id="app">
<p>姓名:<input type="text" v-model="full_name">p>
<p>姓:{{ first_name }}p>
<p>名:{{ last_name }}p>
{{$data}} //{ "full_name": "", "first_name": "未知", "last_name": "未知" }
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
full_name: '',
first_name: '未知',
last_name: '未知',
},
watch: {
// n是监听的属性当前值,o是其上一次的值,监听的属性值每次更新都会回调监听方法
/**
* 总结:
* 1、监听的属性需要在data中声明,监听方法不需要返回值
* 2、监听的方法名就是监听的属性名,该属性值发生更新时就会回调监听方法
* 3、监听方法有两个回调参数:当前值,上一次值
*
* 解决的问题:多个变量值依赖于一个变量值
*/
full_name(n, o) {
name_arr = n.split('');
this.first_name = name_arr[0];
this.last_name = name_arr[1];
},
}
})
script>
html>
冒泡排序
DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>title>
head>
<body>
<div id="app">
div>
body>
<script src="js/vue.js">script>
<script>
new Vue({
el: '#app',
data: {
}
})
script>
<script>
let arr = [3, 2, 5, 4, 1];
console.log(arr);
// 冒泡排序
// 3, 2, 5, 4, 1
// 2, 3, 4, 1, 5
// 2, 3, 1, 4
// 2, 1, 3
// 1, 2
for (let i = 0; i < arr.length - 1; i++) { // 外层循环控制趟数
for (let j = 0; j < arr.length - 1 - i; j++) { // 内存循环控制比较次数
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
stus = [
{
name: 'Bob',
grade: 98
},
{
name: 'Tom',
grade: 87
},
{
name: 'Jerry',
grade: 92
},
];
// 按照分数进行排名
for (let i=0; i<stus.length-1; i++) {
for (let j=0; j<stus.length-1-i; j++) {
// 处理条件即可
if (stus[j].grade > stus[j + 1].grade) {
let temp = stus[j];
stus[j] = stus[j + 1];
stus[j + 1] = temp;
}
}
}
console.log(stus);
script>
html>