Vue 3指令与事件处理

news2024/11/18 19:35:52

title: Vue 3指令与事件处理
date: 2024/5/25 18:53:37
updated: 2024/5/25 18:53:37
categories:

  • 前端开发

tags:

  • Vue3基础
  • 指令详解
  • 事件处理
  • 高级事件
  • 实战案例
  • 最佳实践
  • 性能优化

在这里插入图片描述

第1章 Vue 3基础

1.1 Vue 3简介

Vue 3 是一个由尤雨溪(尤大)领导的开源JavaScript框架,它专注于构建用户界面。相较于Vue 2,Vue 3在核心理念上保持一致,但对一些底层实现进行了重大优化,包括:

  • SFC(Single File Component) : Vue 3继续支持SFC模式,将组件的模板、样式和逻辑集成在一个文件中。
  • Composition API: 引入新的编程模型,强调组件内部状态的可组合性,而非依赖于props和data。
  • TypeScript支持: 提供了更好的类型系统,方便开发者编写类型安全的代码。
  • Performance: 通过移除一些不必要的依赖,提高了性能,特别是对于大型应用。

1.2 安装与配置

1.2.1 环境准备

  • Node.js: Vue 3需要Node.js环境,建议使用最新版本。
  • 使用npm或yarn: 作为包管理器,安装Vue CLI(命令行工具)。

1.2.2 Vue CLI安装

  • 打开终端(或命令提示符):
npm install -g @vue/cli

  • 或者使用yarn:
yarn global add @vue/cli

1.2.3 创建项目

  • 创建一个新的Vue 3项目:
vue create my-project

  • 进入项目目录:
cd my-project

1.2.4 配置基本文件

  • 修改src/main.js,引入Vue实例并启动应用:
import { createApp } from 'vue';
import App from './App.vue';

const app = createApp(App);
app.mount('#app');

1.3 模板语法

1.3.1 JSX-like模板 Vue 3的模板语法采用类似React的JSX语法,但更简洁。如创建一个Hello World组件:

<template>
  <div>Hello, {{ name }}!</div>
</template>

<script>
export default {
  data() {
    return {
      name: 'World',
    };
  },
};
</script>

  • {{ }}用于插值表达式,{{{ }}}用于文本插值。
  • <div>是标签,<template>用于包裹组件内容。

1.3.2 简化模板 Vue 3还支持更简洁的模板语法,如:

<template>
  <div>Hello, {{ name }}!</div>
</template>
<script>
export default {
  data() {
    return { name: 'World' };
  },
};
</script>

  • 省略了<script>标签内的export defaultdata

第2章 Vue 3指令

2.1 内置指令

Vue 3提供了多种内置指令,用于控制DOM的行为和渲染。以下是一些常用的内置指令:
AD:漫画首页

2.1.1 v-bind

v-bind 指令用于动态地绑定一个或多个属性,或者一个组件 prop 到表达式。在Vue 3中,v-bind 可以简写为 :

示例:

<template>
  <img :src="imageSrc" alt="Image">
</template>
<script>
export default {
  data() {
    return {
      imageSrc: 'https://example.com/image.jpg',
    };
  },
};
</script>

2.1.2 v-model

v-model 指令用于在表单控件或者组件上创建双向数据绑定。

示例:

<template>
  <input v-model="message" placeholder="edit me">
  <p>Message is: {{ message }}</p>
</template>
<script>
export default {
  data() {
    return {
      message: '',
    };
  },
};
</script>

2.1.3 v-on

v-on 指令用于监听DOM事件,并在触发时执行一些JavaScript代码。v-on 可以简写为 @

示例:

<template>
  <button @click="incrementCounter">Click me</button>
</template>
<script>
export default {
  data() {
    return {
      counter: 0,
    };
  },
  methods: {
    incrementCounter() {
      this.counter++;
    },
  },
};
</script>

2.1.4 v-show与v-if

v-showv-if 指令用于条件性地渲染一块内容。v-show 是通过CSS控制元素的显示与隐藏,而 v-if 则是通过创建或销毁DOM元素来控制。

示例:

<template>
  <p v-show="isVisible">This is shown by v-show</p>
  <p v-if="isVisible">This is shown by v-if</p>
</template>
<script>
export default {
  data() {
    return {
      isVisible: true,
    };
  },
};
</script>

2.1.5 v-for

v-for 指令用于基于源数据多次渲染元素或模板块。

示例:

<template>
  <ul>
    <li v-for="item in items" :key="item.id">
      {{ item.text }}
    </li>
  </ul>
</template>
<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
        { id: 3, text: 'Item 3' },
      ],
    };
  },
};
</script>

2.1.6 v-text与v-html

v-text 指令用于更新元素的 textContent。v-html 指令用于更新元素的 innerHTML。

示例:

<template>
  <p v-text="textContent"></p>
  <p v-html="htmlContent"></p>
</template>
<script>
export default {
  data() {
    return {
      textContent: 'This is text content',
      htmlContent: '<span>This is HTML content</span>',
    };
  },
};
</script>

通过这些内置指令,Vue 3允许开发者以声明式的方式控制DOM,使得代码更加简洁和易于维护。

2.2 自定义指令

除了内置指令,Vue 3还允许开发者创建自定义指令。自定义指令可以用于执行更多复杂的DOM操作。

2.2.1 创建自定义指令

可以使用 directives 选项在组件中注册自定义指令。

示例:

export default {
  directives: {
    focus: {
      // 指令的定义
      mounted(el) {
        el.focus();
      },
    },
  },
};

2.2.2 钩子函数

自定义指令可以包含以下几个钩子函数:

  • bind:只调用一次,指令第一次绑定到元素时调用。
  • inserted:被绑定元素插入到父节点时调用(仅保证父节点存在,但不一定已被插入到文档中)。
  • updated:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。
  • componentUpdated:所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

示例:

export default {
  directives: {
    focus: {
      bind(el) {
        console.log('focus bind');
      },
      inserted(el) {
        console.log('focus inserted');
      },
      updated(el) {
        console.log('focus updated');
      },
      componentUpdated(el) {
        console.log('focus componentUpdated');
      },
      unbind(el) {
        console.log('focus unbind');
      },
    },
  },
};

2.2.3 指令参数与修饰符

自定义指令可以接受一个参数,该参数是一个字符串,表示指令的修饰符。修饰符是一个 prefiex,以 . 开头,用于指明指令应该以特殊方式绑定。

示例:

export default {
  directives: {
    focus: {
      bind(el, binding) {
        if (binding.arg === 'input') {
          el.focus();
        }
      },
    },
  },
};

可以在使用自定义指令时,使用 v-bind 传递参数。

示例:

<template>
  <input v-focus.input="">
</template>

通过自定义指令,开发者可以扩展 Vue 的功能,并在组件中实现更多复杂的DOM操作。

第3章 Vue 3事件处理

3.1 Vue 3事件处理

Vue 3的事件处理机制与Vue 2类似,但使用了更简洁的语法。Vue 3中不再直接支持v-on,而是使用@符号来绑定事件。

3.1.1 基本事件绑定

基础的事件绑定使用 @ 符号,后跟事件名称,再加事件处理函数。例如:

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

对应的JavaScript部分:

export default {
  methods: {
    handleClick() {
      console.log('Button clicked');
    },
  },
};

3.1.2 事件修饰符

Vue 3的事件修饰符与Vue 2兼容,包括:

  • .prevent:阻止事件的默认行为(如阻止表单的默认提交)
  • .stop:阻止事件的进一步传播(默认行为不会被阻止)
  • .capture:在捕获阶段触发,从根元素开始向上
  • .self:仅在事件源和触发元素相同时触发
  • .passive:在触摸移动事件中,用于处理滚动,使事件在默认行为执行前触发,常用于阻止滚动

例如:

<button @click.prevent="handleClick">阻止默认</button>

3.1.3 按键修饰符

  • .once:只触发一次,然后移除事件监听
  • .key:用于键盘事件,指定一个键值(如 EnterEsc)来监听

例如:

<input @keyup.enter="handleEnter" />

在这个例子中,当用户按下回车键时,handleEnter 方法会被调用。

3.2 事件处理函数

在Vue 3中,事件处理函数是响应用户交互的关键部分,它们可以以不同的形式存在,包括内联事件处理器、方法事件处理器以及结合计算属性和侦听器。

3.2.1 内联事件处理器

内联事件处理器是指直接在模板中定义的JavaScript表达式,它们通常用于简单的逻辑。例如:

<button @click="count++">增加计数</button>

在这个例子中,点击按钮会直接增加count的值。

3.2.2 方法事件处理器

方法事件处理器是指在Vue组件的methods选项中定义的函数,这些函数可以处理更复杂的逻辑。例如:

export default {
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    incrementCount() {
      this.count++;
    },
  },
};

在模板中使用:

<button @click="incrementCount">增加计数</button>

3.2.3 计算属性与侦听器

计算属性和侦听器也可以用于事件处理,尤其是在需要根据数据变化来更新视图或执行某些操作时。

  • 计算属性:计算属性是基于它们的依赖进行缓存的,只有当依赖变化时才会重新计算。例如:
export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe',
    };
  },
  computed: {
    fullName() {
      return `${this.firstName} ${this.lastName}`;
    },
  },
};

在模板中使用计算属性:

<button @click="fullName = 'Jane Smith'">更改全名</button>

  • 侦听器:侦听器用于观察和响应Vue实例上的数据变动。例如:
export default {
  data() {
    return {
      message: 'Hello',
    };
  },
  watch: {
    message(newVal, oldVal) {
      console.log(`Message changed from ${oldVal} to ${newVal}`);
    },
  },
};

在模板中触发侦听器:

<button @click="message = 'Hello, Vue 3'">更改消息</button>

通过这些不同类型的事件处理函数,Vue 3提供了灵活且强大的工具来处理用户交互和数据变化。

第4章 高级事件处理

在Vue中,高级事件处理技术包括使用事件总线、自定义事件和事件委托,这些技术可以帮助开发者更有效地管理组件间的通信和事件处理。

4.1 事件总线

事件总线是一个中央集线器,用于在非父子关系的组件之间传递事件。在Vue 2中,通常使用一个空的Vue实例作为事件总线。但在Vue 3中,推荐使用mitttiny-emitter等第三方库,因为Vue 3移除了$on$off$once等实例方法。

使用事件总线的基本步骤如下:

  1. 创建事件总线:
import mitt from 'mitt';
export const emitter = mitt();

  1. 在发送组件中触发事件:
this.emitter.emit('eventName', data);

  1. 在接收组件中监听事件:
this.emitter.on('eventName', this.handleEvent);

4.2 自定义事件

自定义事件是Vue中组件间通信的另一种方式,特别是在父子组件之间。子组件可以使用$emit方法触发一个自定义事件,父组件则通过在子组件标签上使用v-on@来监听这个事件。

示例:

子组件:

methods: {
  handleClick() {
    this.$emit('custom-event', '传递的数据');
  }
}

父组件:

<child-component @custom-event="handleCustomEvent"></child-component>

4.3 事件委托

事件委托是一种优化事件处理的技术,它利用事件冒泡机制,将事件处理器添加到父元素上,而不是每个子元素上。这样可以减少内存消耗和提高性能,尤其是在有很多子元素需要监听相同事件的情况下。
AD:专业搜索引擎

在Vue中实现事件委托的示例:

<ul @click="handleClick">
  <li v-for="item in items" :key="item.id">{{ item.text }}</li>
</ul>

methods: {
  handleClick(event) {
    const target = event.target;
    if (target.tagName === 'LI') {
      // 处理点击事件
    }
  }
}

在这个例子中,handleClick方法会监听<ul>元素上的点击事件,并通过检查事件目标来确定是否是<li>元素被点击。这样,无论有多少个<li>元素,都只需要一个事件处理器。

第5章 实战案例

以下是一些Vue.js简单实战案例,涵盖了表单处理、列表渲染与过滤、动态组件与异步组件的应用。

5.1 表单处理

表单处理是前端应用中常见的需求,Vue提供了简洁的方法来处理表单输入。

<template>
  <div>
    <form @submit.prevent="submitForm">
      <input v-model="form.name" placeholder="Name">
      <input v-model="form.email" type="email" placeholder="Email">
      <button type="submit">Submit</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        email: ''
      }
    };
  },
  methods: {
    submitForm() {
      // 处理表单提交逻辑
      console.log('Name:', this.form.name);
      console.log('Email:', this.form.email);
    }
  }
};
</script>

5.2 列表渲染与过滤

列表渲染是Vue中的基础功能,结合过滤器可以实现复杂的数据展示。

<template>
  <div>
    <input v-model="search" placeholder="Search">
    <ul>
      <li v-for="item in filteredList" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      search: '',
      items: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Cherry' },
        // 更多数据...
      ]
    };
  },
  computed: {
    filteredList() {
      return this.items.filter(item => item.name.includes(this.search));
    }
  }
};
</script>

5.3 动态组件与异步组件

动态组件和异步组件可以提高应用的灵活性和性能。

<template>
  <div>
    <button @click="component = 'ChildA'">切换到ChildA</button>
    <button @click="component = 'ChildB'">切换到ChildB</button>
    <component :is="component"></component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      component: 'ChildA'
    };
  },
  components: {
    ChildA: { template: '<div>This is ChildA</div>' },
    ChildB: { template: '<div>This is ChildB</div>' }
  }
};
</script>

异步组件的实现通常涉及到动态导入:

components: {
  ChildA: () => import('./ChildA.vue'),
  ChildB: () => import('./ChildB.vue')
}

这样,ChildA和ChildB组件会按需加载,从而提高应用的性能。

第6章 最佳实践

在Vue.js开发中,遵循一些最佳实践可以提高应用的性能、代码的可维护性和可测试性。以下是关于性能优化、代码组织与重用、测试与调试的最佳实践。AD:首页 | 一个覆盖广泛主题工具的高效在线平台

6.1 性能优化

  1. 使用v-if替代v-show:在需要频繁切换显示状态时,使用v-ifv-show更高效。
  2. 合理使用计算属性:对于复杂的数据处理,使用计算属性可以减少重复计算,提高性能。
  3. 避免不必要的组件渲染:使用v-once指令可以渲染一次后不再更新,适用于静态内容。
  4. 异步组件和代码分割:使用异步组件和Webpack的代码分割功能,可以按需加载组件,减少初始加载时间。
  5. 使用keep-alive缓存组件:对于需要频繁切换但数据不变的组件,使用<keep-alive>可以避免重复渲染。

6.2 代码组织与重用

  1. 组件化开发:将UI拆分为可重用的组件,每个组件负责特定的功能。
  2. 遵循单一职责原则:每个组件或模块应只负责一个功能,提高代码的可维护性和可测试性。
  3. 使用Mixins或Composition API:对于组件间的共享逻辑,可以使用Mixins或Vue 3的Composition API。
  4. 模块化管理状态:使用Vuex或其他状态管理工具来管理应用的状态,确保状态的可预测性和可维护性。
  5. 代码风格一致:遵循统一的代码风格和命名规范,提高代码的可读性。

6.3 测试与调试

  1. 单元测试:为组件和关键逻辑编写单元测试,确保代码的正确性。可以使用Jest或Vue Test Utils等工具。
  2. 端到端测试:使用Cypress或Puppeteer等工具进行端到端测试,确保应用在真实环境中的表现符合预期。
  3. 使用Vue Devtools:利用Vue Devtools进行调试,可以直观地查看组件树、状态和事件。
  4. 日志和错误处理:在关键点添加日志输出,便于追踪问题。使用try-catch处理可能的错误,提高应用的健壮性。
  5. 持续集成:将测试集成到持续集成流程中,确保每次代码提交都经过自动化测试。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

airtest做web端UI自动化实战

安装 官网下载客户端 airtest库安装 pip install airtest pip install pocoui脚本录制 利用airtest客户端录制脚本 web端辅助插件-selenium windows打开: 设置chrome路径 开始调式录制 脚本运行 # -*- coding: utf-8 -*- """ Time &#xff1a; 2024/5/…

安装mysql的MGR集群

说明 1、 mysql数据库主从宕机&#xff0c;会影响到正常业务访问&#xff0c;并且要手动进行切换。 2、 MHA高可用搭建复杂&#xff0c;代码已停止更新。 3、 MGR集群搭建方便&#xff0c; master故障会自动进行切换&#xff0c;不影响业务正常访问。 一、环境准备 1、主机说明…

安全测试跟自动化测试,哪个方向发展好一些?

引言&#xff1a; 在当今高度互联的数字化时代&#xff0c;软件的安全性和质量成为企业和用户关注的焦点。安全测试和自动化测试作为软件测试领域的两个重要分支&#xff0c;为确保软件系统的稳定性和可靠性发挥着重要作用。本文将深入探讨安全测试和自动化测试的发展方向&…

shell中编写备份数据库脚本(使用mysqldump工具)

mysqldump备份 目录 mysqldump备份 分库备份 分表备份 利用自带工具mysqldump 实现数据库分库分表备份。 要想知道需要备份哪些数据库&#xff0c;就得先列出来 mysql -uroot -pOpenlab123! -N -e show databases | egrep -on_schema|mysql|performance_schema|sys" …

使用BigDecimal定义的实体类字段返回给前台的是字符串类型,如何返回数字类型

目录 前言&#xff1a; 问题现象&#xff1a; 解决方法&#xff1a; 效果&#xff1a; 前言&#xff1a; 做项目的时候数据字段通常定义为bigdecimal类型&#xff0c;方便进行运算&#xff0c;但是发现接口调用后返回给前台的是字符串&#xff0c;这篇博文讲的是如何将定义…

什么是领导力?如何提高领导能力?

什么是领导能力&#xff1f; 简单来说&#xff0c;领导力就是通过自身的影响力&#xff0c;让他人服从自己的想法行动&#xff0c;在一个组织和集体中&#xff0c;领导力的作用十分重要。对于一个公司的管理层来说&#xff0c;领导能力是不可或缺的一部分&#xff0c;公司存在…

共筑信创新生态:DolphinDB 与移动云 BC-Linux 完成兼容互认

近日&#xff0c;DolphinDB 数据库软件 V2.0 与中国移动通信集团公司的移动云天元操作系统 BC-Linux 完成兼容性适配认证。经过双方共同严格测试&#xff0c;DolphinDB 性能及稳定性等各项指标表现优异&#xff0c;满足功能及兼容性测试要求。 此次 DolphinDB 成功通过移动云 B…

华为云Astro Zero低代码平台案例:小、轻、快、准助力销售作战数字化经营

客户背景&#xff1a; 随着业务的不断扩展&#xff0c;华为云某一线作战团队发现&#xff0c;原本基于线上Excel的项目跟踪方式面临新的挑战&#xff1a;多区域、多场景下的业务管理越来越复杂&#xff0c;项目管道存在多种不可控因素&#xff0c;客户关系、进展跟踪同步不及时…

骨折检测数据集VOC+YOLO格式717张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;717 标注数量(xml文件个数)&#xff1a;717 标注数量(txt文件个数)&#xff1a;717 标注类别…

ML307R OpenCPU DEMO_SDK环境搭建

一、工程目录 二、环境搭建 三、编译 四、下载 五、添加自定义文件打印 hello 一、工程目录 OpenCPU SDK代码目录结构,如下图所示: | 名称 | 描述 | | ---------------- | --------------------------| | custom | 用户代码目录…

理解Vue 3响应式系统原理

title: 理解Vue 3响应式系统原理 date: 2024/5/28 15:44:47 updated: 2024/5/28 15:44:47 categories: 前端开发 tags: Vue3.xTypeScriptSFC优化Composition-APIRef&Reactive性能提升响应式原理 第一章&#xff1a;Vue 3简介 1.1 Vue 3概述 Vue 3的诞生背景&#xff1…

NineData 联合创始人周振兴将参加开源数据库技术沙龙,并和 PolarDB 开源社区一起去娃哈哈带来主题分享!

5月31日&#xff08;周五&#xff09;&#xff0c;PolarDB 开源社区将联合娃哈哈集团共同举办开源数据库技术沙龙&#xff01;NineData 联合创始人周振兴受邀参加&#xff0c;并将分享《NineData&#xff0c;Any to Any 数据复制之路》的技术分享。 本次活动汇聚了 PolarDB 产品…

UDP网络聊天室(更)

服务器端 #include <header.h> typedef struct node {char name[20];struct sockaddr_in cli_addr;struct node *next; }node,*node_p; typedef struct msg {char type;char name[20];char text[128]; }msg; node_p create_link() {node_p H(node_p)malloc(sizeof(node)…

一文了解知识中台:是什么、作用、如何搭建

在当今信息繁杂的时代&#xff0c;知识对于企业来说犹如宝藏般重要&#xff0c;而知识中台就是宝藏山的藏宝图。关于知识中台&#xff0c;你可能会感到好奇&#xff0c;它究竟是什么&#xff0c;有什么作用&#xff0c;又该如何搭建知识中台呢&#xff1f;接下来就让LookLook同…

c-lodop 打印面单 内容串页

场景&#xff1a;使用c-lodop程序调取打印机连续打印多张快递单时&#xff0c;上页内容&#xff0c;打到了下一页了 问题原因&#xff1a; 由于是将所有面单内容放到了一个页面&#xff0c;c-lodop 在打印时&#xff0c;发现一页放不下&#xff0c;会自动分割成多页 页面元素…

5.命令行提示符

一、打开终端&#xff08;有以下几种方式&#xff09; 1.在搜索框输入 terminal 2.命令 &#xff08;1&#xff09;ctrlaltt打开新的终端 &#xff08;2&#xff09;ctrlshiftt&#xff1a;在已经打开终端的基础内&#xff0c;新打开一个同路径的终端。 &#xff08;3&#xf…

【代码随想录】面试常考类型之动态规划01背包

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记&#xff0c;为了之后方便观看 不同的二叉搜索树 96. 不同的二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 通过举例子发现重叠子问题 代码很简单&#xff0c;主要是思路问题&#xff0…

【移动云】主机ECS搭建项目——具体步骤教程

目录 一、什么是移动云 二、移动云有什么优势 三、移动云使用 1.注册账号 2.云主机ECS创建 3.管理云主机 4.连接配置云主机 5.搭建服务器提示与建议 四、使用感受 一、什么是移动云 移动云是中国领先的云服务品牌之一&#xff0c;它以强大的资源优势、技术实力和品牌价…

R语言lavaan结构方程模型(SEM)

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

图表控件LightningChart JS v5.2正式发布 - 全新的开发体验

LightningChart JS是Web上性能特高的图表库&#xff0c;具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画&#xff0c;常用于贸易&#xff0c;工程&#xff0c;航…