Vue模板
模板写法
一、完整版,写在HTML里
1 | <div id='xxx'> |
二、完整版,写在选项里
1 | <div id='app'></div> |
三、非完整版,配合 xxx.vue 单文件组件
1 | // xxx.vue |
1 | import Xxx from './xxx.vue' |
展示内容
表达式
1
2
3
4
5
6
7{{ object.a }} // 表达式
{{ n + 1 }} // 可以写任何运算
{{ fn(n) }} // 可以调用函数
/*
如果值 为 undefined 或 null 就不显示
另一种写法为 <div v-text="表达式"></div>
*/HTML 内容
假设
data.x
值为<strong>hi</strong>
<div v-html='x'></div>
即可显示粗体的 hi展示
<div v-pre>{{ n }}</div>
v-pre
不会对模板进行编译
绑定属性 v-bind
绑定 src
<img v-bind:src="x" />
v-bind: 简写为:
<img :src="x" />
绑定对象
<div :style="{border: '1px solid red, height: 100'}"></div>
绑定事件 v-on
v-on : 事件名
1
2
3
4
5
6
7
8
9
10<button v-on:click="add">+1</button>
点击之后,Vue 会运行 add()
<button v-on:click="xxx(1)">xxx</button>
点击之后,Vue 会运行 xxx(1)
<button v-on:click="n+=1">xxx</button>
点击之后,Vue 会运行 n += 1
即发现 函数就加括号调用之,否咋就直接运行代码缩写
<button @click"add">+ 1</button>
, 正常人都用缩写🤗
条件判断 v-if v-else-if v-else
if ... else
1 | // 不处于 DOM 树中 |
循环 v-for
for(value, key) in 对象 或 数组
1 | <ul> |
显示/隐藏 v-show
v-show
1 | <div v-show="n % 2 === 0"> |
v-clock
HTML 绑定 Vue实例,在页面加载时会闪烁,在 css 中添加 [v-clock]{ display: none; }
v-once
v-once 这个指令不需要任何表达式,它的作用就是定义它的元素或组件只会渲染一次,包括元素或者组件的所有字节点。首次渲染后,不再随着数据的改变而重新渲染。也就是说使用 v-once,那么该块都将被视为静态内容。
如果显示的信息后续不需要再修改,使用 v-once,这样可以提高性能。
指令 directive
什么是指令?
<div v-text="x"></div>
<div v-html="x"></div>
以 v- 开头的就是指令。
语法
v -指令名:参数 = 值,例:v-on:click = add
如果值里没有特殊字符,则可以不加引号
有些指令没有参数和值,例:v-pre
有些指令没有值,例:v-on:click.prevent
阻止默认事件,@click.prevent='x'
阻止默认事件并执行 x 函数
修饰符
有些指令支持修饰符
1 | @click.stop = "add" 表示阻止事件传播/冒泡 |
一共多少修饰符?
v-on
支持的有
1 | .{keycode | keyAlias} |
v-bind
支持的有
1 | .prop .camel .sync |
v-model
1 | .lazy .number .trim |
重点记忆:
.stop
.prevent
.sync
.sync (重点)
场景描述:爸爸给儿子钱,儿子要 花钱怎么办,示例
答:儿子打电话(触发事件)向爸爸要钱。
vue规则:
- 组件不能修改 props 外部数据
this.$emit
可以触发事件,并传参$event
可以获取$emit
的参数
1 | :money.sync="tota" |
这样实现了父子组件的双向绑定
子组件使用 $emit 向父组件发送事件
1 | this.$emit('update:title', newTitle) |
父组件监听这个事件并更新数据
1 | <text-document |
为了方便这种写法,vue 提供了 .sync 修饰符,也就是一种简写方式语法糖:
1 | <text-document v-bind.sync="doc"></text-document> |