Vue
基础语法
mustache 语法
<h2>{{ one + '' + two }}</h2>
<h2>{{ one }} {{ two }}</h2>
<h2>{{ three * 2 }}</h2>
data() {
return {
one: '一',
two: '二',
three: 3
}
}
通过{{}},template里既可以使用**data()**里面定义的数据啦
低频指令
- 本质就是自定义属性
这些指令很少使用~
v-cloak
防止页面加载时出现闪烁问题
<div v-cloak>{{ msg }}</div>
data() {
return {
msg: 'hello'
}
}
[v-cloak] {
display: none;
}
v-text
- 用于将数据填充到标签中,作用与插值表达式类似,但是没有闪动问题
- 如果数据中有 HTML 标签会将 html 标签一并输出
- 注意:此处为单向数据绑定,数据对象上的值改变,插值会发生变化;但是当插值发生变化并不会影响数据对象的值
<p v-text="msg"></p>
data() {
return {
msg: 'hello'
}
}
v-html
- 用法和 v-text 相似 但是他可以将 HTML 片段填充到标签中
- 可能 有安全问题, 一般只在可信任内容上使用
v-html,永不用在用户提交的内容上 - 它与 v-text 区别:v-text输出的是纯文本,浏览器不会对其再进行 html 解析,但 v-html 会将其当 html 标签解析后输出。
<p v-html="html"></p>
<p v-text="text"></p>
<p>{{ message }}</p>
data() {
return {
message: '<span>通过双括号绑定</span>',
html: '<span>html标签在渲染的时候被解析</span>',
text: '<span>html标签在渲染的时候被源码输出</span>',
}
}
v-pre
- 显示原始信息跳过编译过程
- 跳过这个元素和它的子元素的编译过程。
- 一些静态的内容不需要编译加这个指令可以加快渲染
<span v-pre>{{ this will not be compiled }}</span> <span v-pre>{{ msg }}</span>
data() {
return {
msg: 'Hello'
}
}
v-once
- 执行一次性的插值(当数据改变时,插值处的内容不会继续更新)
<span v-once>{{ msg }}</span>
data() {
return {
msg: 'Hello'
}
}
插值表达式 v-text v-html 三者区别
| 差值表达式 | 闪动问题---v-cloak 解决 |
|---|---|
| v-text | 没有闪动问题 |
| v-html | 安全问题 |
自定义指令
除了 v-for、v-show、v-model 等等指令,vue 也允许我们自定义指令
在某些情况下,需要对元素进行 DOM 操作,这时就需要用到自定义指令了
通过directives 选项(局部,只能在当前组件使用;全局的要使用 app 的directive())
案例-某个元素挂载完成后自动获取焦点
<input type="text" ref="input" />
import { ref } from 'vue'
setup() {
const inputRef = ref(null)
onMounted(() => {
inputRef.value.focus()
})
return {
input
}
}
这是当前输入框,要是想其它输入框也能挂载完成之后获取焦点呢?
你可能会想到复用。非常棒!
vue 中复用代码的形式主要是组件,当然还有Composition API抽取成一个hook 函数
还有一个更简单的方法:自定义指令
我们来自定义一个v-focus指令(当然,vue 中并没有这个指令哦)
<input type="text" v-focus />
directives: {
focus: {
mounted(el) {
el.focus()
}
}
}
这是局部的,当input被挂载完成后,执行input.focus()
来看看全局是怎么做的
import { createApp } from "vue";
const app = createApp(根组件);
app.directive("focus", {
mounted(el) {
el.focus();
},
});
指令的生命周期
和组件的生命周期类似都是在特定时间节点回调对应函数
自定义指令的修饰符
自定义指令的修饰符放在哪里呢?
指令生命周期函数的第二参数
<input type="text" v-focus.test="hhh" />
directives: {
focus: {
mounted(el, bindings) {
el.focus()
console.log(bindings.modifiers)
}
}
}
你就会在控制台看到 hhh
案例-转化时间戳
在开发中,大多数情况下从服务器获取到都是时间戳;
需要将时间戳转化成具体格式的时间来展示;
vue2 可以使用过滤器来完成(vue3 已移除啦);
vue3 中可以通过computed()或者自定义一个方法完成;
其实还可以通过自定义指令
可以指定一个v-format-time的指令
<h2 v-format-time>{{ timestamp }}</h2>
setup() {
const timestamp = 1623352193
return {
timestamp
}
}
来全局注册这个指令
import { createApp } from "vue";
import dayjs from "dayjs";
const app = createApp(根组件);
app.directive("format-time", {
mounted(el) {
const textContent = el.textContent;
let timestamp = parseInt(textContent);
// 如果是10位,那就是s,需转化为ms
if (textContent.length === 10) {
timestamp = timestamp * 1000;
}
el.textContent = dayjs(timestamp).format("YYYY-MM-DD HH:mm:ss");
},
});
这里使用第三方库dayjs进行转化
如果用户想自己设置格式,可以传参进来
<h2 v-format-time="YYYY/MM/DD">{{ timestamp }}</h2>
import { createApp } from "vue";
import dayjs from "dayjs";
const app = createApp(根组件);
app.directive("format-time", {
mounted(el, bindings) {
let formatString = bindings.value;
// 如果没传就用默认的
if (!formatString) {
formatString = "YYYY-MM-DD HH:mm:ss";
}
const textContent = el.textContent;
let timestamp = parseInt(textContent);
// 如果是10位,那就是s,需转化为ms
if (textContent.length === 10) {
timestamp = timestamp * 1000;
}
el.textContent = dayjs(timestamp).format(formatString);
},
});
数据绑定 v-bind
v-bind:class,语法糖-->:class
<img v-bind:src="url" alt="" /> <img :src="url" alt="" />
data() {
return {
url: 'https://pics5.baidu.com/feed/63d9f2d3572c11df69f722f63ced03d9f603c211.jpeg?token=447e2f91bfb2194ae769094c0ba5c2a5'
}
}
动态绑定 class
对象形式
<h2 :class="{ active: isActive }">你好</h2>
<button v-on:click="btnClick">点击</button>
data() {
return {
isActive: false
}
},
methods: {
btnClick: function () {
this.isActive = !this.isActive
}
}
当你点击按钮,你会发现 h2 出现一个叫 active 的类
数组形式
<h2 :class="[active, line]">你好</h2>
data() {
return {
active: 'aa',
line: 'bb'
}
}
你会发现 h2 有aa,bb这两个类名了
动态绑定 style
对象形式
<h2 :style="{ color: finalColor }">你好</h2>
data() {
return {
finalColor: 'red'
}
}