插值语法: {{}}
在html中书写, 主要出现在 双标签的内容区域, {{ JS代码... }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- DOM的痛点:
查询代码复杂 + 选择器书写繁琐 且 需要理清DOM元素之间的关系 -->
<div id="app">
<!--
{{}}: 叫做 插值语法, Vue规定的格式, 类似于模板字符串的${} -->
<h2>{{title}}</h2>
<div>
<div>
<div>msg: {{msg}}</div>
<div>{{word}}</div>
<div>{{name}}</div>
<div>{{skill}}</div>
</div>
</div>
</div>
<!-- vue.js 是开发版, 代码有错误 会在后台出现提示 -->
<!-- vue.min.js 是生产版, 没有错误提示, 体积小, 适合上线时使用 -->
<script src="./vendor/vue.js"></script>
<script>
// new Vue(): 创建Vue实例对象, Vue来自于 上方引入的脚本
new Vue({
// 对象类型中, 是vue相关配置项 -- 都是固定的名称
// el: element元素; 值是选择器; 代表当前vue要管理哪个元素
el: "#app",
// data: 数据. 用途:凡是显示在页面上的数据 都放在此属性中
/* Vue底层会自动搜索 el 指定元素中,
标签内容是{{}} 的. 就认为是Vue应该处理的变量, 进行对应的替换操作*/
data: {
title: "Hello Vue!",
msg: "这是第一个vue代码",
word: "Nice To meet you!",
name: "亮亮",
skill: "什么都没讲",
},
})
</script>
</body>
</html>
事件:
-
旧写法, 由于复杂基本上不用:
<el v-on:事件名="">
-
新写法, 简单易用:
<el @事件名=""/>
-
默认参数:
<el @click="函数" />
注意函数不加()结尾-
默认会把 事件本身作为参数传入到函数中
-
-
自定义参数:
<el @click="函数(参数, 参数..., $event)"
-
使用关键词
$event
来代表事件参数
-
事件:①
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<div>{{msg}}</div>
<!-- 原生语法: onclick -->
<!-- 为了与原生区分, 使用 @ 代替 on -->
<button @click="show1">点我1</button>
<!-- 旧写法, 已淘汰. v-on:click -->
<button v-on:click="show1">点我2</button>
</div>
<script src="./vendor/vue.js"></script>
<script>
//语法糖介绍:
let a = {
// 最完整写法
desc: function desc() {},
//可以省略 function 关键词, 因为太长了
desc1() {},
}
console.log(a)
// 声明vue 管理 id='app' 的元素, 增加data. msg: 666
var vm = new Vue({
el: "#app",
data: {
msg: 666,
},
// methods(方法): 官方规定, 此属性中写 函数, 可以全局到处使用
methods: {
// 相当于: show1: function(){}
show1() {
alert(1111)
// 为 msg 变量 +1
// this的指向: 普通函数的this指向运行时所在对象
/* 此处: 要查看真正生成的 vue 对象结构,
msg就是存储在vue对象中的. 所以采用 this.msg 来读取*/
this.msg++
},
},
})
console.log(vm) //查看vue对象的样子
</script>
</body>
</html>
事件参数:②
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<p>选择你最喜欢的英雄: <b>{{hero}}</b></p>
<button @click="doChoose">托儿索</button>
<button @click="doChoose">儿童劫</button>
<button @click="doChoose">小学僧</button>
<button @click="doChoose">人头狗</button>
</div>
<script src="./vendor/vue.js"></script>
<script>
// 创建 vue 对象, 管理 id='app' 元素, hero默认值: '待定'
new Vue({
el: "#app",
data: { hero: "待定" },
methods: {
// 参数名随意: 这叫形参, 习惯上是 e 或 event
doChoose(event) {
// 事件触发时, 默认带有参数: 事件本身的相关内容
console.log(event)
// target 就是触发当前事件的 DOM 元素
let name = event.target.innerHTML
this.hero = name // 把按钮上的名称 赋值给 hero 变量
},
},
})
</script>
</body>
</html>
事件自定义参数:③
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<p>数量: {{count}}</p>
<!-- 注意: 默认写法 @click="changeCount" 此时事件本身会作为参数传递进入 -->
<!-- 如果 自定义的传参, 官方提供了关键词: $event, 用来代表事件参数 -->
<!-- Vue本身就对DOM进行了封装, 提倡的是 代码本身 0 DOM -->
<!-- 所以传参的方式更加推荐, 不推荐使用DOM属性! -->
<button data-delta="+1" @click="changeCount(+1, $event)">数量加1</button>
<button data-delta="-1" @click="changeCount(-1, $event)">数量减1</button>
</div>
<script src="./vendor/vue.min.js"></script>
<script>
new Vue({
el: "#app",
// 此处是数字类型
data: { count: 10 },
methods: {
// delta: 值是 -1 或 +1
changeCount(delta, e) {
console.log(e)
this.count = this.count + delta
},
},
})
</script>
</body>
</html>
属性
属性的绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<!-- {{}} 主要是双标签的内容 使用 -->
<p>{{imgs[0]}}</p>
<!-- 属性用特殊写法: -->
<!-- 旧写法, 基本不用 -->
<img v-bind:src="imgs[0]" />
<!-- 新写法: :属性名="JS代码" -->
<img :src="imgs[current]" />
<button @click="goNext">下一张</button>
</div>
<script src="./vendor/vue.js"></script>
<script>
new Vue({
el: "#app",
data: {
imgs: ["./img/1.jpg", "./img/2.jpg", "./img/3.jpg", "./img/4.jpg"],
current: 0, //当前序号
},
methods: {
goNext() {
this.current++
// 取余: 4 %4 == 0, 超过最大序号 自然回到0
// this.current %= 4
// 用图片的个数作为 取余, 可以更加灵活.
// 这样图片数组有变化, 此处的余数自然就会变化
this.current %= this.imgs.length
},
},
})
</script>
</body>
</html>
隐藏和显示
①:v-show
:
值是true则显示, 值是false 则隐藏本质是利用 css 的display:none
实现隐藏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<!-- css 隐藏元素: 通过 display -->
<p style="display: none">这是一段消息</p>
<!-- show: 显示,呈现 -->
<p v-show="show">这是一段消息</p>
<button @click="doShow">显示</button>
<button @click="doHide">隐藏</button>
</div>
<script src="./vendor/vue.js"></script>
<script>
new Vue({
el: "#app",
// show: 代表是否要显示
data: { show: true },
methods: {
doShow() {
this.show = true
},
doHide() {
this.show = false
},
},
})
</script>
</body>
</html>
②:v-if
, v-else
, v-else-if
:
条件真则添加DOM元素, 添加假则移除DOM元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- v-if: 条件为真, 加载元素; 条件为假, 删除元素 -->
<!-- v-if 利用删除或添加DOM元素实现隐藏/显示. -->
<!-- v-show性能高,推荐; v-if要删DOM,性能低,不推荐 -->
<!-- if...else... -->
<div id="app">
<p>张三的面试分数: {{score}}</p>
<!-- v-show: true显示 false隐藏 -->
<button @click="changeScore(-10)" v-show="score>0">-10</button>
<button @click="changeScore(+10)" v-show="score<100">+10</button>
<!-- if ... else ...: 满足条件显示xxx 否则显示xxx -->
<p v-if="score>=60">及格</p>
<p v-else>不及格</p>
</div>
<script src="./vendor/vue.js"></script>
<script>
new Vue({
el: "#app",
data: { score: 60 },
methods: {
changeScore(delta) {
this.score += delta
},
},
})
</script>
</body>
</html>
/*********************************分*割*线********************************************/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!-- if...elseif...elseif...else... -->
<div id="app">
<p>小亮的考试分数: {{score}}</p>
<button @click="changeScore(-10)" :disabled="score==0">-10</button>
<button @click="changeScore(+10)" :disabled="score==100">+10</button>
<!-- 不同的条件 加载不同的DOM元素 -->
<p v-if="score==100">Perfect!</p>
<p v-else-if="score>=90">优秀</p>
<p v-else-if="score>=80">良好</p>
<p v-else-if="score>=60">及格</p>
<p v-else>不及格</p>
</div>
<script src="./vendor/vue.js"></script>
<script>
new Vue({
el: "#app",
data: { score: 60 },
methods: {
changeScore(delta) {
this.score += delta
},
},
})
</script>
</body>
</html>
for循环
of
和 in
关键词 效果一样, 没任何区别, 挑喜欢的
-
<el v-for="item of 数组/对象"
-
带有序号:
<el v-for="(item,index) in 数组/对象"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<ul>
<!-- 回顾遍历数组: for (let item of names) { } -->
<!-- 写在哪个元素上, 就可以遍历生成此元素 -->
<!-- of 写成in 效果相同 -->
<li v-for="item of names">{{item}}</li>
<!-- 练习: -->
<div v-for="abc of names">{{abc}}</div>
<p v-for="x in names">{{x}}</p>
<h4></h4>
</ul>
</div>
<script src="./vendor/vue.js"></script>
<script>
new Vue({
el: "#app",
data: {
names: ["欧豪", "小名", "暗暗", "尼古拉是"],
},
})
</script>
</body>
</html>
/*******************分隔线************************/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
<ul>
<!-- 可以写 (item,index) 就代表 元素 和 序号 -->
<li v-for="(item,index) in names">
<b>{{index}}</b>
<span>.{{item}}</span>
</li>
<!-- 遍历对象: in 和 of 效果一致; 挑你喜欢的 -->
<li v-for="(item,index) of emp">
<b>{{index}}</b>
<span>{{item}}</span>
</li>
</ul>
</div>
<script src="./vendor/vue.js"></script>
<script>
new Vue({
el: "#app",
data: {
names: ["欧豪", "小名", "暗暗", "尼古拉是","张三"],
emp: { name: "尼古拉是", age: 44, phone: "18799887788" },
},
})
</script>
</body>
</html>