当前位置: 首页 > ai >正文

Vue3笔记

创建组件并绑定到DOM

import { createApp } from 'vue';
import MyApp from './MyApp.vue';const myApp = createApp(MyApp);
myApp.mount('#myApp'); // <div id="myApp"></div>

Vue文件示例

<script setup>
import { ref } from 'vue'
const count = ref(0)
</script><template><button @click="count++">Count is: {{ count }}</button>
</template><style scoped>
button {font-weight: bold;
}
</style>

全局错误处理

myApp.config.errorHandler = (error) => {};

模板语法

文本插值

<!--
import { ref } from 'vue';
const userName = ref("");
-->
<p>Hello, {{ userName }}!</p>

绑定动态属性

<!-- 绑定属性 -->
<p v-bind:id="dynamicId"></p>
<p :id="dynamicId"></p>
<p v-bind:id></p> <!-- 等效于 v-bind:id="id",下同 -->
<p :id></p><!-- 绑定多个属性 -->
<!--
const multiplyAttributes = {id: 'myId',class: 'myClass',style: 'background-color:green'
};
-->
<div v-bind="multiplyAttributes"></div><!-- 绑定参数 -->
<a v-bind:href="url"></a>
<a :href="url"></a><!-- 条件指令 -->
<div v-if="display"></div>
<div v-show="display"></div><div v-if="type === 'A'"></div>
<div v-else-if="type === 'B'"></div>
<div v-else></div><!-- 绑定事件 -->
<div v-on:click="clickFunction"></div>
<div @click="clickFunction"></div><!-- 绑定动态参数/事件 -->
<a v-bind:[dynamicAttributeName]="url"></a>
<a :[dynamicAttributeName]="url"></a>
<div v-on:[dynamicEventName]="functionName"></div>
<div @[dynamicEventName]="functionName"></div><!-- 修饰符 -->
<div @submit.prevent="submitFunction"></div> <!-- 调用event.preventDefault() --><!-- 绑定样式类 -->
<!--
const isActive = ref(true);
// 当isActive为真时,渲染为 <div class="active"></div> 。
-->
<div :class="{ active:isActive }"></div><!-- 列表渲染 -->
<li v-for="item in items">{{ item.name }}
</li>
<li v-for="(item,index) in items">{{ index }} {{ item.name }}
</li>
<span v-for="n in 10"> {{ n }} </span> <!-- 渲染1..10。 --><MyComponent v=for="item in items" :key="item.id" />
<MyComponent v-for="(index,item) in items" :key="item.id" :index="index" :item="item" />

声明响应状态并发布

<script setup>
import { ref } from 'vue';
const count = ref(0);function increaseCount() {count.value++;
}
</script>

组件

注册组件

<script setup>
import MyComponent from './MyComponent.vue';
</script>

声明属性

<script setup>
defineProps(['foo']);
defineProps({name: String
});
</script>

监听属性变化

<script setup>
const props = defineProps(['foo']);
watchEffect(() => { console.log(props.foo); });
</script>

声明自定义事件

<script setup>
const emit = defineEmits(['foo', 'bar']);function fire() {emit('foo');
}
</script>

定义模型

<script setup>
const first = defineModel(first');
const second = defineModel(second');
</script><template>
<input type="text" v-model="first" />
<input type="text" v-model="second" />
</template>

模型实际上是双向的ref。每个v-model只包含一个简单的状态,并非整个组件整体状态的聚合。组件的整体状态由多个v-model组成。

响应状态ref、属性props、模型model的区别

响应状态用于单向输出,负责控制界面状态。属性用于单向输入,负责向组件传递信息。模型用于双向绑定,用于向组件传递信息,并且这个信息也要同步输出到界面的情况。

插槽

插槽是模板中的动态部分,其内容根据组件标签的innerHTML动态替换。假设有下面的组件

<!-- FancyButton -->
<template><button class="fancy"><slot></slot></button>
</template>

我们给出组件的使用示例和实际渲染结果。

<FancyButton>Haha</FancyButton>
<button class="fancy">Haha
</button>

组件可以包含多个插槽,此时要为插槽分配名字。

<template><slot name="header"></slot><slot name="body"></slot>
</template>

在使用这种组件时,需要通过<template>标签绑定对应插槽。

<div><MyComponent><template v-slot:header>header line</template><template #body> <!-- #是v-slot:的缩写 -->body content</template></MyComponent>
</div>

非本地属性

组件可以将自己的属性提供给下级组件使用。

<script setup>
import { ref, provide } from 'vue';const count = ref(0);
function increase() {count.value++;
}provide('count', {count,increase
});
</script>
<script setup>
import { inject } from 'vue';const { count, increase } = inject('count');</script>

如果不希望下级组件修改属性,可以通过readonly方法提供只读属性。

<script setup>
import { ref, readonly, provide } from 'vue';
const count = ref(0);
provide('count', readonly(count));
</script>

定义和使用组合式函数

// mouse.js
import { ref, onMounted, onUnmounted } from 'vue';export function useMouse() {const x = ref(0);const y = ref(0);function update(event) {x.value = event.pageX;y.value = event.pageY;}onMounted(() => window.addEventListener('mousemove', update));onUnmounted(() => window.removeEventListener('mousemove', update));return {x, y};
};
<script setup>
import { useMouse } from './mouse.js';const { x, y } = useMouse();
</script>
import { ref } from 'vue';export function useFetch(url) {const data = ref(null);const error = ref(null);fetch(url).then((res) => res.json()).then((json) => (data.value = json)).catch((err) => (error.value = err));return { data, error };
}

选项式API

选项式API的最大优点在于可以脱离打包工具,使用传统的 <script> 标签就可以使用Vue。选项式API创建和挂载应用的方法和组合式API一致,区别在于定义组件的方法。选项式API返回一个对象作为组件,对象包含以下成员:

  • template 字符串,包含HTML模板。
  • data 方法,返回值是组件的状态。
  • computed 方法,返回值是组件的只读状态。
  • props 数组,组件属性名列表。
  • methods 对象,定义了组件上的方法。
  • created/mounted/unmounted 方法,生命周期回调方法。
  • provide 对象,提供给下级组件的对象的名字和值。
  • inject 数组,从上级组件接受的对象名字列表。
http://www.xdnf.cn/news/281.html

相关文章:

  • 2364. 统计坏数对的数目 之 灵活思想、学会变形
  • 大模型Rag - embedding
  • windows下安装mcp servers
  • 从零到精通:用 GoFrame 和 go-resty 优雅调用第三方 HTTP API
  • DDoS防御发展史
  • 如何快速构建跨系统的数据同步机制?
  • uni.createInnerAudioContext踩坑duration在真机环境一直为0
  • RAG-概述
  • 贪心、动态规划、其它算法基本原理和步骤
  • Kaamel隐私与安全分析报告:Microsoft Recall功能评估与风险控制
  • VMWARE安装ubuntu
  • 代码随想录算法训练营第三十八天| 322. 零钱兑换 279.完全平方数 139.单词拆分
  • javaSE.类型擦除机制
  • k8s教程3:Kubernetes应用的部署和管理
  • Foundation Agent:深度赋能AI4DATA
  • 宿舍DIY迷你空调实施方案
  • 敏捷开发管理流程
  • Qt 创建QWidget的界面库(DLL)
  • 论坛测试报告
  • redis不要以root权限启动(linux)
  • c加加重点学习之day03
  • 仿腾讯会议项目开发——网络嵌入
  • 软件测试之接口测试详解
  • 开源AI守护每一杯------奶茶咖啡店视频安全系统的未来之力
  • SQL-子查询
  • iPaaS应用集成平台在交通运输行业有哪些应用场景
  • (51单片机)LCD显示数据存储(DS1302时钟模块教学)(LCD1602教程)(独立按键教程)(延时函数教程)(I2C总线认识)(AT24C02认识)
  • 643SJBHflash个人网站
  • 【Python爬虫基础篇】--2.模块解析
  • AI时代的泛安全新范式:Kaamel安全智能体解决方案