首页 > 其他分享 >学习vue3(二)

学习vue3(二)

时间:2022-11-01 19:56:32浏览次数:51  
标签:const reactive toRef 学习 person state vue3 obj

reactive

用来绑定复杂的数据类型 例如 对象 数组,他是不可以绑定普通的数据类型这样是不允许 会报错

绑定普通的数据类型 我们可以 使用昨天讲到ref

你如果用ref去绑定对象 或者 数组 等复杂的数据类型 我们看源码里面其实也是 去调用reactive

使用reactive 去修改值无须.value

reactive 基础用法

<template>
  <div>
    {{ person.name }}
  </div>
</template>
 
<script setup lang='ts'>
import { reactive } from 'vue'
let person = reactive({
   name:"小满"
})
person.name = "大满"
</script>
<style scoped>
</style>

  

数组异步赋值问题

这样赋值数据是变了,但是页面是不会变化的因为会脱离响应式,需要使用数组方法操作

<template>
  <div>
    {{ person }}
  </div>
</template>
 
<script setup lang='ts'>
import { reactive } from 'vue'
let person = reactive<number[]>([])
setTimeout(() => {
  person = [1, 2, 3]
  console.log(person);
  
},1000)
</script>
<style scoped>
</style>

解决方案1  使用push

<template>
  <div>
    {{ person }}
  </div>
</template>
 
<script setup lang='ts'>
import { reactive } from 'vue'
let person = reactive<number[]>([])
setTimeout(() => {
  const arr = [1, 2, 3]
  person.push(...arr)
  console.log(person);
  
},1000)
</script>
<style scoped>
</style>

方案2

包裹一层对象

<template>
  <div>
    {{ person }}
  </div>
</template>
 
<script setup lang='ts'>
import { reactive } from 'vue'
type Person = {
  list?:Array<number>
}
let person = reactive<Person>({
   list:[]
})
setTimeout(() => {
  const arr = [1, 2, 3]
  person.list = arr;
  console.log(person);
  
},1000)
</script>
<style scoped>
</style>

readonly

拷贝一份proxy对象将其设置为只读

<template>
  <div>
    {{ person.count }}
  </div>
</template>
 
<script setup lang='ts'>
import { reactive ,readonly} from 'vue'
const person = reactive({count:1})
const copy = readonly(person)
 
 //person.count++ //可以增加
 
 copy.count++   //只读不可以增加
</script>
<style scoped>
</style>

shallowReactive 

只能对浅层的数据 如果是深层的数据只会改变值 不会改变视图

<template>
  <div>
    <div>{{ state }}</div>
    <button @click="change1">test1</button>
    <button @click="change2">test2</button>
  </div>
</template>
 
 
<script setup lang="ts">
import { shallowReactive } from 'vue'
 
const obj = {
  a: 1,
  first: {
    b: 2,
    second: {
      c: 3
    }
  }
}
 
const state = shallowReactive(obj)
 
function change1() {
  state.a = 7  //可以改变视图
}
function change2() {
  state.first.b = 8  //不可以改变视图
  state.first.second.c = 9 //不可以改变视图
  console.log(state);
}
 
 
 
 
</script> 
 
 
<style>
</style>

  

toRef toRefs toRaw

toRef

如果原始对象是非响应式的就不会更新视图 数据是会变的

<template>
   <div>
      <button @click="change">按钮</button>
      {{state}}
   </div>
</template>
 
<script setup lang="ts">
import { reactive, toRef } from 'vue'
 
const obj = {
   foo: 1,
   bar: 1
}
 
 
const state = toRef(obj, 'bar')
// bar 转化为响应式对象
 
const change = () => {
   state.value++
   console.log(obj, state);
 
}
</script>

如果原始对象是响应式的是会更新视图并且改变数据的 

<template>
   <div>
      <button @click="change">按钮</button>
      {{state}}
   </div>
</template>
 
<script setup lang="ts">
import { reactive, toRef } from 'vue'
 
const obj = reactive({
   foo: 1,
   bar: 1
})
 
 
const state = toRef(obj, 'bar')
// bar 转化为响应式对象
 
const change = () => {
   state.value++
   console.log(obj, state);
 
}
</script>

更改person.age的值时,
通过ref(person.age)得到的age1不会改变,因为ref是复制,拷贝了一份新的数据值单独操作, 更新时相互不影响
通过toRef(person,‘age’)得到的age2会改变,因为 toRef是引用。它为源响应式对象上的某个属性创建一个 ref对象, 二者内部操作的是同一个数据值, 更新时二者是同步的

<template>
  <div>
    <button @click="change">按钮</button>
    <h1>{{age1}}</h1>
    <h1>{{age2}}</h1>
  </div>
</template>
 
<script setup lang="ts">
import { reactive,ref, toRef } from "vue";
let person =reactive( { name: "long",age:23 });

    let age1 = ref(person.age);
    let age2=toRef(person,'age')

    const change = () => {
      person.age++
    };

</script>

应用: 当要将 某个prop 的 ref 传递给复合函数时,toRef 很有用
useFeatureX函数需要使用props中的foo属性,且foo要为ref。 

  setup (props, context) {
    const length = useFeatureX(toRef(props, 'foo'))

    return {
      length
    }
  }

  

toRefs

可以帮我们批量创建ref对象主要是方便我们解构使用

<template>
  <div>
    <button @click="change">按钮</button>
    {{ foo }}
  </div>
</template>
 
<script setup lang="ts">
import { reactive, toRefs } from "vue";
const obj = reactive({
  foo: 1,
  bar: 1,
});

let { foo, bar } = toRefs(obj);

const change = () => {
  foo.value++;
  console.log(foo, bar);
};
</script>

 

toRaw

将响应式对象转化为普通对象

import { reactive, toRaw } from 'vue'
 
const obj = reactive({
   foo: 1,
   bar: 1
})
 
 
const state = toRaw(obj)
// 响应式对象转化为普通对象
 
const change = () => {
 
   console.log(obj, state);
 
}

  

————————————————
版权声明:本文为CSDN博主「小满zs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq1195566313/article/details/122768533  

  

 

  

  

  

 

标签:const,reactive,toRef,学习,person,state,vue3,obj
From: https://www.cnblogs.com/xiaobaibubai/p/16848936.html

相关文章

  • R机器学习:特征工程与特征选择的介绍
    两个月没更新了,没有其它理由,就是懒惰,间接持续性的懒惰,一直持续了2个月,简直懒惰!!!大家的好多的私信也没回就过期回不了了。请大家批评我!!!。看了很多高深的算法之后,实在是看不......
  • hadoop学习(2)
    HadoopYARN直接源于MRv1在几个方面的缺陷,扩展性受限、单点故障、难以支持MR之外的计算。多计算框架各自为战,数据共享困难。MR:离线计算框架,Storm:实时计算框架,Spark内存计......
  • 20201306吴龙灿第十二章学习笔记
    知识点归纳1.块设备I/O缓冲区什么是块设备:块设备是i/o设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据,例如硬......
  • Java学习笔记day2--循环结构
    **循环结构包括四个部分:初始化部分循环条件部分循环体部分迭代部分1>for循环for(初始化部分;循环条件部分;迭代条件......
  • 2022-10-31学习内容
    1.数据库版本升级1.1UserDBHelper.javaprivatestaticfinalintDB_VERSION=2;@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnew......
  • biogeme巢式logit选择学习
    #导入库```pythonimportpandasaspdimportcsvfrombiogemeimportmodelsimportbiogeme.biogemeasbioimportbiogeme.databaseasdbfrombiogeme.expressionsimpo......
  • Java学习笔记day2——循环结构综合例题(1个)
    //循环语句综合例题/*例题1:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为零时,结束程序。*/......
  • Java学习笔记day2--分支结构之switch
    /*switch(表达式){case常量1:语句1;//break;case常量2:语句2;//break;……default:语句;//break;说明:1.按......
  • 深度学习——目标检测基础知识
    一,anchors所谓​​anchors​​​,实际上就是一组由generate_anchors.py生成的矩形框。其中每行的4个值​​(x1,y1,x2,y2)​​​表矩形左上和右下角点坐标。9个矩形共有......
  • 深度学习目标检测——AP以及MAP
    AP计算概述知道了​​AP​​​的定义,下一步就是理解​​AP​​​计算的实现,理论上可以通过积分来计算​​AP​​​,公式如下:但通常情况下都是使用近似或者插值的方法来计算......