首页 > 其他分享 >Vue3.0

Vue3.0

时间:2024-04-26 15:47:06浏览次数:21  
标签:count return target value Vue3.0 key const

Vue2中的options API和Vue3.0中composition APIimage

options API示例
image
composition API是一组基于函数的API,可以更灵活的组织组件的逻辑
image
createAPP函数的第一个参数即composition API对象用于创建应用实例

 createApp({
      setup () {
	  const count=ref(0)
        return {
          count
        }        
      }
    }).mount('#app')

ref,reactive,watch,watchEffect,computed的使用示例

reactive 用于创建一个响应式的对象。

import { reactive } from 'vue';

const state = reactive({
  count: 0,
  double: computed(() => state.count * 2) // 依赖于 count 的计算属性
});

// 修改 state 对象的属性
state.count++;

watch 用于观察一个数据的变化,并在其变化时执行回调函数。

import { ref, watch } from 'vue';

const count = ref(0);

watch(count, (newValue, oldValue) => {
  console.log(`count 变化:${oldValue} -> ${newValue}`);
});

watchEffect 用于创建一个立即执行的响应式效果,并在其依赖的响应式数据变化时重新执行。

import { ref, watchEffect } from 'vue';

const count = ref(0);

watchEffect(() => {
  console.log(`count 的值为:${count.value}`);
});

Vue3编程注重面向过程编程,将过程抽象为一个函数,例如添加待办事项,首先有一个input,在输入敲击键盘Enter键时执行添加待办事项的方法,若Vue2中在data中声明input绑定的值,在输入敲击键盘Enter键时Object对象然后将对象存储起来,而用了Vue3的composition API之后input绑定的值和添加事件放在同一个函数中,编程如下,函数中仍可使用ref,reactive,watch,watchEffect,computed

// 1. 添加待办事项
const useAdd = todos => {
  const input = ref('')
  const addTodo = () => {
    const text = input.value && input.value.trim()
    if (text.length === 0) return
    todos.value.unshift({
      text,
      completed: false
    })
    input.value = ''
  }
  return {
    input,
    addTodo
  }
}
// 5. 存储待办事项
const useStorage = () => {
  const KEY = 'TODOKEYS'
  const todos = ref(storage.getItem(KEY) || [])
  watchEffect(() => {
    storage.setItem(KEY, todos.value)//监听todos.value,一旦todos.value重新改变便会重新再storage中设值
  })
  return todos
}
export default {
  name: 'App',
  setup () {
    const todos = useStorage()
    return {
      todos,
      ...useAdd(todos),
    }
  },
  directives: {
    editingFocus: (el, binding) => {
      binding.value && el.focus()
    }
  }
}

Vue3的响应式系统

Vue3中使用Proxy对象重写响应式系统,可以监听动态新增的属性,可以监听删除的属性,可以监听数组的索引和length属性
Proxy 可以用来拦截并定义对象的基本操作(比如属性查找、赋值、删除等)。通过 Proxy,你可以监视并对对象的操作进行自定义处理。
Object.defineProperty 用于在对象上定义新的属性,或修改现有属性的特性(比如可枚举性、可写性、可配置性等)。它只能针对单个属性进行拦截,而不能拦截整个对象的操作
Reflect 是 ES6 中引入的一个新的内置对象,常用get,set方法
响应原理在读取(GET操作)时,自动执行track()函数收集依赖,在修改(SET操作)时,自动执行trigger()函数来执行所有的副作

const isObject = val => val !== null && typeof val === 'object'
const convert = target => isObject(target) ? reactive(target) : target
const hasOwnProperty = Object.prototype.hasOwnProperty
const hasOwn = (target, key) => hasOwnProperty.call(target, key)

export function reactive (target) {
  if (!isObject(target)) return target

  const handler = {
    get (target, key, receiver) {
      // 收集依赖
      track(target, key)
      const result = Reflect.get(target, key, receiver)
      return convert(result)
    },
    set (target, key, value, receiver) {
      const oldValue = Reflect.get(target, key, receiver)
      let result = true
      if (oldValue !== value) {
        result = Reflect.set(target, key, value, receiver)
        // 触发更新
        trigger(target, key)
      }
      return result
    },
    deleteProperty (target, key) {
      const hadKey = hasOwn(target, key)
      const result = Reflect.deleteProperty(target, key)
      if (hadKey && result) {
        // 触发更新
        trigger(target, key)
      }
      return result
    }
  }

  return new Proxy(target, handler)
}

let activeEffect = null
export function effect (callback) {
  activeEffect = callback
  callback() // 访问响应式对象属性,去收集依赖
  activeEffect = null
}

let targetMap = new WeakMap()

export function track (target, key) {
  if (!activeEffect) return
  let depsMap = targetMap.get(target)
  if (!depsMap) {
    targetMap.set(target, (depsMap = new Map()))
  }
  let dep = depsMap.get(key)
  if (!dep) {
    depsMap.set(key, (dep = new Set()))
  }
  dep.add(activeEffect)
}

export function trigger (target, key) {
  const depsMap = targetMap.get(target)
  if (!depsMap) return
  const dep = depsMap.get(key)
  if (dep) {
    dep.forEach(effect => {
      effect()
    })
  }
}

自写响应式原理使用示例

    import { reactive, effect } from './reactivity/index.js'

    const product = reactive({
      name: 'iPhone',
      price: 5000,
      count: 3
    })
    let total = 0 
    effect(() => {
      total = product.price * product.count
    })
    console.log(total)

    product.price = 4000

Vite可用于构建Vue.js、React等应用程序,是一个现代化的构建工具

标签:count,return,target,value,Vue3.0,key,const
From: https://www.cnblogs.com/zhixy/p/18160031

相关文章

  • 点击菜单生成tabs(vue3.0)
    1.安装vuex npminstallvuex@next--save在main.js中引用vuex2.在main.js同级目录新建store/store.js文件 代码:import{createStore}from'vuex'exportdefaultcreateStore({ state:{ tabsList:[] }, mutations:{ addTab(state,tab){ //判断是否......
  • Vue — Vue面试题:Vue3.0 特性
    CompositionAPI(组合式API):CompositionAPI允许开发者将逻辑按照功能或者相关性进行组织,而不是按照选项的不同部分(如data、methods、computed等)来分散代码。这种方式更灵活、更易于复用和维护,特别适用于编写大型复杂的组件。基于Proxy的响应式系统:Vue3中的响应式系统基于ES6......
  • Vite+Vue3.0项目使用ant-design-vue <a-calendar>日期组件汉化
    antd的弹框、日期等默认为英文,要把英文转为中文请看下文:1.首先我们要在main.js中引入ant-design组件库并全局挂载:importAppfrom'./App'importAntdfrom'ant-design-vue';import'ant-design-vue/dist/antd.css';constapp=createApp(App);app.use(Antd);2.然......
  • Vue — Vue3.0状态管理工具Pinia
    一、什么是Pinia?Pinia是一个专门为Vue3设计的状态管理库。它的目标是提供一种简单、直观的方法来管理Vue应用的状态,同时充分利用Vue3的响应式系统和组合式API。Pinia主要特点包括:基于Vue3:Pinia是专门为Vue3设计的状态管理库,充分利用了Vue3的响应式系统......
  • Vue3.0云里雾里
    目录:一篇通识Vue3.01.OptionsAPI(选项式)和CompositionAPI(组合式)2.setupsetup语法糖 ref响应式数据 reactive只能定义对象类型的响应式数据(用情专一)toRefs解构计算属性computedwatch侦听WatchEffect标签的Ref属性组件上的ref就是获取组件实例 TS接口,泛型,自定义类......
  • 【 Vue 3】Vue3.0性能提升主要是通过哪几方面?
    1.编译阶段回顾Vue2,我们知道每个组件实例都对应一个watcher实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变,触发setter,则会通知watcher,从而使关联的组件重新渲染<template><divid="content"><pclass="text">节点</p>......
  • VUE3.0(一):模板语法及指令介绍
    模板语法Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。Vue的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进DOM的系统。结合响应系统,在应用状态改变时,Vue能够智能地计算出重新渲染组件的最小代价并应用到DOM......
  • VUE3.0(一):vue3.0简介
    Vue3入门指南什么是vueVue(发音为/vjuː/,类似view)是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue都可以胜任。vue3官方文......
  • Vue — Vue3.0快速掌握
    一.使用create-vue创建项目1.环境条件node版本在16.0以上2.创建vue3.0应用npminitvue@latest//创建npminstall//下载依赖3.项目目录和关键文件1.vite.config.js:项目的配置文件基于vite的配置2.package.接送:项目包文件核心依赖变成了Vue3.X和vite3.main.js:入......
  • 用Vue3.0 写过组件吗?如果想实现一个 Modal你会怎么设计?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、组件设计组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式现在有一个场景,点击新增与编辑都弹框出来进行填写,功能上大同小异,可能只是标题内容或者是显示的主体内容稍微不同这时候......