Vue2 this直接获取data和methods原理解析

下面是“Vue2 this直接获取data和methods原理解析”的完整攻略。

Vue2 this直接获取data和methods原理解析

在Vue2中,我们可以直接通过this关键字获取组件实例里的datamethods。这样写起来会更加方便简洁。那么在底层,Vue2是如何实现this直接获取datamethods的呢?

data

在Vue2中,当我们使用data属性定义一个组件的数据时,实际上这个data是一个对象。在Vue2的初始化阶段,会根据这个data对象生成一个响应式的对象。我们可以使用Object.defineProperty来实现:

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function reactiveGetter() {
      return val
    },
    set: function reactiveSetter(newVal) {
      val = newVal
      // 在这里可以触发组件重新渲染的逻辑
    }
  })
}

function observe(data) {
  if (!data || typeof data !== 'object') {
    return
  }

  Object.keys(data).forEach(key => {
    defineReactive(data, key, data[key])
  })
}

class Vue {
  constructor(options) {
    this._data = options.data
    observe(this._data)
  }
}

const vm = new Vue({
  data: {
    message: 'hello world'
  }
})

console.log(vm.message) // 此时的输出结果为 'hello world'

我们看到,在Vue类的构造函数中,我们将传入的data对象赋值给this._data属性,然后调用了observe函数对this._data进行了响应式处理。defineReactive函数中的getset函数分别会在访问和修改响应式对象时被调用。这样一来,我们就可以通过this直接访问到Vue实例的data属性了。

class Vue {
  constructor(options) {
    this._data = options.data
    observe(this._data)
  }

  created() {
    console.log(this.$data.message) // 此时的输出结果为 'hello world'
  }
}

const vm = new Vue({
  data: {
    message: 'hello world'
  }
})

methods

data属性类似,我们也可以通过methods属性来定义组件的方法。在Vue2的初始化阶段,也会将methods对象里定义的方法添加到组件实例里。我们可以使用Object.defineProperty来实现:

function proxy(vm, sourceKey, key) {
  Object.defineProperty(vm, key, {
    enumerable: true,
    configurable: true,
    get: function proxyGetter() {
      return vm[sourceKey][key]
    },
    set: function proxySetter(newVal) {
      vm[sourceKey][key] = newVal
    }
  })
}

class Vue {
  constructor(options) {
    this._data = options.data
    this._methods = options.methods

    observe(this._data)

    Object.keys(this._methods).forEach(key => {
      proxy(this, '_methods', key)
    })
  }

  created() {
    console.log(this.hello()) // 此时的输出结果为 'hello world'
  }
}

const vm = new Vue({
  data: {
    message: 'hello world'
  },
  methods: {
    hello() {
      return this.message
    }
  }
})

我们看到,在Vue类的构造函数中,我们将传入的methods对象赋值给this._methods属性,并调用了proxy函数将所有的methods属性都添加到组件实例上。这样一来,我们就可以通过this直接访问到Vue实例的methods属性了。

class Vue {
  constructor(options) {
    this._data = options.data
    this._methods = options.methods

    observe(this._data)

    Object.keys(this._methods).forEach(key => {
      proxy(this, '_methods', key)
    })
  }

  created() {
    console.log(this.hello()) // 此时的输出结果为 'hello world'
    console.log(this.$methods.hello()) // 这种写法也是可以的
  }
}

const vm = new Vue({
  data: {
    message: 'hello world'
  },
  methods: {
    hello() {
      return this.message
    }
  }
})

通过以上两个示例,我们了解到了Vue2 this直接获取datamethods的原理和实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue2 this直接获取data和methods原理解析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue收集表单数据和过滤器总结

    Vue收集表单数据和过滤器总结 本文主要介绍Vue中如何收集表单数据和使用过滤器进行数据处理。 收集表单数据 v-model指令 v-model指令可以实现双向数据绑定,将表单元素的值与Vue实例的数据属性进行绑定。当表单元素的值发生变化时,对应的数据属性也会更新。 示例一: <template> <div> <input ty…

    Vue 2023年5月27日
    00
  • 10分钟上手vue-cli 3.0 入门介绍

    10分钟上手vue-cli 3.0 入门介绍 什么是vue-cli 3.0 vue-cli是一套通过命令行工具帮助我们快速创建Vue.js项目开发环境的脚手架工具。其3.0版本带来了更好的用户体验和更快的构建速度。 安装vue-cli 3.0 首先,我们需要安装node.js和npm。安装完毕后,打开命令行窗口,输入以下命令进行全局安装vue-cli: np…

    Vue 2023年5月27日
    00
  • vue输入框使用模糊搜索功能的实现代码

    下面是关于使用Vue实现输入框模糊搜索的攻略。 1. 环境准备 首先需要准备一个Vue开发环境。我们可以使用Vue CLI进行快速构建,也可以手动搭建一个Vue项目。 2. 安装依赖 在项目根目录下通过命令行安装axios和element-ui: npm install axios element-ui 3. 创建输入框组件 使用<el-input&g…

    Vue 2023年5月27日
    00
  • 深入了解vue-router原理并实现一个小demo

    介绍 Vue-Router 是 Vue.js 官方的路由管理器,它和 Vue.js 核心深度集成,让构建单页面应用变得易如反掌。Vue-Router 提供了两种模式:Hash 模式和 History 模式。Hash 模式下,URL 中的 Hash 值(#)用来模拟传统意义上的路由,而在 History 模式下,使用了 HTML5 History API 中新…

    Vue 2023年5月28日
    00
  • 详解vue.js移动端配置flexible.js及注意事项

    详解vue.js移动端配置flexible.js及注意事项 介绍 随着移动端市场的扩大,越来越多的网站和应用开始关注移动端的适配问题。Vue.js作为一种前端开发的流行框架,也需要考虑移动端适配问题。本文将介绍如何在Vue.js中配置flexible.js实现移动端适配,以及在使用过程中需要注意的细节。 flexible.js介绍 flexible.js是淘…

    Vue 2023年5月28日
    00
  • vue-router 4使用实例详解

    下面是“vue-router 4使用实例详解”的完整攻略。 一、前置知识: Vue.js框架的基础使用,Vue组件、生命周期等基础知识。 Vue-Router的基础使用方法,可以参考Vue-Router官网。 对ES6的基础了解。 二、vue-router 4使用实例 1. 安装 vue-router 使用npm安装Vue Router: npm insta…

    Vue 2023年5月28日
    00
  • Vue 组件注册实例详解

    Vue 组件注册实例详解 在 Vue 中,组件是构建应用程序的核心部分之一。如果我们想要将一个特定的组件或指令作为全局组件注册,我们可以使用 Vue.component() 方法。另外,我们还可以通过在一个父组件中使用 components 选项来在该组件内部注册一个局部组件。 注册全局组件 如果我们想要在全部的组件中都使用一个组件,那么我们应该将它注册成为…

    Vue 2023年5月28日
    00
  • vue-resourse将json数据输出实例

    下面是详细讲解“vue-resource将json数据输出实例”的完整攻略: 1. 什么是vue-resource vue-resource是Vue.js官方提供的一个通信插件,它支持浏览器内置的XMLHttpRequest和JSONP,可以很方便地发起http请求并处理响应。 2. 安装vue-resource 可以使用npm命令安装vue-resourc…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部