青少年编程与数学 02-006 前端开发框架VUE 13课题、事件处理

青少年编程与数学 02-006 前端开发框架VUE 13课题、事件处理

  • 一、事件处理
      • 1. 基本事件处理
      • 2. 事件修饰符
      • 3. 子组件事件传递
      • 4. 传递事件给子组件
      • 5. 动态绑定事件处理函数
  • 二、事件修饰符
  • 三、阻止默认行为
      • 1. 使用`.prevent`修饰符
      • 2. 使用JavaScript的`event.preventDefault()`
      • 3. 使用HTML的`onsubmit`属性
      • 总结
  • 四、向上更新数据
      • 1. 定义子组件并触发事件
      • 2. 在父组件中监听子组件的事件
      • 3. 使用`v-model`进行双向绑定
  • 五、应用示例
      • 步骤 1:创建Vite项目
      • 步骤 2:安装Vue 3
      • 步骤 3:创建组件
      • 步骤 4:在App.vue中使用ParentComponent
      • 步骤 5:运行项目
      • 总结

课题摘要:本文介绍了Vue 3中事件处理的组合式API,包括基本事件处理、事件修饰符、子组件事件传递、阻止默认行为和向上更新数据。基本事件处理通过v-on@监听DOM事件,事件修饰符如.stop.prevent.capture等改变事件监听器行为。子组件可以通过emit触发事件并传递数据给父组件,父组件监听这些事件并处理。阻止默认行为通常涉及防止表单提交等,可以通过.prevent修饰符或event.preventDefault()实现。向上更新数据展示了子组件如何通过自定义事件更新父组件的数据。最后,提供了一个应用示例,演示了如何在Vue 3项目中实现父子组件间的事件通信和数据更新。


一、事件处理

在Vue 3中,组合式API(Composition API)提供了一种新的方式来处理事件,使得代码更加模块化和可复用。以下是Vue 3中组合式API事件处理的一些关键点:

1. 基本事件处理

在Vue 3中,可以使用v-on指令(或其缩写@)来监听DOM事件,并在事件触发时执行特定的JavaScript代码。例如,可以定义一个方法来处理点击事件,并在模板中使用@click来绑定这个方法:

<template>
  <button @click="handleClick">Click me</button>
</template>

<script setup>
import { ref } from 'vue';

const message = ref(true);
function handleClick() {
  message.value = !message.value;
}
</script>

在这个例子中,当按钮被点击时,handleClick方法将被调用。

2. 事件修饰符

Vue 3中,事件修饰符用于修改事件监听器的行为。常用的事件修饰符包括:

  • .stop:阻止事件冒泡。
  • .prevent:阻止事件的默认行为。
  • .capture:使用事件捕获模式。
  • .self:仅在事件从自身触发时才执行。
  • .once:事件只触发一次。
  • .left.right.middle:分别对应鼠标左键、右键和中键事件。

例如,阻止点击事件冒泡和默认行为:

<button @click.stop.prevent="handleClick">点击我</button>

这将同时阻止事件冒泡和默认行为。

3. 子组件事件传递

在组件化开发中,子组件可以触发事件并通过emit将事件传递给父组件处理。在Vue 3中,emit的使用更为简洁,尤其是与<script setup>结合使用时:

<!-- 子组件 -->
<template>
  <button @click="sendEvent">发送事件</button>
</template>

<script setup>
const emit = defineEmits();
function sendEvent() {
  emit('customEvent', 'Hello from Child');
}
</script>

父组件可以通过v-on@监听子组件触发的事件,并接收传递的参数:

<!-- 父组件 -->
<template>
  <ChildComponent @customEvent="handleCustomEvent" />
</template>

<script setup>
import ChildComponent from './ChildComponent.vue';
function handleCustomEvent(message) {
  console.log("接收到的消息:", message);
}
</script>

在这个例子中,@customEvent="handleCustomEvent"监听子组件触发的customEvent事件,并调用handleCustomEvent处理该事件。

4. 传递事件给子组件

有时我们希望在父组件中监听子组件的原生事件(如click),在Vue 3中,可以直接在组件中监听事件,这会自动处理绑定到最外层元素的原生事件:

<!-- 子组件 -->
<template>
  <button>子组件按钮</button>
</template>

<!-- 父组件 -->
<template>
  <ChildComponent @click="handleChildClick" />
</template>

<script setup>
import ChildComponent from './ChildComponent.vue';
function handleChildClick() {
  console.log("子组件按钮被点击");
}
</script>

在这个例子中,父组件通过@click="handleChildClick"监听子组件的click事件,无需额外的.native修饰符。

5. 动态绑定事件处理函数

在某些场景中,我们需要给组件的所有事件动态地绑定处理函数。可以通过v-on="object"的语法,将一个包含事件处理函数的对象绑定到组件上:

<template>
  <ChildComponent v-on="listeners" />
</template>

<script setup>
import { reactive } from 'vue';
import ChildComponent from './ChildComponent.vue';
const listeners = reactive({
  click: () => console.log("子组件被点击"),
  mouseover: () => console.log("鼠标移入子组件")
});
</script>

在这个例子中,v-on="listeners"会将listeners对象中的所有事件绑定到ChildComponent上。

通过这些方法,Vue 3的组合式API提供了灵活且强大的事件处理能力,使得组件间的交互更加高效和易于管理。

二、事件修饰符

Vue 3 提供了一系列的事件修饰符,这些修饰符可以用来改变事件监听器的行为,使得事件处理更加灵活和方便。以下是Vue 3中常用的事件修饰符及其详解:

  1. .stop:阻止事件冒泡。

    • 使用 .stop 修饰符可以阻止事件继续传播到父元素。这意味着,如果一个父元素和子元素都绑定了相同类型的事件监听器,当触发子元素的事件时,只会执行子元素的事件监听器,而不会触发父元素的事件监听器。
    <div @click="outerClick">
      <button @click.stop="innerClick">Click me</button>
    </div>
    

    点击按钮时,只会触发 innerClick 方法,不会冒泡到外部的 div 上。

  2. .prevent:阻止事件的默认行为。

    • 使用 .prevent 修饰符可以阻止元素的默认行为,例如阻止表单提交或链接跳转。
    <form @submit.prevent="handleSubmit">
      <button type="submit">Submit</button>
    </form>
    

    在这个例子中,使用 .prevent 修饰符阻止了表单的默认提交行为。

  3. .capture:使用事件捕获模式。

    • 事件捕获模式是指事件从文档根节点开始,向下传播到目标节点的过程。使用 .capture 修饰符可以在捕获阶段监听事件,而不是在冒泡阶段。
    <div @click.capture="handleClick">Click me</div>
    

    在这个例子中,handleClick 会在捕获阶段被触发。

  4. .self:仅当事件在当前元素本身触发时才调用事件处理函数。

    • 使用 .self 修饰符可以确保事件只有在目标元素上触发时才会执行处理函数,不包括子元素。
    <div @click.self="handleClick">Click me</div>
    

    只有当直接点击 div 本身时,handleClick 会被触发。

  5. .once:事件只触发一次。

    • 使用 .once 修饰符可以确保事件处理函数只被调用一次,之后事件监听器会被自动解绑。
    <button @click.once="handleClick">Click me</button>
    

    第一次点击按钮时,handleClick 会被调用,之后的点击将不再触发该事件。

  6. .passive:指定事件监听器为被动模式。

    • 使用 .passive 修饰符可以提升滚动性能,尤其是在移动设备上。它告诉浏览器你不会调用 preventDefault() 来阻止默认行为,这通常用于滚动事件监听。
    <div @scroll.passive="handleScroll">Scroll me</div>
    

    在这个例子中,handleScroll 会在滚动时被触发,且不会阻止默认的滚动行为,从而提升性能。

这些修饰符可以单独使用,也可以组合使用,以满足更复杂的事件处理需求。例如,可以同时使用 .stop.prevent 修饰符来阻止事件冒泡和默认行为:

<a @click.stop.prevent="handleClick">Click me</a>

在这个例子中,点击链接时不会跳转页面,且不会冒泡到父元素。

三、阻止默认行为

防止表单提交的默认行为通常涉及到阻止表单的提交事件,这样浏览器就不会将表单数据发送到服务器。在Vue中,你可以通过几种方式来实现这一点:

1. 使用.prevent修饰符

在Vue中,最直接的方式是在监听submit事件时使用.prevent修饰符。这会阻止表单的默认提交行为。

<template>
  <form @submit.prevent="onSubmit">
    <!-- 表单内容 -->
    <button type="submit">Submit</button>
  </form>
</template>

<script>
export default {
  methods: {
    onSubmit(event) {
      // 处理表单提交逻辑
      console.log('Form submitted');
    }
  }
}
</script>

在这个例子中,当用户点击提交按钮时,onSubmit方法会被调用,但由于.prevent修饰符的作用,表单的默认提交行为被阻止了。

2. 使用JavaScript的event.preventDefault()

如果你需要在方法内部更明确地控制表单提交行为,可以在方法中调用event.preventDefault()

<template>
  <form @submit="onSubmit">
    <!-- 表单内容 -->
    <button type="submit">Submit</button>
  </form>
</template>

<script>
export default {
  methods: {
    onSubmit(event) {
      // 阻止表单的默认提交行为
      event.preventDefault();
      // 处理表单提交逻辑
      console.log('Form submitted');
    }
  }
}
</script>

在这个例子中,onSubmit方法接收一个事件对象作为参数,通过调用event.preventDefault()来阻止表单的默认提交行为。

3. 使用HTML的onsubmit属性

如果你不使用Vue的事件绑定,而是直接在HTML中使用onsubmit属性,也可以在其中调用event.preventDefault()

<form onsubmit="event.preventDefault(); onSubmit();">
  <!-- 表单内容 -->
  <button type="submit">Submit</button>
</form>

<script>
function onSubmit() {
  // 处理表单提交逻辑
  console.log('Form submitted');
}
</script>

在这个例子中,当表单提交时,onsubmit属性中的JavaScript代码会阻止默认行为,并调用onSubmit函数。

总结

使用Vue时,推荐使用第一种方法,即使用.prevent修饰符,因为它更符合Vue的响应式和组件化设计。其他方法虽然也可以实现相同的功能,但可能需要更多的代码和手动处理事件对象。

四、向上更新数据

在Vue中,子组件可以通过自定义事件来更新父组件的数据。Vue 3中,子组件可以使用emit函数来触发事件,并将数据传递给父组件。以下是如何在子组件的事件中更新父组件数据的步骤:

1. 定义子组件并触发事件

在子组件中,你需要使用defineEmits函数来定义可以触发的事件,并使用emit函数来触发这些事件。

<!-- ChildComponent.vue -->
<template>
  <button @click="updateParent">Update Parent</button>
</template>

<script setup>
import { defineEmits } from 'vue';

// 定义可以触发的事件
const emit = defineEmits(['update']);

// 触发事件并传递数据给父组件
function updateParent() {
  emit('update', 'New data from child');
}
</script>

2. 在父组件中监听子组件的事件

在父组件中,你需要监听子组件触发的事件,并在事件处理函数中更新数据。

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent @update="handleUpdate" />
    <p>Parent data: {{ parentData }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

// 父组件的数据
const parentData = ref('Initial data');

// 处理子组件触发的事件并更新数据
function handleUpdate(newData) {
  parentData.value = newData;
}
</script>

在这个例子中,当子组件的按钮被点击时,它会触发一个名为update的事件,并传递新的数据给父组件。父组件监听这个事件,并在handleUpdate函数中更新parentData的数据。

3. 使用v-model进行双向绑定

如果你需要进行双向数据绑定,可以使用Vue 3的v-modelv-model:prop修饰符。

<!-- ChildComponent.vue -->
<template>
  <input :value="value" @input="updateValue" />
</template>

<script setup>
import { defineProps, defineEmits } from 'vue';

// 定义接收的props和可以触发的事件
const props = defineProps(['value']);
const emit = defineEmits(['update:value']);

// 更新父组件的数据
function updateValue(event) {
  emit('update:value', event.target.value);
}
</script>
<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent v-model="parentData" />
    <p>Parent data: {{ parentData }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

// 父组件的数据
const parentData = ref('Initial data');
</script>

在这个例子中,v-model会自动处理input事件,并使用update:value事件来更新父组件的parentData数据。这种方式简化了父子组件之间的数据同步。

通过这些方法,你可以在Vue 3中实现子组件事件触发时更新父组件的数据。

五、应用示例

创建一个使用Vue 3组合式API进行事件处理的项目,我们将使用Vite作为构建工具。以下是创建这个项目的步骤和代码示例。

步骤 1:创建Vite项目

首先,你需要安装Node.js和npm/yarn。然后,使用以下命令创建一个新的Vite项目:

# 使用npm
npm create vite@latest my-vue-app -- --template vue

# 或者使用yarn
yarn create vite my-vue-app --template vue

进入项目目录:

cd my-vue-app

步骤 2:安装Vue 3

确保项目使用的是Vue 3:

npm install vue@next

步骤 3:创建组件

src目录下创建两个文件:ChildComponent.vueParentComponent.vue

ChildComponent.vue:

<template>
  <button @click="notifyParent">Notify Parent</button>
</template>

<script setup>
import { defineEmits } from 'vue';

const emit = defineEmits(['updateData']);

function notifyParent() {
  emit('updateData', 'Data from ChildComponent');
}
</script>

ParentComponent.vue:

<template>
  <div>
    <child-component @updateData="handleDataUpdate" />
    <p>Messages from child: {{ messages }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const messages = ref([]);

function handleDataUpdate(data) {
  messages.value.push(data);
}
</script>

步骤 4:在App.vue中使用ParentComponent

编辑src/App.vue文件,引入并使用ParentComponent

<template>
  <div id="app">
    <parent-component />
  </div>
</template>

<script setup>
import ParentComponent from './components/ParentComponent.vue';
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

步骤 5:运行项目

使用以下命令启动开发服务器:

npm run dev

# 或者使用yarn
yarn dev

现在,你可以在浏览器中访问http://localhost:3000来查看你的应用。点击子组件中的按钮,父组件将接收到消息并显示在页面上。

总结

这个简单的项目展示了如何在Vue 3中使用组合式API进行事件处理。子组件通过emit触发事件,父组件监听这些事件并更新其数据。这是一个基本的父子组件通信示例,可以根据需要进行扩展和修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cursor无限续杯——解决Too many free trials.

前情提要 我们都知道Cursor对新用户是有14天且500条免费限制的。 一般情况下&#xff0c;当14天过期&#xff0c;是可以注销账户再重新注册&#xff0c;这样就可以继续拥有14天的体验时长。 但是&#xff01;&#xff01;如果使用超过500次&#xff0c;Cusor就会把你的电脑I…

HCIE-day10-ISIS

ISIS ISIS&#xff08;Intermediate System-to-Intermediate System&#xff09;中间系统到中间系统&#xff0c;属于IGP&#xff08;内部网关协议&#xff09;&#xff1b;是一种链路状态协议&#xff0c;使用最短路径优先SPF算法进行路由计算&#xff0c;与ospf协议有很多相…

洛谷P1617———数字转英文

题目如下 思路&#xff1a;将1~9的英文和20~90的英文用字符串数组存储&#xff0c;把下标看作对应的数字进行输出&#xff0c;遇到0或连续多个0就输出“and”&#xff0c;定义l用来看枚举到哪一位了&#xff0c;如果是单独输入一个“0”&#xff0c;则直接输出zero然后结束。否…

UnityRenderStreaming使用记录(五)

UnityRenderStreaming不一样的错误&#xff0c;船新的版本 继续docker部署UnityRenderStreamingdockerfile一些命令出现了新的错误先解决一个报错不知道怎么解决&#xff0c;先跑个glxgears测试一下先解决MESA和glx的问题新的log&#xff0c;额新的错误尝试解决libnvidia-encod…

Unity-Mirror网络框架-从入门到精通之AdditiveScenes 示例

文章目录 前言Additive Levels和Additive ScenesAdditive Levels场景介绍Portal传送门FadeInOut特效 Additive Scenes示例介绍ZoneHandlerSceneMassage 最后 前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框…

Mac-docker配置

1.配置的文件路径 cd ~/.docker (base) zhangyaweimacbookair .docker % ls buildx cli-plugins config.json contexts daemon.json desktop-build mutagen run (base) zhangyaweimacbookair .docker % cat daemon.json## 重启docker服务 sudo systemctl daemon-reload sudo…

PHP进阶-在Ubuntu上搭建LAMP环境教程

本文将为您提供一个在Ubuntu服务器上搭建LAMP&#xff08;Linux, Apache, MySQL, PHP&#xff09;环境的完整指南。通过本文&#xff0c;您将学习如何安装和配置Apache、MySQL、PHP&#xff0c;并将您的PHP项目部署到服务器上。本文适用于Ubuntu 20.04及更高版本。 一、系统更新…

Elasticsearch(看这一篇就够了)

目录&#xff1a; Elasticsearch介绍正排索引和倒排索引Elasticsearch安装安装ES服务安装服务安装kibana 索引操作创建索引查询索引库修改索引库删除索引库 Elasticsearch常用操作文档操作新增文档查询文档删除文档根据id批量查询文档查询所有文档修改文档部分字段 域的属性分词…

嵌入式技术之Linux(Ubuntu) 一

一、Linux入门 1.硬件和操作系统以及用户的关系 一个传感器&#xff0c;获得数据后&#xff0c;需要向服务器发送数据。传感器传数据给上位机。 上位机需要一个程序来接收数据&#xff0c;那么这个上位机是什么机器&#xff1f; 我们的笔记本电脑就可以当成上位机。 两个手…

【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名

TX Text Control 是一款功能类似于 MS Word 的文字处理控件&#xff0c;包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理&#xff0c;网站内容发布&#xff0c;电子病历中病案模板创建、病历书写、修改历史、连续打…

oracle闪回恢复数据:(闪回查询,闪回表,闪回库,回收站恢复)

oracle的闪回查询&#xff0c;可以查询提交在表空间的闪回数据&#xff0c;并可以还原所查询的数据&#xff0c;用于恢复短时间内的delele 或者 update 误操作&#xff0c;非常方便&#xff0c;缺点是只能恢复大概几小时内的数据。 文章目录 概要闪回查询恢复数据的主要方法包括…

开放词汇检测新晋SOTA:地瓜机器人开源DOSOD实时检测算法

在计算机视觉领域&#xff0c;目标检测是一项关键技术&#xff0c;旨在识别图像或视频中感兴趣物体的位置与类别。传统的闭集检测长期占据主导地位&#xff0c;但近年来&#xff0c;开放词汇检测&#xff08;Open-Vocabulary Object Detection-OVOD 或者 Open-Set Object Detec…

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络&#xff1a; 静态配置路由动态路由协议 在本文&#xff0c;我们将学习关于静态路由的各种概念&#xff0c;例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)

城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组&#xff0c;解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …

通过Android Studio修改第三方jar包并重新生成jar包

最近接手了来自公司其他同事的一个Unity项目,里面有一个封装的jar包要改动一下,无奈关于这个jar包的原工程文件丢失了,于是自己动手来修改下jar包,并做下记录。 一、导入第三方jar包 1、新建项目EditJarDemo(项目名随便取) 2、新建libs文件夹,把你要修改的third.jar 复制…

33.3K 的Freqtrade:开启加密货币自动化交易之旅

“ 如何更高效、智能地进行交易成为众多投资者关注的焦点。” Freqtrade 是一款用 Python 编写的免费开源加密货币交易机器人。它就像一位不知疲倦的智能交易助手&#xff0c;能够连接到众多主流加密货币交易所&#xff0c;如 Binance、Bitmart、Bybit 等&#xff08;支…

计算机网络 (26)互联网的路由选择协议

一、路由选择协议的基本概念 路由选择协议是计算机网络中用于确定数据包在网络中传输路径的一种协议。它帮助路由器构建和维护路由表&#xff0c;以便根据目的地址将数据包转发到正确的下一跳路由器。路由选择协议分为静态路由选择协议和动态路由选择协议两大类。 二、静态路由…

【MySQL实战】Centos安装MySQL

在CentOS上安装MySQL以及进行性能分析&#xff1a;2种方式&#xff0c;第一种直接装&#xff1b;第二种用docker安装&#xff1a; 直接安装MySQL 首先&#xff0c;更新系统软件包列表&#xff1a; sudo yum update然后&#xff0c;安装MySQL服务器&#xff1a; sudo yum in…

centOS7

特殊权限 set_uid 赋予所有者身份 chmod us 文件 set_gid 赋予所有组身份 chmod gs 文件/目录 sticky_bit 防火墙 firewall-cmd 开启端口 firewall-cmd --zonepublic --add-port8080/tcp --permanent 重启防火墙 systemctl restart firewalld 查看开启的所有端口 fi…