首页 > 其他分享 > VUE的setup、ref、reactive和代理数据的使用

VUE的setup、ref、reactive和代理数据的使用

时间:2023-03-15 23:32:53浏览次数:56  
标签:count VUE const 对象 setup reactive user ref

一. VUE的setup、ref、reactive和代理数据的使用

1.1 setup和ref

先来实现一个简单的点击按钮,数字增加的案例:

需求:页面打开后可以直接看到一个数据,点击按钮后,该数据可以发生变化

1.1.1 Vue2的方法实现:

Html先定义差值表达式来实时的渲染数值,绑定一个按钮事件。

<h2>setup和ref的基本使用</h2>
<h3>{{count}}</h3>
<button @click="updateCount">更新数据</button>

Js:

data(){
    return{
        count:0
    }
},
    methods:{
        updateCount(){
            this.count++;
        }
    }

成功实现了这个需求

1.1.2 Vue3的方法实现:

1.1.3 setup 的实现

  • 新的option, 所有的组合API函数都在此使用, 只在初始化时执行一次
  • 函数如果返回对象, 对象中的属性或方法, 模板中可以直接使用

将上面的vue2代码改为Vue3实现,我们使用setup函数。

如下:发现无法实现的count的加减操作:

  setup(){
    let count = 0

    function updateCount(){
      count++
    }
    //返回的是一个对象。
    return{
      count,updateCount
    }
  }

分析原因:

此时的数据并不是响应式的数据(响应式数据:数据变化,页面跟着渲染变化)。

1.1.4 ref的实现

  • 作用: 定义一个数据的响应式
  • 语法: const xxx = ref(initValue):
    • 创建一个包含响应式数据的引用(reference)对象
    • js中操作数据: xxx.value
    • 模板中操作数据: 不需要.value
  • 一般用来定义一个基本类型的响应式数据

报错的原因:count 是一个 Ref 对象,对象是不能进行++的操作。

在上面引用ref:

import { defineComponent ,ref} from 'vue';

因为ref返回的是ref对象。所以我们要对他的value进行加减。如果我们直接对count进行加减的话就发调用。(因为它是对象)

setup(){
    // let count = 0
    const count = ref(0)
    function updateCount(){
        count.value++
    }
    //返回的是一个对象。
    return{
        count,updateCount
    }

1.2 reactive

  • 作用: 定义多个数据的响应式
  • const proxy = reactive(obj): 接收一个普通对象然后返回该普通对象的响应式代理器对象
  • 响应式转换是“深层的”:会影响对象内部所有嵌套的属性
  • 内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据都是响应式的

需求:显示用户的相关信息,点击按钮,可以更新用户的相关信息数据

template内容:

<template>
  <h2>上进小菜猪</h2>
  <h3>名字:{{ user.name }}</h3>
  <h3>年龄:{{ user.age }}</h3>
  <h3>媳妇:{{ user.wife }}</h3>
</template>

setup:

const user = reactive({
name:"小明",
age:20,
wife:{
name:"小猪",
age:21,
cars:["奔驰","宝马","奥迪"]
}
})

return{
user,

}

效果:

image-20230314194416743

加入一个新按钮:

<button @click="updataUser"> 点击</button>

写updataUser监听的函数,改变user对象里的参数:

const updataUser = ()=>{
      user.name="上进小菜猪"
      user.age=21
    }

放行:updataUser

return{
user,updataUser

}

把数据变成响应式的数据 返回的是一个 Proxy 的代理对象,被代理的目标对象就是 obj 对象 user 现在是代理对象,obj 是目标对象 user 对象的类型是 proxy。

如下使用方式:

setup(){
const obj = reactive({
name:"小明",
age:20,
wife:{
name:"小猪",
age:21,
cars:["奔驰","宝马","奥迪"]
}
})

const user = reactive(obj)

const updataUser = ()=>{
user.name="上进小菜猪"
user.age=21
}

1.2.1 操作代理数据实现数据的更改

将代理对象设置为any类型。

const user = reactive<any>(obj)

在操作添加操作过程中,加入性别:

const updataUser = ()=>{
user.name="上进小菜猪"
user.age=21
user.sex="男"
}

运行发现,可以将性别成功的渲染到用户页面。

删除代理对象的值:

delete user.wife

总结:如果操作代理对象,目标对象中的数据也会随之变化,同时如果想要在操作数据的时候,界面也要跟着重新更新渲染那么也是操作代理对象

标签:count,VUE,const,对象,setup,reactive,user,ref
From: https://blog.51cto.com/u_15568258/6123622

相关文章

  • Vue 代理服务器___Vue 跨域通过Axios 的ajax方式的get请求获取数据
    Vue代理服务器___Vue跨域通过Axios的ajax方式的get请求获取数据1、说明1.1:配置2台本地服务器说明:node_modules为vue脚手架        package.json为静态数据......
  • Vue封装的过度与动画
    Vue封装的过度与动画1:知识点:##Vue封装的过度与动画1.作用:在插入、更新或移除DOM元素时,在合适的时候给元素添加样式类名。2.图示:<imgsrc="https://img04.sogoucdn......
  • Vue.js 计算属性(p18~p20)
    视频18视频19视频20姓名案例_插值语法实现<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>姓名案例_插值语法实现</title> <!--引入Vue-->......
  • 后端基础——详解setup与hold
    一,基础 在数字集成电路中,通常用建立时间(setuptime)、保持时间(holdtime)、传输延迟时间(propagationdelaytime)、最高时钟频率(maximumclockfrequency)等几个参数具体描......
  • Vue.js 事件处理-事件修饰符
    视频<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>事件修饰符</title> <!--引入Vue--> <scripttype="text/javascript"src="../js/vue.j......
  • Vue.js 事件处理-事件的基本使用v-on传参
    视频<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>事件的基本使用</title> <!--引入Vue--> <scripttype="text/javascript"src="../js/v......
  • vue的路由实现及sass
    day27vue的路由实现及sass路由前端路由根据对应的url地址来渲染不同的内容前端路由的分类页面路由(通过页面的跳转来完成对应的切换(刷新页面))hash路由(通过对应的......
  • Vue模板语法 && 数据绑定
    模板语法Vue模板语法包括两大类插值语法功能:用于解析标签体内容。写法:{{xxx}},xxx是js表达式,可以直接读取倒data中所有区域。指令语法功能:用于解析标签(包括:标签属性......
  • vue中 给企业微信自建应用授权(静默授权,手动授权,扫码授权)
    在web开发中,会遇到通过企业微信授权的形式进行免登录或快速登录的需求。如果该应用是企业微信自建应用,那可以在管理平台获取到相应的appId和agentid等必要参数。企业微信......
  • Vue.js 数据代理-回顾Object.defineProperty方法
    视频<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>回顾Object.defineproperty方法</title> </head> <body> <scripttype="text/javascript"......