当前位置:首页 > VUE

vue实现数据

2026-02-10 14:51:02VUE

Vue 数据绑定与响应式实现

Vue 通过数据绑定和响应式系统实现数据的动态更新。核心机制包括数据劫持、依赖收集和派发更新。

数据绑定基础

在 Vue 中,可以通过 v-model 指令实现双向数据绑定:

<input v-model="message">
<p>{{ message }}</p>
data() {
  return {
    message: 'Hello Vue!'
  }
}

响应式原理

Vue 2.x 使用 Object.defineProperty 实现响应式:

function observe(data) {
  if (!data || typeof data !== 'object') return
  Object.keys(data).forEach(key => {
    let value = data[key]
    Object.defineProperty(data, key, {
      enumerable: true,
      configurable: true,
      get() {
        console.log('收集依赖')
        return value
      },
      set(newVal) {
        if (newVal !== value) {
          console.log('触发更新')
          value = newVal
        }
      }
    })
  })
}

Vue 3.x 改用 Proxy 实现:

function reactive(target) {
  return new Proxy(target, {
    get(target, key, receiver) {
      const result = Reflect.get(target, key, receiver)
      track(target, key) // 依赖收集
      return result
    },
    set(target, key, value, receiver) {
      const oldValue = target[key]
      const result = Reflect.set(target, key, value, receiver)
      if (oldValue !== value) {
        trigger(target, key) // 触发更新
      }
      return result
    }
  })
}

数组响应式处理

Vue 对数组方法进行了特殊处理:

vue实现数据

const arrayProto = Array.prototype
const arrayMethods = Object.create(arrayProto)

['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(method => {
  const original = arrayProto[method]
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args)
    const ob = this.__ob__
    ob.dep.notify() // 触发更新
    return result
  }
})

计算属性与侦听器

计算属性基于响应式依赖进行缓存:

computed: {
  reversedMessage() {
    return this.message.split('').reverse().join('')
  }
}

侦听器适合执行异步或开销较大的操作:

watch: {
  message(newVal, oldVal) {
    console.log(`消息从 ${oldVal} 变为 ${newVal}`)
  }
}

组件间数据传递

父组件向子组件传递数据:

vue实现数据

<child-component :prop-name="parentData"></child-component>

子组件向父组件发射事件:

this.$emit('event-name', payload)

状态管理(Vuex)

对于复杂应用状态管理:

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  },
  getters: {
    doubleCount: state => state.count * 2
  }
})

组合式API(Vue 3)

Vue 3 的 setup 函数提供更灵活的数据管理:

import { ref, reactive, computed } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const state = reactive({
      name: 'Vue 3'
    })

    const double = computed(() => count.value * 2)

    function increment() {
      count.value++
    }

    return {
      count,
      state,
      double,
      increment
    }
  }
}

标签: 数据vue
分享给朋友:

相关文章

vue实现倒计时

vue实现倒计时

Vue 实现倒计时的基本方法 使用 setInterval 和响应式数据 在 Vue 组件中定义一个响应式变量(如 countdown),通过 setInterval 每秒更新数值。组件销毁时清除…

vue实现星星

vue实现星星

实现星星评分的Vue组件 使用Vue实现星星评分功能可以通过组件化方式完成,以下是一个完整的实现方案: 模板部分 <template> <div class="star-ra…

vue datepicker 实现

vue datepicker 实现

实现 Vue Datepicker 的基本方法 在 Vue 项目中实现日期选择功能,可以使用第三方库如 vue-datepicker 或 v-calendar。以下是两种常见实现方式: 安装 vu…

vue实现博客

vue实现博客

Vue 实现博客的基本步骤 使用 Vue.js 实现一个博客系统可以分为前端和后端两部分。以下是基于 Vue 的前端实现方案,后端可以选择 Node.js、Django 或其他框架。 项目初始化…

vue computed实现

vue computed实现

计算属性的基本用法 在Vue中,计算属性通过computed选项定义,用于声明依赖于其他属性的动态值。计算属性基于它们的依赖进行缓存,只有依赖发生变化时才会重新计算。 new Vue({ da…

vue实现selectable

vue实现selectable

Vue 实现可选择的 Select 组件 在 Vue 中实现一个可选择的 Select 组件,可以通过以下几种方式: 使用原生 HTML select 元素 <template>…