【vue教程】二. Vue特性原理详解

目录

    • 回顾
    • 本章涵盖知识点
    • Vue 实例和选项
      • 创建 Vue 实例
      • Vue 实例的选项
    • Vue 模板语法
      • 插值表达式
      • 指令
        • v-bind
        • v-model
        • v-on
    • 自定义指令
      • 创建自定义指令
      • 在模板中使用自定义指令
      • 自定义指令的`钩子函数`
      • 自定义指令的实例演示
    • 指令注册
      • 局部注册指令
      • 过滤器
    • 数据绑定和响应式原理
      • 响应式数据绑定示例
      • 响应式原理解析
    • v-model 的自定义实现
      • 自定义`v-model`
      • 扩展知识点
    • 事件处理和表单输入
      • 事件处理示例
      • 表单输入绑定
    • 深入数据绑定
      • 对象和数组的更新
        • 更新对象属性
        • 更新数组
      • 修饰符
        • 使用修饰符
      • 按键修饰符
        • 监听特定按键
    • 组件基础
      • 组件的创建和使用
      • 组件的 props
      • 组件事件
    • 结语

回顾

  • 【vue教程】一. 环境搭建与代码规范配置

在上一篇文章中,我们介绍了 Vue.js 的起源、设计理念、核心特性 已经项目规范化配置 。我们学习了如何搭建 Vue 开发环境,并熟悉了一些常用的 Vue 开发工具和插件

本章涵盖知识点

  • Vue 实例和选项
  • 模板语法:插值、指令、过滤器
  • 数据绑定和响应式原理
  • 事件处理和表单输入、v-model 原理
  • 组件基础

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


Vue 实例和选项

每个 Vue 应用都是从创建一个新的 Vue 实例开始的。Vue 实例是一个包含选项的对象,这些选项包括数据方法生命周期钩子等。

创建 Vue 实例

var vm = new Vue({
  el: "#app", // 指定Vue应该绑定到的DOM元素
  data: {
    message: "Hello Vue!", // 响应式数据
  },
  methods: {
    sayHello: function () {
      alert(this.message);
    },
  },
});

在这个实例中,el属性指定了 Vue 将接管哪个 DOM 元素,data属性包含了 Vue 实例的数据对象,methods属性包含了 Vue 实例可以调用的方法。

Vue 实例的选项

Vue 实例有多种选项,以下是一些常用的选项:

  • data: 组件的数据对象。
  • methods: 定义组件的方法。
  • computed: 定义计算属性。
  • watch: 定义侦听器。
  • props: 子组件的外部数据。
  • el: 指定 Vue 应该绑定到的 DOM 元素。

Vue 模板语法

Vue 的模板语法让我们能够声明式地将数据渲染进 DOM。

插值表达式

插值表达式允许我们把数据插到模板中。

<span>Message: {{ message }}</span>

message数据变化时,页面上对应的文本也会更新。

指令

指令是 Vue 模板中的特殊标记,带有前缀v-,用于告诉 Vue 框架需要对 DOM 元素进行一些特殊的处理。

v-bind

用于动态地绑定一个或多个属性,或一个组件 prop。

<img :src="imageUrl" :alt="imageDescription" />
v-model

在表单输入和应用状态之间创建双向数据绑定。

<input v-model="username" placeholder="Enter your name" />
v-on

监听 DOM 事件。

<button @click="sayHello">Say Hello</button>

自定义指令

Vue 允许我们通过自定义指令向元素添加自己的功能。自定义指令 可以钩入到 Vue 的编译过程中,允许我们对元素进行低层次操作。

创建自定义指令

// 注册一个全局自定义指令 `v-focus`
Vue.directive("focus", {
  // 当被绑定的元素插入到DOM时……
  inserted: function (el) {
    // 聚焦元素
    el.focus();
  },
});

在模板中使用自定义指令

<input v-focus />

自定义指令的钩子函数

自定义指令有以下几个钩子:

  • bind: 只调用一次,指令第一次绑定到元素时调用。
  • inserted: 被绑定元素插入父组件时调用。
  • update: 所在组件的 VNode 更新时调用。
  • componentUpdated: 父组件更新,该钩子被调用。
  • unbind: 只调用一次,指令与元素解绑时调用。

自定义指令的实例演示

假设我们需要一个指令来控制元素的尺寸,根据数据属性调整大小:

Vue.directive("resize", {
  bind(el, binding) {
    el.style.width = binding.value.width + "px";
    el.style.height = binding.value.height + "px";
  },
  update(el, binding) {
    if (binding.oldValue !== binding.value) {
      el.style.width = binding.value.width + "px";
      el.style.height = binding.value.height + "px";
    }
  },
});

在模板中使用:

<div v-resize="resizeObj"></div>

其中resizeObj是 Vue 实例的数据对象,包含widthheight属性。

指令注册

指令不仅可以全局注册,还可以局部注册到单个 Vue 实例。

局部注册指令

new Vue({
  directives: {
    focus: {
      // 指令定义
      inserted: function (el) {
        el.focus();
      },
    },
  },
});

在实例的模板中使用:

<input v-focus />

过滤器

过滤器用于在插值表达式中转换输出文本。

<p>{{ message | capitalize }}</p>
filters: {
  capitalize: function (value) {
    if (!value) return '';
    value = value.toString();
    return value.charAt(0).toUpperCase() + value.slice(1);
  }
}

数据绑定和响应式原理

Vue 的数据绑定是通过响应式系统实现的,该系统确保数据变化时视图能自动更新。

响应式数据绑定示例

data: {
  firstName: 'John',
  lastName: 'Doe'
}

在模板中:

<p>{{ firstName }} {{ lastName }}</p>

firstNamelastName变化时,视图会自动更新。

响应式原理解析

Vue 使用Object.defineProperty来劫持数据对象的属性,当属性值变化时,视图会自动更新。

v-model 的自定义实现

v-model在 Vue 中通常用于创建数据双向绑定,它主要是语法糖,背后是:value@input的结合。在组件中,我们可以自定义v-model的行为。

自定义v-model

在组件中,我们可以通过model选项来自定义v-model

Vue.component("child-component", {
  model: {
    prop: "customValue", // 指定prop的名称
    event: "change", // 指定事件的名称
  },
  props: ["customValue"],
  methods: {
    updateValue: function (event) {
      this.$emit("change", event.target.value); // 触发事件,并传入新值
    },
  },
  template: `
    <input type="text" :value="customValue" @input="updateValue">
  `,
});

使用自定义v-model的组件:

<child-component v-model="parentValue"></child-component>

在这个示例中,parentValue是父组件中的数据,通过v-modelchild-component组件绑定。组件内部,我们监听input事件,并在事件发生时,通过$emit触发一个change事件,并传递新的值。

扩展知识点

  • 修饰符v-model可以与修饰符一起使用,如.lazy.number.trim,以控制输入的更新时机和行为。
  • 不同类型的输入处理:对于radiocheckboxselect等不同类型的表单元素,Vue 提供了不同的处理方式来确保v-model的双向绑定能正常工作。

事件处理和表单输入

Vue 允许我们在模板中直接监听 DOM 事件,并在 Vue 实例的方法中处理这些事件。

事件处理示例

methods: {
  sayHello: function () {
    alert('Hello ' + this.username);
  }
}

在模板中:

<button @click="sayHello">Say Hello</button>

表单输入绑定

<input v-model="username" placeholder="Enter your name" />

当用户在输入框中输入时,username的值将自动更新,并且如果username在数据对象中变化,输入框的内容也会同步更新。

深入数据绑定

Vue 的数据绑定不仅限于简单的文本展示和表单输入,它还包括更复杂的场景。

对象和数组的更新

Vue 可以响应式地更新对象和数组,但需要注意使用Vue.set来保持响应性。

更新对象属性
// 对于新属性
Vue.set(vm.someObject, "newProperty", 123);
更新数组
// 添加元素
vm.someArray.push(123);
// 删除元素
vm.someArray.splice(index, 1);

修饰符

Vue 提供了事件处理的修饰符,如.stop.prevent.capture等,来简化事件处理。

使用修饰符
<button @click.stop="sayHello">Say Hello</button>

按键修饰符

Vue 允许你监听特定的按键,如.enter.tab等。

监听特定按键
<input @keyup.enter="onEnter" />

组件基础

Vue 组件系统是构建大型应用程序的关键。组件允许我们通过组合较小的、可复用的部件来构建大型应用程序。

组件的创建和使用

Vue.component("my-component", {
  template: "<div>A custom component!</div>",
});

在模板中使用:

<my-component></my-component>

组件的 props

组件可以接受外部传入的数据,这些数据被称为 props。

Vue.component("child-component", {
  props: ["greeting"],
  template: "<p>{{ greeting }}</p>",
});

使用:

<child-component :greeting="'Hello from parent!'"></child-component>

组件事件

组件可以触发事件,这些事件可以被父组件监听。

Vue.component("child-component", {
  template: `
    <button @click="notifyParent">Click me</button>
  `,
  methods: {
    notifyParent() {
      this.$emit("notify", "Message from child");
    },
  },
});

父组件监听事件:

<child-component @notify="handleNotification"></child-component>
methods: {
  handleNotification: function (message) {
    alert(message);
  }
}

结语

通过本篇文章,我们全面学习了 Vue 的基础语法,包括 Vue 实例和选项、模板语法、数据绑定、事件处理、组件系统的基础,以及过滤器。这些知识点构成了 Vue 应用开发的基础。在接下来的专栏文章中,我们将继续深入探索 Vue 的高级特性和最佳实践。


欢迎在文章下方留言,分享学习 Vue 基础语法的心得体会,或提出在学习过程中遇到的问题。我将在后续的文章中提供解答和指导。


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

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

相关文章

Prometheus监控主机进程

前言 客户端安装及配置 Premetheus服务端配置 模板导入 grafana效果图 前言 此场景主要是利用process-export监控主机的进程存活、资源占用率&#xff0c;防止进程挂掉导致服务崩溃 gitlab地址&#xff1a;GitHub - ncabatoff/process-exporter: Prometheus exporter that…

unseping

nnnd&#xff0c;这道题谁标的难度1&#xff01;参考文章&#xff1a;江苏工匠杯-unseping&序列化&#xff0c;正则绕过(全网最简单的wp)_江苏工匠杯unseping-CSDN博客 这是这道题的源码&#xff0c;一看exec和unserialize就是反序列化和命令执行&#xff0c;还有个正则应…

安全防御拓扑1

目录 实验的拓扑&#xff1a; 要求&#xff1a; 我搭建的实验拓扑 步骤&#xff1a; 创建vlan&#xff1a; 接口配置&#xff1a; 防火墙&#xff1a; 防火墙配置&#xff1a; 建立安全策略&#xff1a; 防火墙的用户&#xff1a; 办公区的市场部和研发部用户 市场部…

camtasia怎么剪掉不用的部分 屏幕录制的视频怎么裁剪上下不要的部分 camtasia studio怎么裁剪视频时长 camtasia怎么剪辑视频教程

有时我们录制的屏幕内容&#xff0c;并不一定全部需要。那么&#xff0c;屏幕录制的视频怎么裁剪上下不要的部分&#xff1f;可以使用视频剪辑软件&#xff0c;或者微课制作工具来进行裁剪。屏幕录制的视频怎么旋转&#xff1f;录制视频的旋转也是一样的&#xff0c;均在编辑步…

kettle从入门到精通 第七五课 ETL之kettle血缘,数据血缘

在了解kettle血缘之前&#xff0c;咱们先来了解下什么是数据血缘&#xff1f; 1、数据血缘定义&#xff08;来自gpt&#xff09; 数据血缘&#xff08;Data Lineage&#xff09;是指在数据管理和数据分析中追踪数据的源头、流向和处理过程的能力。具体来说&#xff0c;数据血…

c/c++ 打印调用栈

打印调用栈可以在程序出现死机的时候&#xff08;如出现 SIGABRT、SIGSEGV等一些信号错误&#xff09;是很有用的信息&#xff0c;有可能就不需要 core file 来协助排查问题了。通过 man backtrace 可以得到一个例子的源码&#xff1a; #define SIZE 100 static void backTrac…

如何用python写接口

如何用python写接口&#xff1f;具体步骤如下&#xff1a;  1、实例化server 2、装饰器下面的函数变为一个接口 3、启动服务 开发工具和流程&#xff1a; python库&#xff1a;flask 》实例化server&#xff1a;server flask.Flask(__name__) 》server.route(/index,met…

数据结构-C语言-排序(1)

代码位置&#xff1a;test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。 1.2-排序分类&#xff1a; 常见的排序算法&#xff1a; 插…

力扣第406场周赛

力扣第406场周赛 100352. 交换后字典序最小的字符串 - 力扣&#xff08;LeetCode&#xff09; 贪心&#xff0c;从 0 0 0开始扫描到 n n n如果有一个可以交换的就立马交换 class Solution { public:string getSmallestString(string s) {for(int i1;i<s.size();i){if(s[i…

结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…

PHP webshell 免杀方法

本文介绍php类webshell简单的免杀方法&#xff0c;总结不一定全面&#xff0c;仅供读者参考。 webshell通常可分为一句话木马&#xff0c;小马&#xff0c;大马&#xff0c;内存马。 一句话木马是最简单也是最常见的webshell形式&#xff0c;这种木马体积小&#xff0c;隐蔽较…

图解超详细!!!!!!算法刷题之路之链表初探(五)反转链表

算法刷题之路之链表初探&#xff08;五&#xff09; 今天来学习的算法题是leecode206反转链表&#xff0c;是一道简单的入门题&#xff0c;话不多说&#xff01;直接上&#xff01; 条件 图解&#xff08;先看图结合后面的思路一起看&#xff09; 项目解释 有题目可以知道&…

记录些MySQL题集(3)

MySQL 分区技术深入解析 分区的基本概念 MySQL分区 是一种数据库优化的技术&#xff0c;它允许将一个大的表、索引或其子集分割成多个较小的、更易于管理的片段&#xff0c;这些片段称为“分区”。每个分区都可以独立于其他分区进行存储、备份、索引和其他操作。这种技术主要…

STM32智能楼宇照明系统教程

目录 引言环境准备智能楼宇照明系统基础代码实现&#xff1a;实现智能楼宇照明系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;楼宇照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能楼宇照明系…

OSI 七层模型与五层模型

OSI&#xff08;开放系统互连&#xff09;七层模型和五层模型是描述计算机网络协议的两种不同层次划分方法。两者用于帮助理解和设计网络协议&#xff0c;但它们在层次划分上有所不同。

java.sql.SQLException: Unknown system variable ‘query_cache_size‘【Pyspark】

1、问题描述 学习SparkSql中&#xff0c;将spark中dataframe数据结构保存为jdbc的格式并提交到本地的mysql中&#xff0c;相关代码见文章末尾。 运行代码时报出相关配置文件错误&#xff0c;如下。 根据该报错&#xff0c;发现网络上多数解决方都是基于java开发的解决方案&a…

创建鸿蒙手机模拟器(HarmonyOS Emulator)

文 | Promise Sun 一.前提条件&#xff1a; 鸿蒙项目开发需要使用模拟器进行开发测试&#xff0c;但目前想在DevEco Studio开发工具中使用模拟器就必须到华为官网进行报名申请&#xff0c;参加“鸿蒙模拟器&#xff08;HarmonyOS Emulator&#xff09;Beta活动申请”。 申请审…

Macbook pro插移动硬盘没反应,Macbook pro移动硬盘读不了怎么办 macbook插移动硬盘后无法使用

为了弥补Macbook pro硬盘容量的缺失&#xff0c;我们有时候会使用到外接硬盘或移动硬盘。一般来说&#xff0c;这些硬盘都是即插即用的&#xff0c;可能部分要安装插件。不过&#xff0c;在一些特殊情况下&#xff0c;也会遇到插硬盘没反应等问题。本文会给大家解答Macbook pro…

STM32第二十一课:FreeRTOS事件组软件定时器

目录 一、事件组1.事件组创建2.事件组置位3.事件组等待 二、软件定时器1.软件定时器创建2.软件定时器执行3.例程代码 一、事件组 本质上是任务同步&#xff0c;但比二值信号量优秀的是可以一对多。 我的理解&#xff1a;事件组就是标志位的集合&#xff0c;将多个标志位放到一个…

Raw Socket(二)循环队列收发数据

完整代码在&#xff1a; 添加链接描述 其中tcp_handshake文件夹是实现TCP三次握手的demo。 完整代码参考&#xff1a; https://github.com/praveenkmurthy/Raw-Sockets 代码实现基于raw socket的TCP协议&#xff0c;发送http请求包并接收回包&#xff0c;…