Vue3学习之语法糖、箭头函数、函数声明详解

 更新时间:2024年08月02日 09:33:17   作者:HaSaKing_721  
在Vue3中箭头函数被广泛支持,尤其是在组合式API的上下文中,这篇文章主要给大家介绍了关于Vue3学习之语法糖、箭头函数、函数声明的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1. 箭头函数

在 Vue 3 中,箭头函数被广泛支持,尤其是在组合式 API 的上下文中。箭头函数提供了一个更简洁的函数书写方式,并且不绑定自己的 this 上下文,这在某些情况下非常有用。但是,需要注意的是,在 Vue 的选项式 API 中,特别是在 methods 和生命周期钩子中,通常不推荐使用箭头函数,因为这些地方的 this 上下文指向组件实例,使用箭头函数会导致 this 丢失。

// 选项式 API 中不推荐
export default {
  methods: {
    handleClick: () => {
      console.log(this.someData); // this 不会指向组件实例,可能导致错误
    }
  }
}

// 组合式 API 中推荐
import { ref } from 'vue';
export default {
  setup() {
    const count = ref(0);
    const increment = () => {
      count.value++;
    };
    return { count, increment };
  }
}

2. 函数声明

函数声明(或称为命名函数)在 Vue 3 中同样适用,尤其是在定义组件方法或者处理器时。相较于箭头函数,命名函数有明确的名称,更利于调试和递归调用,并且自然绑定 this 上下文到组件实例。

export default {
  methods: {
    handleClick() {
      console.log(this.someData); // 正确绑定了 this 上下文
    }
  },
  created() {
    this.handleClick(); // 调用方法
  }
}

3. 语法糖

Vue 3 也引入了更多的语法糖,例如 v-model 的改进,可以同时处理多个变量绑定,并支持自定义修改器。此外,通过 <script setup> 标签,Vue 3 提供了一种更声明式的组件写法,极大简化了代码结构。

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

const message = ref('');

// <script setup> 是 Vue 3 中的一个语法糖,使组件的书写更加简洁
</script>

<template>
  <input v-model="message">
</template>

3.1 ref 和 reactive

在 Vue 3 中,ref 和 reactive 是两种基本的响应式引用类型,它们是组合式 API 的核心部分。这两种类型都允许 Vue 跟踪依赖并在数据变化时自动更新 DOM,但它们在使用方式和适用场景上有所不同。

3.1.1 ref

ref 用于定义一个响应式的引用数据类型。使用 ref 可以把基本数据类型(如字符串、数字、布尔值)包装成一个响应式对象。这个对象有一个 .value 属性,用来获取或设置其内部值。

特点

  • 可以用于基本数据类型。
  • 返回一个包含 value 属性的响应式对象。
  • 可以在模板中直接使用,无需通过 .value 访问。
  • 跨组件或模块传递时,保持响应性。

示例

import { ref } from 'vue';

const count = ref(0);

function increment() {
  count.value++;
}

3.1.2 reactive

reactive 用于创建一个响应式的复杂数据对象,如对象或数组。当这些数据对象的属性变化时,reactive 提供的响应式系统会确保视图与数据状态保持同步。

特点

  • 只能用于对象或数组。
  • 返回一个透明代理(Proxy)的响应式版本,直接修改属性即可。
  • 更适合用于构建复杂的响应式结构,如状态存储或大型对象模型。
  • 传递 reactive 对象时,它们的响应性会被保留。

示例

import { reactive } from 'vue';

const state = reactive({
  count: 0,
  items: ['apple', 'banana']
});

function increment() {
  state.count++;
}

主要区别

  • 数据类型支持ref 适用于基本数据类型,而 reactive 适合复杂数据类型(对象或数组)。
  • 使用方式:使用 ref 时,需要通过 .value 属性来访问或修改其值;使用 reactive 时,可以直接访问或修改对象的属性,无需额外的属性。
  • 模板引用:在模板中使用 ref 时,Vue 会自动展开 .value,让你可以直直接引用;而 reactive 对象的属性可以直接被访问,无需任何额外处理。
  • 设计意图ref 主要用于更简单的场景和跨组件的状态共享;reactive 更适合用来管理较为复杂的状态逻辑或数据结构。

选择使用 ref 或 reactive 应基于具体需求:如果你处理的是基本类型或需要跨组件传递响应式数据,ref 是更好的选择;如果你需要管理一个较大的数据结构,如对象或数组,reactive 更为合适。

4. 箭头函数 VS 函数声明

function xxx() {} 和 const xxx = () => {}

这两种定义函数的方式各有特点和适用场景。这两种方式的主要差异在于函数的作用域、this 绑定、构造函数的能力和提升(hoisting)特性。下面我们详细比较这两种方式,并给出示例。

1. this 绑定

函数声明 (function functionName() {}) 创建的函数拥有自己的 this 上下文,这取决于如何调用该函数。如果作为对象的方法调用,this 指向该对象;如果单独调用,this 指向全局对象(在严格模式下是 undefined)。

箭头函数 (const functionName = () => {}) 不拥有自己的 this 上下文,而是继承自封闭上下文的 this 值,通常称为 “词法作用域”。这使得箭头函数非常适合用作回调函数,特别是在需要访问外部 this 上下文的情况。

示例

const team = {
  members: ['Jane', 'Bill'],
  teamName: 'Super Squad',
  teamSummary: function() {
    // 使用函数声明,这里的 this 指向 team 对象
    return this.members.map(function(member) {
      return `${member} is on team ${this.teamName}`; // 这里的 this 不指向 team 对象,除非使用 bind
    }.bind(this)); // 注意 bind 的使用
  }
};

const teamArrow = {
  members: ['Jane', 'Bill'],
  teamName: 'Super Squad',
  teamSummary: function() {
    // 使用箭头函数,自动捕获上下文中的 this
    return this.members.map(member => `${member} is on team ${this.teamName}`);
  }
};

2. 函数提升

函数声明 在代码执行之前就会被提升,这意味着你可以在声明函数之前调用它。

箭头函数 作为变量声明的一部分,具体到这里是 const 声明,所以它们不会提升。你必须先定义函数,然后才能使用它。

示例

console.log(sum(10, 5)); // 正常工作,因为函数提升
function sum(a, b) {
  return a + b;
}

console.log(add(10, 5)); // 报错:add is not a function
const add = (a, b) => a + b;

3. 用作构造函数

函数声明 可以用作构造函数,与 new 关键字一起使用来创建新对象。

箭头函数 不能用作构造函数,如果尝试这样做会抛出错误。

示例

function Person(name) {
  this.name = name;
}
const person1 = new Person('John'); // 正常工作

const Animal = (name) => {
  this.name = name;
}
const animal1 = new Animal('Dog'); // 报错:Animal is not a constructor

总结 

到此这篇关于Vue3学习之语法糖、箭头函数、函数声明的文章就介绍到这了,更多相关Vue3语法糖、箭头函数、函数声明内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Vue实现一个markdown编辑器实例代码

    利用Vue实现一个markdown编辑器实例代码

    这篇文章主要给大家介绍了关于如何利用Vue实现一个markdown编辑器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • vue单个元素绑定多个事件问题(例如点击绑定多个事件方法)

    vue单个元素绑定多个事件问题(例如点击绑定多个事件方法)

    这篇文章主要介绍了vue单个元素绑定多个事件问题(例如点击绑定多个事件方法),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue2.0基于vue-cli+element-ui制作树形treeTable

    vue2.0基于vue-cli+element-ui制作树形treeTable

    这篇文章主要介绍了vue2.0基于vue-cli+element-ui制作树形treeTable,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue3父子组件通信之子组件修改父组件传过来的值

    vue3父子组件通信之子组件修改父组件传过来的值

    这篇文章主要介绍了vue3父子组件通信之子组件修改父组件传过来的值,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Composition API思想封装NProgress示例详解

    Composition API思想封装NProgress示例详解

    这篇文章主要为大家介绍了Composition API思想封装NProgress示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Vue中自动生成路由配置文件覆盖路由配置的思路详解

    Vue中自动生成路由配置文件覆盖路由配置的思路详解

    这篇文章主要介绍了Vue中自动生成路由配置文件覆盖路由配置的思路详解,大概思路是读取@/views下所有index.vue如果当前文件下有包含相同路径则认为是它的子路由,需要的朋友可以参考下
    2024-05-05
  • vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)

    vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)

    这篇文章主要介绍了vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多,本文分步骤通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 使用vue写一个翻页的时间插件实例代码

    使用vue写一个翻页的时间插件实例代码

    最近在做自己项目中遇到一个非常简单的功能,跟大家分享下,这篇文章主要给大家介绍了关于使用vue写一个翻页的时间插件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Vue.js实现移动端短信验证码功能

    Vue.js实现移动端短信验证码功能

    现在的短信验证码一般为4位或6位,则页面中会相应的显示4个或6个文本框.好多网站需求都有此功能,今天小编给大家分享基于vue.js实现移动端短信验证码功能,需要的朋友参考下吧
    2017-03-03
  • vue实现聊天框自动滚动的示例代码

    vue实现聊天框自动滚动的示例代码

    本文主要介绍了vue实现聊天框自动滚动的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论