程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Vue2

  • Vue3

    • 初识Vue3
    • 组合式API
    • Vue3中的data数据
    • vue3 的 script标签
    • setup函数中执行顺序
    • toRefs() 与 toRef()
    • computed()
    • Vue3弱化this
      • 1. 访问 `data`
        • Vue2 使用 `this` 访问 `data`
        • Vue3 中的 `ref` 和 `reactive`
      • 2. 访问 `props`
        • Vue2 使用 `this` 访问 `props`
        • Vue3 中的 `defineProps`
      • 3. 访问 `computed`
        • Vue2 使用 `this` 访问 `computed`
        • Vue3 中的 `computed`
      • 4. 访问 `methods`
        • Vue2 使用 `this` 访问 `methods`
        • Vue3 中的 `setup` 函数
      • 5. 访问 `watch`
        • Vue2 使用 `this` 访问 `watch`
        • Vue3 中的 `watch`
      • 6. 访问生命周期钩子
        • Vue2 使用 `this` 访问生命周期钩子
        • Vue3 中的生命周期钩子
    • watch() 和 watchEffec()
    • define函数用法
    • defineExpose() 和 ref 属性
    • vue.config.js
    • 生命周期
    • Vue3全局API调用
    • 自定义 Hook
    • 传递数据(props)
    • 路由
    • pinia
    • 组件通信
    • getCurrentInstance() 和 nextTick()
    • Vue3 新组件
  • vue3 + TS 项目集成

  • Vue全家桶
  • Vue3
scholar
2024-09-01
目录

Vue3弱化this

# Vue3弱化this

在Vue3中,setup语法糖和组合式API的引入,的确改变了Vue的开发模式,使得this的使用变得不再必要或推荐。this通常在Vue2中用于访问组件实例的属性和方法,如data、props、computed、methods等等。而在Vue3中,这些内容的获取和使用方式发生了一些变化。

# 1. 访问 data

# Vue2 使用 this 访问 data

在Vue2中,你可以通过this来访问data中的响应式数据:

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    };
  },
  methods: {
    increment() {
      this.count++;
    }
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# Vue3 中的 ref 和 reactive

在Vue3中,setup语法中使用ref或reactive来定义响应式数据,然后直接在setup返回值中暴露这些数据供模板使用。

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup>
// 定义响应式数据
import { ref } from 'vue';

const count = ref(0);

// 定义方法
function increment() {
  count.value++;
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

解释:

  • Vue3中没有this的概念,你可以直接在setup中定义并操作响应式数据,并在模板中直接使用这些数据。

# 2. 访问 props

# Vue2 使用 this 访问 props

在Vue2中,props可以通过this来访问:

<template>
  <div>
    <h1>{{ title }}</h1>
  </div>
</template>

<script>
export default {
  props: {
    title: String
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13

# Vue3 中的 defineProps

在Vue3中,使用defineProps函数来获取props,并且直接在setup中使用,而不需要this。

<template>
  <div>
    <h1>{{ title }}</h1>
  </div>
</template>

<script setup>
// 获取 props
const props = defineProps({
  title: String
});
</script>
1
2
3
4
5
6
7
8
9
10
11
12

解释:

  • 在Vue3中,props通过defineProps函数获取,并且可以直接在setup中使用,而无需通过this访问。

# 3. 访问 computed

# Vue2 使用 this 访问 computed

在Vue2中,计算属性通过this来访问:

<template>
  <div>
    <p>Double Count: {{ doubleCount }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 2
    };
  },
  computed: {
    doubleCount() {
      return this.count * 2;
    }
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# Vue3 中的 computed

在Vue3中,使用computed函数来定义计算属性,并在模板中直接使用。

<template>
  <div>
    <p>Double Count: {{ doubleCount }}</p>
  </div>
</template>

<script setup>
// 使用 computed 定义计算属性
import { ref, computed } from 'vue';

const count = ref(2);
const doubleCount = computed(() => count.value * 2);
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13

解释:

  • 在Vue3中,计算属性不再需要通过this访问,而是直接通过computed函数定义,并在模板中使用。

# 4. 访问 methods

# Vue2 使用 this 访问 methods

在Vue2中,方法可以通过this来调用组件中的其他属性或方法:

<template>
  <div>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    };
  },
  methods: {
    increment() {
      this.count++;
    }
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# Vue3 中的 setup 函数

在Vue3中,方法直接在setup中定义,并且可以直接操作setup中的数据。

<template>
  <div>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup>
// 定义响应式数据和方法
import { ref } from 'vue';

const count = ref(0);

function increment() {
  count.value++;
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

解释:

  • 在Vue3中,方法直接在setup中定义,并可以操作setup中定义的响应式数据,无需通过this来访问。

# 5. 访问 watch

# Vue2 使用 this 访问 watch

在Vue2中,watch用于监听响应式数据的变化,并通过this访问这些数据:

<script>
export default {
  data() {
    return {
      count: 0
    };
  },
  watch: {
    count(newValue, oldValue) {
      console.log(`Count changed from ${oldValue} to ${newValue}`);
    }
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# Vue3 中的 watch

在Vue3中,watch函数可以直接在setup中使用,并且不需要this。

<script setup>
// 定义响应式数据并使用 watch 监听
import { ref, watch } from 'vue';

const count = ref(0);

watch(count, (newValue, oldValue) => {
  console.log(`Count changed from ${oldValue} to ${newValue}`);
});
</script>
1
2
3
4
5
6
7
8
9
10

解释:

  • 在Vue3中,watch函数直接在setup中使用,无需通过this访问数据。

# 6. 访问生命周期钩子

# Vue2 使用 this 访问生命周期钩子

在Vue2中,生命周期钩子如created、mounted等,通过this访问组件实例中的属性和方法。

<template>
  <div>Check the console for lifecycle logs.</div>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    };
  },
  created() {
    console.log('Component created, count is:', this.count);
  },
  mounted() {
    console.log('Component mounted');
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# Vue3 中的生命周期钩子

在Vue3中,使用onMounted、onCreated等函数来注册生命周期钩子,不需要this访问组件实例。

<template>
  <div>Check the console for lifecycle logs.</div>
</template>

<script setup>
// 定义响应式数据和使用生命周期钩子
import { ref, onMounted, onCreated } from 'vue';

const count = ref(0);

onCreated(() => {
  console.log('Component created, count is:', count.value);
});

onMounted(() => {
  console.log('Component mounted');
});
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

解释:

  • 在Vue3中,生命周期钩子使用特定的函数,如onMounted,这些函数直接操作setup中的数据,无需this。

总结

在Vue3中,this的概念被大大削弱,取而代之的是直接在setup函数中定义和使用响应式数据、计算属性、方法、props、watch等。这不仅简化了代码结构,也提升了可读性和维护性,同时消除了this绑定问题,让开发者更专注于逻辑实现。

编辑此页 (opens new window)
上次更新: 2025/01/30, 23:55:43
computed()
watch() 和 watchEffec()

← computed() watch() 和 watchEffec()→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式