在 Vue 2 中,this 关键字代表当前组件实例。在组件的选项对象中,this 可以用于访问组件实例的属性、方法以及 Vue 实例的一些特定方法。

在Vue3中,我们发现this是undefined,那我们真的没法使用this了吗?vu3给我们提供了一个getCurrentInstance函数: 用于获取当前组件实例。身上有个ctx属性有点类似this,通过代码可以看到如何使用。

组件实例身上还有个proxy属性也基本相同,proxy.xxx = xxxx修改数据后-是动态修改的(数据页面都更新)

建议:vue3中已经不想让大家使用this了,直接通过变量名取值也是很方便的,

当然有喜欢用this的也可以使用这种方式,不过目前看来取到的值是只读的。

<template>
  <div style="font-size: 14px">
    <div>{{myName1}}</div>
    <div>{{myName2}}</div>
    <div>{{myName3}}</div>
  </div>
</template>

<script lang="ts">
// vue3.0版本语法
import { defineComponent, getCurrentInstance, ref } from "vue";

export default defineComponent({
  name: "组件名",
  
  setup() {
    // console.log(this);// undefined
    
    // getCurrentInstance()获取当前组件实例, ctx是 vue3给我们提供的变量名
    // const { ctx } = getCurrentInstance()
    console.log('实例getCurrentInstance:',getCurrentInstance());
    
    // 我们利用改变对象名字的写法将改成_this
    const { ctx: _this } = getCurrentInstance()
    // 首先看看_this是什么
    console.log('ctx: _this:',_this);

    const myName1 = ref('测试_this1')
    const myName2 = ref('测试_this2')
    const myName3 = ref('测试myName3')
    // 还是要通过xxx.value改变值改变动态数据》才能动态更新
    const changeFun = () => {
      // vue3中已经不想让大家使用this了,直接通过变量名取值也是很方便的,
      // 当然有喜欢用this的也可以使用这种方式,不过目前看来取到的值是只读的。
      myName3.value = '改变后的myName3:'+ _this.myName1 + _this.myName2
    };
    // 3秒后 想通过_this改变组件内的变量值
    setTimeout(() => {
      // _this身上的 myName1 和 myName2 并不是一个ref对象 ,直接改变值也不会动态更新
      _this.myName1 += '+=使用_this'
      _this.myName2 += '+=使用_this'
      console.log(_this.myName1, _this.myName2);
      // 调用函数改变myName3的值
      changeFun()
    }, 3000)

    return {
      myName1,myName2,myName3,changeFun
    };
  },
});
</script>

初始页面:

看下getCurrentInstance身上有哪些属性:

看下ctx (_this)身上有哪些属性:

可以看到setup return 出来的myName1,myName2,myName3,changeFun 都能取到,

但是注意myName1,myName2,myName3并不是ref对象。所以直接写

_this.myName1 += '+=使用_this'

并不能动态改变值。

3秒后的页面及数据更新:

可以看到myName3.value的形式动态改变了值,而

_this.myName1 += '+=使用_this'

_this.myName2 += '+=使用_this'

console.log(_this.myName1, _this.myName2);

的打印结果并没有改变值。

如果换成const { proxy: _this } = getCurrentInstance(),

_this.xxx = xxxx 修改数据后可以是动态的。

欢迎关注我的原创文章:小伙伴们!我是一名热衷于前端开发的作者,致力于分享我的知识和经验,帮助其他学习前端的小伙伴们。在我的文章中,你将会找到大量关于前端开发的精彩内容。

学习前端技术是现代互联网时代中非常重要的一项技能。无论你是想成为一名专业的前端工程师,还是仅仅对前端开发感兴趣,我的文章将能为你提供宝贵的指导和知识。

在我的文章中,你将会学到如何使用HTML、CSS和JavaScript创建精美的网页。我将深入讲解每个语言的基础知识,并提供一些实用技巧和最佳实践。无论你是初学者还是有一定经验的开发者,我的文章都能够满足你的学习需求。

此外,我还会分享一些关于前端开发的最新动态和行业趋势。互联网技术在不断发展,新的框架和工具层出不穷。通过我的文章,你将会了解到最新的前端技术趋势,并了解如何应对这些变化。

我深知学习前端不易,因此我将尽力以简洁明了的方式解释复杂的概念,并提供一些易于理解的实例和案例。我希望我的文章能够帮助你更快地理解前端开发,并提升你的技能。

如果你想了解更多关于前端开发的内容,不妨关注我的原创文章。我会不定期更新,为你带来最新的前端技术和知识。感谢你的关注和支持,我们一起探讨交流技术共同进步,期待与你一同探索前端开发的奇妙世界!

Logo

前往低代码交流专区

更多推荐