文章目录
- 一、插值表达式
- 二、Vue常用指令
- 2.1 内容渲染指令
- 2.2 条件渲染指令
- 2.3 事件绑定指令
- 2.4 属性绑定指令
- 2.5 列表渲染指令
- 2.6 双向绑定指令
- 三、案例:追风记事本
一、插值表达式
插值表达式是一种Vue的模板语法,我们可以用插值表达式渲染出Vue提供的数据。
1、以下的情况都是表达式:
money + 100
money - 100
money * 10
money / 10
price >= 100 ? '真贵':'还行'
obj.name
arr[0]
fn()
obj.fn()
2、插值表达式语法:{{ 表达式 }}
<h3>{{title}}<h3>
<p>{{nickName.toUpperCase()}}</p>
<p>{{age >= 18 ? '成年':'未成年'}}</p>
<p>{{obj.name}}</p>
<p>{{fn()}}</p>
3.错误用法
1.在插值表达式中使用的数据 必须在data中进行了提供
<p>{{hobby}}</p> //如果在data中不存在 则会报错
2.支持的是表达式,而非语句,比如:if for ...
<p>{{if}}</p>
3.不能在标签属性中使用 {{ }} 插值 (插值表达式只能在标签中间使用)
<p title="{{username}}">我是P标签</p>
二、Vue常用指令
vue 中的指令按照不同的用途可以分为如下 6 大类:
- 内容渲染指令(v-html、v-text)
- 条件渲染指令(v-show、v-if、v-else、v-else-if)
- 事件绑定指令(v-on)
- 属性绑定指令(v-bind)
- 双向绑定指令(v-model)
- 列表渲染指令(v-for)
2.1 内容渲染指令
内容渲染指令用来渲染 DOM 元素的文本内容,常用的内容渲染指令有如下2个:
从下图可以知道,这两个指令都会覆盖标签中的内容。
2.2 条件渲染指令
条件判断指令,用来控制 DOM 的显示与隐藏。条件渲染指令有如下2个:
如下图代码,flag为true时,才会在网页上渲染数据。
下图是v-else-if、v-else的使用:当gender为1时,页面显示男,否则页面显示女;当score大于等于90时,页面显示成绩评定A,依次类推。
2.3 事件绑定指令
使用Vue时,为DOM注册事件,极其的简单,语法如下:
内联语句: 通过点击加减来控制数值大小。
事件处理函数传参: 如果不传递任何参数,则方法无需加小括号;methods方法中可以直接使用 e 当做事件对象;如果传递了参数,则实参表示事件对象,固定用法。
2.4 属性绑定指令
如下图所示,通过属性绑定,可以在页面上显示可爱的图片。
2.5 列表渲染指令
Vue提供了 v-for 列表渲染指令,用来基于一个数组来循环渲染一个列表结构。
如下图,通过点击删除事件,页面会删除对应数据,需要注意del()的写法。
v-for中的key:
- key 的值只能是字符串或数字类型
key 的值必须具有唯一性
推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应)
2.6 双向绑定指令
如下图,当我们把username和password进行双向数据绑定的时候,我们可以快速的获取或者设置表单元素内容。
三、案例:追风记事本
分析:
@keyup.enter="add" v-model="todoName"
:当我们按下回车键时,会触发add事件,用v-model完成双向数据绑定。
del()
用来删除任务、add()
用来新增任务,如果输入框没有任何内容,则提示"请输入任务名称";this.list.unshift()
用来把任务数据放入list数组中,以时间戳为id值,todoName为name值;delAll()
用来重置数组为空。
完整代码如下:
<!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" />
<link rel="stylesheet" href="./css/index.css" />
<title>记事本</title>
</head>
<body>
<!-- 主体区域 -->
<section id="app">
<!-- 输入框 -->
<header class="header">
<h1>追风记事本</h1>
<input @keyup.enter="add" v-model="todoName" placeholder="请输入任务" class="new-todo" />
<button class="add" @click="add">添加任务</button>
</header>
<!-- 列表区域 -->
<section class="main">
<ul class="todo-list">
<li class="todo" v-for="(item, index) in list" :key="item.id">
<div class="view">
<span class="index">{{index+1}}.</span> <label>{{item.name}}</label>
<button class="destroy" @click="del(item.id)"></button>
</div>
</li>
</ul>
</section>
<!-- 统计和清空 -->
<footer class="footer" v-show="list.length > 0">
<!-- 统计 -->
<span class="todo-count">合 计:<strong>{{list.length}}</strong></span>
<!-- 清空 -->
<button class="clear-completed" @click="delAll">
清空任务
</button>
</footer>
</section>
<!-- 底部 -->
<script src="../vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
todoName: '',
list: []
},
methods: {
del(id) {
this.list = this.list.filter(a => a.id !== id)
},
add() {
if (this.todoName.trim() === '') {
alert('请输入任务名称')
return
}
this.list.unshift({
id: +new Date(),
name: this.todoName
})
this.todoName = ''
},
delAll() {
this.list = []
}
},
})
</script>
</body>
</html>
运行效果: