记录一些 Vue 知识

常用标签属性

v-text 和 v-html

  • v-text

相当于 innerText 但是响应式
一般不用 直接 {{ text }}

  • v-html

相当于 innerHtml 但是响应式

v-show 和 v-if

区别,一个是隐藏,一个是小消失

  • v-show

根据值的真假,是否显示组件

  • v-if

根据值的真假,是否渲染组件

v-else 和 v-else-if

不好说,借来官网示例理解

  • v-else
<div v-if="Math.random() > 0.5">Now you see me</div>
<div v-else>Now you don't</div>
  • v-else-if
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else-if="type === 'C'">C</div>
<div v-else>Not A/B/C</div>

v-for

动态生成多个模板元素

<div v-for="item in items">{{ item.text }}</div>
<div v-for="(item, index) in items"></div>
<div v-for="(value, key) in object"></div>
<div v-for="(value, name, index) in object"></div>

v-on

类似 onclick addEventerListener
可以简写为@

<button @click="要执行的函数或代码">按钮</button>

可以便捷的阻止事件冒泡通
过加入 .prevent .stop 来代替
event.preventDefault()event.stopPropagation()

<a @click.stop="doThis"></a>
<form @submit.prevent="onSubmit"></form>
<a @click.stop.prevent="doThat"></a>

v-bind 和 v-model

使用在元素属性中(区别于 {{ }} )的数据绑定

  • v-bind

数据单向绑定
(简写为 :attr="varF")

<a :herf="url">{{ url }}</a>
  • v-model

数据双向绑定,通常用于表单元素
(代替 value 属性?)

<input v-model="message" placeholder="edit me" />
<p>Message is: {{ message }}</p>

仅限:

  • <input>
  • <select>
  • <textarea>
  • components

修饰符

  • .lazy - 监听 change 事件而不是 input
  • .number - 将输入的合法字符串转为数字
  • .trim - 移除输入内容两端空格

v-slot

插槽相关,用于指定插槽名字

<template v-slot:slotname> </template>

可以缩写

<template #slotname> </template>

其他

父组件到子组件的传参

通过 provide 传出 inject 接收

父组件

import { provide } from "vue";

var a = ref(0);
var b = () => {
  console.log(1);
};
// 支持变量和函数
provide("provide_a", a);
provide("provide_fun_b", b);

子组件

import { inject } from "vue";

var a = inject("provide_a");
var b = inject("provide_fun_b");

匿名插槽 和 具名插槽

普通自闭合标签

<Com2 />

匿名插槽

<Com2>
  <div>插进来了</div>
</Com2>

具名插槽,需要指定名称,有两个写法

<Com2>
    <template v-slot=slotProps>
        <div>写法 1</div>
    </template>

    <template #slotProps>
        <div>写法 2</div>
    </template>
</Com2>

com2.vue
slot 同时写的话根据传入的插槽类型自动选择生效

<template>
  <div>组件 2 开始</div>

  <slot />
  <slot name="slotProps" />

  <div>组件 2 结束</div>
</template>

子组件到父组件的传参

父组件

<template>
    <Com2 #slotProps="data">
        <div>{{ `${data.apple} + ${data.paper}` }}</div>
    </Com2>
</template>

子组件

<template>
  <div>组件 2 开始</div>

  <slot name="slotProps" apple="apple" paper="paper" />

  <div>组件 2 结束</div>
</template>

## 生命周期函数

一些 on 开头的函数

父组件

<template>
	<Div2 v-if="show" />
	<input type="button" value="切换" @click="delete_div">
</template>

<script setup>
import Div2 from './components/2.vue'
import { ref } from 'vue'

var show = ref(true);
var delete_div = () => {
	show.value = !show.value;
}
</script>

v-if 不仅仅控制元素的可见性
它还会根据条件动态地创建或销毁 DOM 元素
因此可以用来测试挂载和卸载组件

子组件 2.vue

<template>
    num: {{ num }}
    <input type="button" value="添加" @click="add">
</template>

<script setup>
import {
    ref,
    onBeforeMount, onMounted,
    onBeforeUpdate, onUpdated,
    onBeforeUnmount, onUnmounted,
} from "vue";

var add = () => {
    num.value++;
};

var num = ref(0);

onBeforeMount(() => {
    console.log("[挂载] 组件 1 挂载前");
});
onMounted(() => {
    console.log("[挂载] 组件 1 挂载");
});

onBeforeUpdate(() => {
    console.log("[更新] 组件 1 更新前");
});
onUpdated(() => {
    console.log("[更新] 组件 1 更新");
});


onBeforeUnmount(() => {
    console.log("[卸载] 组件 1 卸载前");
});
onUnmounted(() => {
    console.log("[卸载] 组件 1 卸载");
});
</script>

toreftorefs

用于将响应式数据转换为 ref。

import { reactive, toRef, toRefs } from "vue";

const state = reactive({
  count: 0,
});

const state = reactive({
  count: 0,
  name: "Vue",
});

const count = toRef(state, "count");
const { count, name } = toRefs(state);